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