我正在尝试学习OpenGL ES 2.0,并且想知道“管理”着色器的最常见做法是什么。
我之所以问这个问题,是因为在我发现的示例中(例如与android sdk一起提供的API Demo中包含的示例),我通常会看到GLRenderer类中的所有内容,而我希望将它们分开,这样我就可以拥有例如,一个GLImage对象,无论何时我想绘制带纹理的四边形(我现在仅专注于2D),都可以重用,就像我在OpenGL ES 1.0代码中一样。在我发现的几乎每个示例中,着色器仅定义为类属性。例如:
public class Square {
public final String vertexShader =
"uniform mat4 uMVPMatrix;\n" +
"attribute vec4 aPosition;\n" +
"attribute vec4 aColor;\n" +
"varying vec4 vColor;\n" +
"void main() {\n" +
" gl_Position = uMVPMatrix * aPosition;\n" +
" vColor = aColor;\n" +
"}\n";
public final String fragmentShader =
"precision mediump float;\n" +
"varying vec4 vColor;\n" +
"void main() {\n" +
" gl_FragColor = vColor;\n" +
"}\n";
// ...
}
如果其中一些问题愚蠢,我会先道歉,但是我以前从未使用过着色器。
1)上面的代码是定义着色器(公共最终类属性)的常用方法吗?
2)我应该单独安排着色器课程吗?
3)如果在使用着色器的类之外定义了着色器,我将如何知道其属性的名称(例如,以下代码中的“ aColor”),以便可以绑定它们?
colorHandle = GLES20.glGetAttribLocation(program, "aColor");