in out与attribute varying
在OpenGL3.0后attribute和varying就被in和out代替了,但是在Android中为了兼容还很很多用attribute和varying的这里我就解释下这两个关键字
attribute
attribute变量是只能在vertex shader中使用的变量,一般用attribute变量来表示一些顶点的数据,像我们写的三角形中就表示顶点的坐标。
varying
varying变量是vertex shader和fragment shader之间做数据传递用的。
val vertexShaderCode =
"layout (location = 0) attribute vec3 a_Position;"+
"layout (location = 1) attribute vec3 aColor;"+
"varying vec3 vertexColor;"+
"void main() {" +
" gl_Position = vec4(a_Position, 1.0);" +
" vertexColor = aColor;"+
"}"
val fragmentShaderCode = "varying vec3 vertexColor;"+
"void main() {" +
" gl_FragColor = vec4(vertexColor, 1.0);" +
"}"
这里我们就在vertex shader声明了一个vertexColor并且在fragment shader中使用了这个值,这里我们要注意在vertex shader和fragment shader中我们的声明要完全一致
uniform
除了attribute和varying还有一个uniform,在我的理解他就类似static final,你可以在任意一个shader中使用但是不能在shader中修改,在Android中你可以这么使用
val fragmentShaderCode = "precision mediump float;" +
"uniform vec4 vColor;" +
"void main() {" +
" gl_FragColor = vColor;" +
"}"
val mMVPMatrixHandle = GLES30.glGetUniformLocation(mProgram, "uMVPMatrix")
GLES30.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0)