概述
在前面一章我们介绍了使用使用 uniform 用单一的颜色绘制一种物体,本章我们将会引人 varying 类型的变量介绍如何实现平滑着色。
三角形扇
我们在介绍平滑着色以前,我们先来介绍一下三角形扇。然后我们将会实现一个中间亮色,然后沿对角线逐渐变色的效果。
我们在桌子中间加入一个新的点(0,0),最终看拿到了四个三角形,而不是原来的两个。我们修改一下正方形的顶点数据:
1 | private float[] tableVerticesWithTriangles = { |
然后在 onDrawFrame
中将绘制的模式改为:
1 | GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0 , 6); |
这样就可以绘制三角形扇了。
平滑着色
下面我们开始介绍平滑着色。
在前面的基础知识一文中我们介绍过,可以在顶点中添加其他属性,那么我们就再添加一个颜色来作为第二个属性。
1 | private float[] tableVerticesWithTriangles = { |
我们为顶点增加了颜色分量,现在来需要修改顶点着色器的代码:
1 | uniform mat4 u_Matrix; |
我们加入了一个新的属性 a_Color
,也加入了一个叫做 v_Color
的新 varying
。前面已经讲过 varying
是一个特殊的变量类型,它把给它的值进行混合并把这些混合的值发送给片段着色器。
我们把varying也加入片段着色器:
1 | precision mediump float; |
我们用varying变量v_Color替换了原来代码中的uniform。如果这个片段属于一条直线,那个OpenGL就会用构成那条直线的两个顶点计算其混合后的颜色。
下面来看一下全部的 Render 代码:
1 | public class SecondRender implements GLSurfaceView.Renderer { |
1 | public class ShaderHelper { |
新增了 STRIDE
常量,这个被称为跨距的常量告诉 OpenGL 每个位置之间有多少个字节,这样它就知道需要跳过多少了。
新增 aColorLocation
变量,把它和顶点着色器中的 a_Color
关联起来。
在 onDrawFrame
方法中把 GLES20.glUniform4f
方法去掉,因为我们已经把顶点数据和a_Color
关联起来了,就不再需要它们来设置颜色了。只需要调用 GLES20.glDrawArrays
即可,OpenGL 会自动从顶点数据里面读入颜色属性。