8.5 更新着色器(Updating Shaders)
我还需要更新相应的着色器,我们之前使用atrribute类型属性定义了球棍或者冰球的顶点坐标,这里我们将会使用uniform类型定义相应的颜色,现在在ShaderProgram中加入一个新的常量,如下代码:
//AirHockeyWithImprovedMallets/src/com/airhockey/android/programs/ShaderProgram.java
protected static final String U_COLOR = "u_Color";
下一步是更新ColorShaderProgram类,把所有引用变量aColorLocation的代码删除,包括方法getColorAttributeLocation(),然后添加如下代码:
//AirHockeyWithImprovedMallets/src/com/airhockey/android/programs/ColorShaderProgram.java
private final int uColorLocation;
同时在构建函数中使用以下代码获取着色器中uniform类型变量的引用:
//AirHockeyWithImprovedMallets/src/com/airhockey/android/programs/ColorShaderProgram.java
uColorLocation = glGetUniformLocation(program, U_COLOR);
最后更新方法setUniforms(),代码如下:
//AirHockeyWithImprovedMallets/src/com/airhockey/android/programs/ColorShaderProgram.java
public void setUniforms(float[] matrix, float r, float g, float b) {
glUniformMatrix4fv(uMatrixLocation, 1, false, matrix, 0);
glUniform4f(uColorLocation, r, g, b, 1f);
}
当然我们还需要更新着色器,按照如下代码更新 simple_vertex_shader.glsl :
//AirHockeyWithImprovedMallets/res/raw/simple_vertex_shader.glsl
uniform mat4 u_Matrix;
attribute vec4 a_Position;
void main() {
gl_Position = u_Matrix * a_Position;
}
同时按照如下代码更新着色器 simple_fragment_shader.glsl:
//AirHockeyWithImprovedMallets/res/raw/simple_fragment_shader.glsl
precision mediump float;
uniform vec4 u_Color;
void main() {
gl_FragColor = u_Color;
}
现在相应的着色器都已经更新好了,下一节我们将会把前面所有的工作集成起来以绘制相应的形体(点击进入下一节)。