OpenGL学习日记-2015.3.5——Hello glsl(着色器)

    过年前忍不住买了本新版的OpenGL编程指南,主要的目的还是为了系统的学习着色器编程,另外就是接触新版的OpenGL技术和思想。看了几页,就过年了QAQ.回来后也是各种不在状态,不想上班,不想工作,不想写代码。。。昨天终于强迫自己继续看书,也找回了些状态。

    书本基础知识的全面性和权威性就不用说了,不过这个源代码就。。。。这第一个例子照着代码来抄结果。。。我想应该是原来的代码一个参数错了,折腾了半天,代码分析是详说。主要是分析代码,有什么说什么,并没有全面的说明着色器的基本内容,想着在着色器的基础知识看的差不多或者更熟悉了再做一次总结。
顶点着手器:
#version 330

uniform mat4 model_matrix;
uniform mat4 projection_matrix;

layout (location = 0) in vec4 position;
layout (location = 1) in vec4 color;

out vec4 vs_fs_color;

void main(void)
{
    vs_fs_color = color;
    gl_Position = projection_matrix * (model_matrix * position);
}

    第一行是着色器版本说明,以上是对应于OpenGL 3.3版本,在编写着色器程序是虽然使用最新的版本可以使得程序充分利用的Opengl的新特性,当时也同时带来兼容性的问题。所以根据自己的程序需要做一个权衡。

    第二三行定义了4x4的矩阵,从字面意义上看,他们分别是透视投影矩阵和,模型视图矩阵,在main与顶点坐标做透视投影变换和模型视图变换。 关于uniform关键字:是个存储限制符,uniform修饰符可以指定一个在应用程序中定义好的变量,他不会再图元处理过程中变化(着色器流水中),它在所有的着色器阶段都是共享的所以它必须是全局的变量(相对于着色器)。任何类型的变量都可以为uniform修饰。!!!重要:着色器无法修改,写入uniform修饰的变量,无法改变它的值。

    第四五行定义了两个4维向量,比较生疏的修饰符。glsl声明的解读和c++一样,从右往左读。position是个变量名,vec4说明了这个变量是4维向量,in修饰符代表着变量是一个输入变量(无修饰时,默认值),然后是layout(location = 0),她叫做布局限定符,目的是为了方便给变量提供数据,layout()的还有其他的选项,在这里location相当于设定了变量在着色器程序中的访问位置。

    第六行同样定义了一个4维向量,不同的是out修饰符,同理易知代表着这个变量是用于输出数据,这里是给片段着色器提供颜色的输入数据,在下面的片元着色器中将再次看到该变量。

    最后是main()函数,每一个着色器都必须有一个main()函数,与c、c++不同的是这个函数没有返回值,没有参数。函数里第一行对输出变量赋予应用程序中传递过来的颜色值,以便传递给片元着色器使用、第二行对gl_Position赋值,这是个OpenGL的内置变量,所有OpenGL的内置变量都是以gl_为前缀。gl_Position表示顶点坐标,最终OpenGL将根据该值绘制每一个顶点。
 
片元着色器:
#version 330

in vec4 vs_fs_color;

layout (location = 0) out vec4 color;

void main(void)
{
    color = vs_fs_color;
}

    从第二行说起吧,这个变量在顶点着色器中出现过,不同的是修饰
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值