GLSL 笔记

13 篇文章 0 订阅

了解更多IOS底层原理知识,关注腾讯课堂八点钟学院IOS高级开发

 IOS学习交流群 431449751


GLSL地址:http://blog.csdn.net/hgl868/article/category/1207789/1

GLuint glCreateShader(GLenum shaderType);
 

  这个接口用于创建一个着色器。这里的参数 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

}

///
glUniform1i(uniforms[UNIFORM_SAMPLER], 0);这个采样器的值是与前面所指定的纹理单元号对应的。由于我们前面使用GL_TEXTURE0,因此这里用0。如果这里写为0以外的其它值,那么图像将无法被显示出来。当然,如果我们用了纹理单元1,即GL_TEXTURE1,那么我们这里要使用glUniform1i(uniforms[UNIFORM_SAMPLER], 1)。

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这一个接口。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值