【问题标题】:Opengl es 2.0 trying to pass a float value to fragment shader androidOpengl es 2.0试图将浮点值传递给片段着色器android
【发布时间】:2014-12-18 00:26:53
【问题描述】:

如何将浮点值传递给片段着色器?

这是我在 android 上的代码:

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

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

这是我的着色器:

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" +
        "}";

您可以在片段着色器中看到 if 语句,这是我尝试检查是否通过 1.0 它应该做纹理否则使用颜色。

【问题讨论】:

  • 对不起,glGetAttribLocation 的哪一部分我有错字
  • 真的……可能是我瞎了对不起哪个参数……程序是程序的句柄,uUseTexture在片段着色器中同名……
  • 但是 ... glGetUniformLocation != glGetAttribLocation ... 避免此类错误:始终检查 gl 错误 ... 我很确定 aUseTexture == -1
  • 感谢指正,非常感谢。
  • 仅供参考,glGetProgramiv(..,GL_ACTIVE_*S,..)glGetActiveAttribglGetActiveUniform 可用于获取所有未从着色器优化的变量名称的列表。进行自定义错误检查非常方便。

标签: android opengl-es shader


【解决方案1】:

您可能对“统一变量”使用了错误的函数调用。尝试 glGetUniformLocation() 如下:

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

此外,浮点测试 (uUseTexture != 1.0) 可能并非始终可靠。您可能希望使用整数类型。

【讨论】:

    【解决方案2】:

    据我所知,您必须先通过顶点着色器将值传递给片段着色器。例如在顶点着色器的顶部添加“uniform float uUseTexture_in;\n”和“varying float uUseTexture;\n”,在主函数中添加“uUseTexture = uUseTexture_in;”。你的着色器应该可以工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多