关于如何将值传递到 GLSL 程序中,我已经搜索、阅读并尝试了许多不同的示例。但可悲的是,每次尝试都失败了:(
我打算做的很简单:只是在我的 Android 应用程序中打开一点 gl 3d 动画。由于我的 GUI 设计,我更喜欢使用 TextureView 作为 OpenGL Surface。我找到了一些非常适合我的项目的代码。
但我的问题似乎完全在这个例子中。
当我编译并运行它时,它完全按照它应该做的事情做。在屏幕上绘制一个三角形。
然后我像这样修改了顶点着色器:
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
with glUniform1f
,我能实现的唯一结果就是连续OpenGL Error 0x502
输出。不再有三角形,因为着色器脚本不会接收到1.5f
并且将使用值 0 来扩展它。
我真的希望有人能给我解释一下,如何完成这项工作。因为它是如此基本的东西,所以我认为我在这里遗漏了一些非常明显的东西。