【发布时间】: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,..)、glGetActiveAttrib和glGetActiveUniform可用于获取所有未从着色器优化的变量名称的列表。进行自定义错误检查非常方便。