OpenGL实践3之第一个着色器程序2

来源:互联网 发布:python os.exit 编辑:程序博客网 时间:2024/06/06 09:14

OpenGL实践3之第一个着色器程序2

DionysosLai (906391500@qq.com)

引言:

       上一章,我们讲了如何在OpenGL中创建一个着色器程序,但限于篇幅原因,并没有讲解如何别写一个着色器程序。本章我们将编写分别编写一个顶点着色器和片段着色器程序,并使用在上一章中学到的方法,成功在OpenGL上运行。

 

准备工作:

       目前主流的Shader语言(HLSH 和 GLSL)是一种专门为图形学开发设计的编程语言,其本质无非是C语言的变种,除了一些关键字区别,语法几乎没什么区别。因此,对于GLSL的学习,我们大可不必包太大的恐惧。

 

代码大纲:

       我们要讲解两个着色器:顶点着色器和片元着色器。

1.     顶点着色器  

       #version 330 core

       告诉编译器我们目前的GLSL版本为3.3,如果当前版本低于3.3,那么将会产生一个错误。这里3.3版本号,可以根据自己电脑修改。例如,我将其改成4.3,但是我电脑当前并不支持这个版本,因此产生了如下错误:0(2) : error C0201: unsupported version 430

 

layout(location = 0) in vec3 vPosition;

       这一段代码在着色器中声明了一个具有顶点属性3D浮点向量vPosition。代码总共有好几个关键字,这里分别阐述如下:

in:定义一个变量将数据拷贝到着色器中;与之对应的是out:定义一个变量将数据拷贝出去。

       vec3:定义一个类型为float的3D向量,如果我们定义一个类型为double的3D向量,则名字为dvec3。

       layout(location = 0):在缓存区中,将声明的属性变量vPosition和属性之间(在0处,是顶点属性)进行绑定。由于location = 0,是代表顶点属性,因此vPosition值代表了顶点值[1]

 

voidmain()

       在每个着色器代码中,像C语言意义必须有且只有一个main函数,main函数通常做点函数入口点。

 

gl_Position= vec4(0.5*vPosition.x, 0.5*vPosition.y, vPosition.z, 1.0);

gl_Postion是着色器中一个内建变量,指向顶点(x,y,z,w)四个属性值。光栅化时将会查找gl_Position的值,并将其值当做屏幕中的点。

这里,我们将传入的x和y值减半,z值不变,w固定为1.0。

       函数vec4()是一个构造函数,在GLSL中,变量类型也可以转换为构造函数,包括int、flaot、uint等。

2.     片元着色器

out vec4 vFragColor;

       决定像素的颜色、丢弃像素和改变像素Z的值,是片段着色器基本工作。输出颜色工作将由这里定义vFrangColor完成。我们设定的颜色值,将通过vFragColor有光栅器接收并最终写入帧缓存中。

 

       vFragColor= vec4(1.0, 0.0, 0.0, 1.0);

       在第二章中,我们重新写一个片元着色器,因此默认三角形颜色为白,这里我们将三角形颜色设置为红色。

 

       到目前为止,我们第一个着色器教程就到此为止。下一章我们学习索引绘制内容。

       最后祝大家工作愉快。代码下载:https://github.com/DionysosLai/OpenGL-Practice

[延伸阅读]:

[1]   在我们前面代码有这两句代码:

       glVertexAttribPointer(0,3, GL_FLOAT, GL_FALSE,0,BUFFER_OFFSET(0));

       glEnableVertexAttribArray(0);

       这里设置了0位置处为顶点属性,因此顶点着色器中,0位置处代表了顶点属性。

[2]《OpenGL编程指南》第三版P25~P37

 

1 0
原创粉丝点击