之前看过android平台下OpenGL ES 3.0绘制圆点、直线和三角形这篇blog,对于顶点着色器和片元着色器的代码不是很理解,这里算是做个笔记备忘吧
1.先看顶点着色器的代码:
private String vertextShader =
"#version 300 es \n" +
"layout (location = 0) in vec4 vPosition;\n"
+ "layout (location = 1) in vec4 aColor;\n"
+ "out vec4 vColor;\n"
+ "void main() { \n"
+ "gl_Position = vPosition;\n"
+ "gl_PointSize = 20.0;\n"
+ "vColor = aColor;\n"
+ "}\n";
如上,我们得到的信息如下,我们使能了2个顶点属性(参考blog:顶点属性理解),一个是顶点坐标,一个是顶点颜色,这个和后面onDrawFrame
代码是能够对应上的,如下:
public void onDrawFrame(GL10 gl) {
GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);
//准备坐标数据
GLES30.glVertexAttribPointer(0, POSITION_COMPONENT_COUNT, GLES30.GL_FLOAT, false, 0, vertexBuffer);
//启用顶点的句柄,总共有16组属性,这里使能第0组
GLES30.glEnableVertexAttribArray(0);
//绘制三角形颜色, 这里为"1"则使能目标颜色,否则是纯黑色
//启用颜色属性,总共有16组属性,这里使能第1组
GLES30.glEnableVertexAttribArray(1);
GLES30.glVertexAttribPointer(1, 4, GLES30.GL_FLOAT, false, 0, colorBuffer);
GLES30.glDrawArrays(GLES30.GL_POINTS, 0, 3);
//禁止顶点数组的句柄
GLES30.glDisableVertexAttribArray(1);
}
GLES30.glVertexAttribPointer
和GLES30.glEnableVertexAttribArray
分别对应的是配置和使能相应的顶点属性
还有代码里面的gl_Position
和gl_PointSize
都是对应的opengl的内建变量,而vPosition
和aColor
是用户的自定义变量,很明显以gl_***
开头的内建变量你是不能瞎改的,否则肯定出问题,而用户自定义的变量则没关系,这里的gl_Position
很明显指的是顶点的坐标,而gl_PointSize
对应的是顶点的大小(一个顶点需要占用多少个像素),还有个变量是aColor和vColor,啥意思呢,就是指顶点着色器传入的颜色属性(colorBuffer),经过顶点着色器后的输出变量是vColor,这个变量会进一步传递到片元着色器中。
1.片元着色器的代码:
private String fragmentShader =
"#version 300 es \n" +
"precision mediump float;\n"
+ "in vec4 vColor;\n"
+ "out vec4 fragColor;\n"
+ "void main() { \n"
+ "fragColor = vColor; \n"
+ "}\n";
这儿的片元着色器很简单,对应的就是指顶点着色器输出的变量传递到片元着色器,片元着色器处理完成后以fragColor变量输出给到后续的步骤处理
特别需要留意的一点,片元着色器中的输入变量vColor和顶点着色器的输出变量vColor必须是完全一样的,这很好理解