我已经搜索,阅读并尝试了许多关于如何将值传递给GLSL程序的不同示例。但遗憾的是,每次尝试都是失败的:(
我打算做的很简单:在我的Android应用程序中只需要一个小小的开放式3D动画。由于我的GUI设计,我更喜欢使用TextureView作为OpenGl Surface。我找到了一些适合我项目的代码。
但我的问题似乎完全在this example内。
当我编译并运行它时,它确实完成了应该做的事情。在屏幕上绘制一个三角形。
然后我像这样修改了顶点着色器:
final String vertexShaderSource =
"attribute vec4 position;\n" +
"attribute float myValue;\n" +
"void main () {\n" +
"vec4 oo;\n"+
"oo[0] = position[0];\n"+
"oo[1] = position[1] * myValue;\n"+
"oo[2] = position[2];\n"+
"oo[3] = position[3];\n"+
"gl_Position = oo;\n" +
"}";
现在,我想将值传递给属性myValue
。
所以这是我对run方法的修改。
public void run() {
initGL();
int attribPosition = GLES20.glGetAttribLocation(mProgram,
"position");
checkGlError();
int valuePosition = GLES20.glGetAttribLocation(mProgram,
"myValue");
checkGlError();
System.out.println("att id:"+ attribPosition
+ " val id:" + valuePosition);
//[...]
while (true) {
checkCurrent();
mVertices.position(0);
GLES20.glVertexAttribPointer(attribPosition, 3,
GLES20.GL_FLOAT, false, 0, mVertices);
checkGlError();
GLES20.glUniform1f(valuePosition, 1.5f);
checkGlError();
//[...]
}
}
根据我的理解,这应该在y轴上扩展三角形,因子为1.5f。但它没有用。 我的调试行的输出是:
I/System.out(22427): att id:1 val id:0
所以这些应该是正确的位置,因为它们都没有-1个内容。
但是,通过将值1.5f
传递给myValue
glUniform1f
,我可以实现的唯一结果就是连续OpenGL Error 0x502
输出。没有三角形,因为着色器脚本不会收到1.5f
,并将使用值0来展开它。
我真的希望有人能解释我,如何完成这件事。因为它是如此根本的东西,我想我在这里遗漏了一些非常明显的东西。
答案 0 :(得分:6)
您正在混合attribute
和uniform
变量的概念。
由于您在着色器中将myValue
变量声明为attribute
,因此您需要使用glVertexAttrib()
设置值:
glVertexAttrib1f(valuePosition, 1.5f);
如果您希望它是uniform
,请将顶点着色器中的声明更改为:
uniform float myValue;
以及获取该位置的电话:
int valuePosition = GLES20.glGetUniformLocation(mProgram, "myValue");
两种解决方案都有效。顾名思义,uniform
变量对于变化不大的值是理想的,即理想情况下它们对于整个帧保持不变。 attribute
变量对于在渲染帧时频繁更改的值更有效。
答案 1 :(得分:1)
在通过glUniform1f
设置制服之前,您需要申报制服。因此,请使myValue
统一。
uniform float myValue;
接下来你需要它的位置来绑定一个值。您可以使用glGetUniformLocation
函数执行此操作。
int valuePosition = GLES20.glGetUniformLocation(mProgram, "myValue");
最后,使用glUniform
函数为该位置设置制服。
GLES20.glUniform1f(valuePosition, 0.5f);
即使使用属性,您也可以获得相同的结果。属性对于不断变化的值是有效的,而制服对于变化较小的值是有效的。
答案 2 :(得分:0)
尝试修改以下内容:
"attribute float myValue;\n"
- >
"uniform float myValue;\n"
和
int valuePosition = GLES20.glGetAttribLocation(mProgram, "myValue");
- > int valuePosition = GLES20.glGetUniformLocation(mProgram, "myValue");
另外,请查看以下文档页面,其中显示了更清晰的翻译和缩放顶点的方法。
http://developer.android.com/reference/android/opengl/Matrix.html