LittleFunny
LittleFunny

Reputation: 8375

Opengl es 2.0 trying to pass a float value to fragment shader android

How can I pass a float value to fragment shader ?

This is my code on android:

int aUseTexture = GLES20.glGetAttribLocation(program, "uUseTexture");

        GLES20.glUniform1f(aUseTexture, 1.0f);
        GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);

Here is my shader:

String verticesShader =
        "uniform mat4 uScreen;\n" +    
        "attribute vec2 aPosition;\n" +
        "attribute vec3 aColor;\n" +
        "attribute vec2 aTexPos; \n" +
        "varying vec2 vTexPos; \n" + 
        "varying vec3 vColor;\n" +
        "void main() {\n" +
        " vTexPos = aTexPos; \n" +  
        " gl_Position = uScreen * vec4(aPosition.xy, 0.0, 1.0);\n" +
        "  vColor = aColor;\n" +
        "}";

      // Our fragment shader. Just return vColor.
      // If you look at this source and just said 'WTF?', remember
      // that all the attributes are defined in the VERTEX shader and
      // all the 'varying' vars are considered OUTPUT of vertex shader
      // and INPUT of the fragment shader. Here we just use the color
      // we received and add a alpha value of 1.
      String fragmentShader =
        "uniform float uUseTexture; \n" +
        "uniform sampler2D uTexture;\n" +
        "precision mediump float;\n"+
        "varying vec2 vTexPos; \n" +
        "varying vec3 vColor;\n" + 
        "void main(void)\n" +
        "{\n" + 
        " if ( uUseTexture != 1.0 ) \n" +
        "  gl_FragColor = vec4(vColor.xyz, 1); \n" +
        " else \n" +
        "  gl_FragColor = texture2D(uTexture, vTexPos); \n" +
        //"  gl_FragColor = vec4(vColor.xyz, 1);\n" +
        "}";

You can see the if statement in the fragment shader , that is the one i tried to check if i pass in 1.0 it should do texture else use color.

Upvotes: 3

Views: 2955

Answers (2)

user3368148
user3368148

Reputation: 31

You are probably using the wrong function call for "uniform variable". Try glGetUniformLocation() as follow:

int aUseTexture = GLES20.glGetUniformLocation(program, "uUseTexture"); 

Also, the floating point testing (uUseTexture != 1.0) may not be always reliable all the time. You may want to use an integer type.

Upvotes: 1

AronD
AronD

Reputation: 1

As far as I know you have to pass the value through the vertex shader before it can get to the fragment shader. e.g. add "uniform float uUseTexture_in; \n" and "varying float uUseTexture; \n" at the top of the vertex shader, in the main function add "uUseTexture = uUseTexture_in;". And your shader should work

Upvotes: 0

Related Questions