了解更多IOS底层原理知识,关注腾讯课堂八点钟学院IOS高级开发
IOS学习交流群 431449751
GLSL地址:http://blog.csdn.net/hgl868/article/category/1207789/1
|
这个接口用于创建一个着色器。这里的参数 shaderType 是个枚举值,用于指定要创建哪种类型的着色器。GL_VERTEX_SHADER 表示顶点着色器;GL_TESS_CONTROL_SHADER 用于细分 曲面的控制阶段(流水线级,OpenGL4.1);GL_TESS_EVALUATION_SHADER(OpenGL4.1)用于细分曲面的计算阶段;GL_GEOMETRY_SHADER 用于几何着色器;GL_FRAGMENT_SHADER 则用于片断处理器。这个函数的返回可看作为是一个着色器的句柄。
///
glBindAttribLocation 用于将程序中一个用户定义的属性变量与一个通用属性索引相关联。当所指定的程序对象变为当前状态的一部分时,通过通用顶点属性index提供的将会修改通过name所指定的用户自定义属性变量的值。
{
GLKVertexAttribPosition,
GLKVertexAttribNormal,
GLKVertexAttribColor,
GLKVertexAttribTexCoord0,
GLKVertexAttribTexCoord1
}
void main()
{
float radian = radians(degree);
gl_Position = position;
colorVarying = color;
gl_TexCoord[0] = texCoords;
}
这里,gl_TexCoord是个GLSL内建的varying变量。这个变量起始是个数组,可用于多重纹理。我们这里只使用一个纹理,因此就用索引0.
下面看一下片断着色器的代码:
varying vec4 colorVarying;
uniform sampler2D sampler;
void main()
{
//gl_FragColor = colorVarying;
gl_FragColor = texture2D(sampler, gl_TexCoord[0].st);
}
上面用OpenGL Shading Language所实现的功能,用固定功能的OpenGL也能轻易实现。下面我将提供一种效果将是固定功能不容易实现的。这个效果其实是将纹理贴在正方形的中间一部分,外部一圈仍然用平滑颜色来绘制。这个效果如果用固定功能来实现的话需要将整个正方形用平滑着色模式绘制一遍,然后再贴纹理。而且贴纹理的时候需要再定义一个小正方形的顶点。应该说非常麻烦。
下面对于片断着色器只要稍微改一点点代码就能够呈现这个效果:
varying vec4 colorVarying;
uniform sampler2D sampler;
void main()
{
if(0.2 <= gl_TexCoord[0].s && gl_TexCoord[0].s <= 0.8 && 0.2 <= gl_TexCoord[0].t && gl_TexCoord[0].t <= 0.8)
gl_FragColor = texture2D(sampler, gl_TexCoord[0].st);
else
gl_FragColor = colorVarying;
}
要注意的是,顶点着色器是可以与主机端应用进行直接交互的。而片断着色器则不能与主机端程序进行直接交互。因此,我们可以把片断着色器所要用到的数据先通过顶点着色器输入进来,然后通过varying属性传给片断着色器(Fragment Shader)。注意,在以后版本中varying关键字也被废弃。取而代之的是在顶点着色器部分用out关键字,而在片断着色器中相应地使用in关键字。
因此,attribute不仅仅是指顶点属性,也可以是颜色属性或用户自定义的一些变量,而我们用主机端的数据与这些attribute变量绑定时,都用glBindAttribLocation这一个接口。