OpenGL : 着色器语言GLSL问题理解

为什么需要着色器? 着色器即是负责在GPU中进行颜色值计算的程序段,我们在OpenGL程序中使用着色器帮助我们进行图形的渲染将大大加快渲染速度。在渲染大规模的模型中,高效的进行渲染更是是开发人员难题。在图形处理器(GPU)中,图形颜色是并行计算的,计算速度比串行计算的CPU要快的多。由此,我们编写和使用着色器,在GPU中进行颜色渲染。 顶点着色器 当我们绘制一个简单三角形时,我们都知道它有三个顶点,那么在各个顶点,顶点着色器将被调用,共调用了三次。顶点着色器将顶点的位置确定,并计算每个顶点的颜色值并记录下来,计算来源于GL程序中的传递值。 注意:在这时并没有真正的绘制像素点,只是将颜色值保存了下来。 顶点着色器代码

in vec4 vColor; in vec4 vVertex; smooth out vec4 vVaryingColor; void main(void) { vVaryingColor = vColor ; gl_Position = vVertex ; }

关于代码中in、out、vec等声明在这里不做解释,我只记录在我学习过程中思考的问题。代码从GL程序中读取了两个向量值: vColor 和 vVertex ,一是顶点的颜色值,二是顶点的位置,这些都是在一开始设定好的。绘制三角形,当然要给出三点的三色和位置。将 vVertex 赋给 gl_Position 将记录顶点的位置,成为顶点最终绘制的位置。将 vColor赋给 vVaryingColor 将顶点颜色值输出(out)给片段着色器。 【OpenGL : 着色器语言GLSL问题理解】

片段着色器 在图形光栅化后的每个像素调用一次片段着色器,所谓光栅化,是将一个图形切成无数个整齐排列的小格子,而这每个小格子就是像素。假设点A和点B之间光栅化出了100个像素那么片段着色器将在这之间调用100次。片段着色器接收顶点着色器中的输出(out)的 vVaryingColor 颜色值,但需要注意的是: 此时的颜色值已经和原本的 vVaryingColor 值不同了 。vVaryingColor 经过了插值,在两个顶点中计算插值,也就是估算两点之间大概的颜色值,例如在红色和绿色中间的颜色值估算为黄色。这里采用的是平滑插值(smooth)法,详细算法自己百度。
片段着色器代码
out vec4 vFragColor; smooth in vec4 vVaryingColor; void main(void) { vFragColor = vVaryingColor ; }

经过平滑插值的 vVaryingColor 赋给vFragColor,此时颜色真正输出到屏幕上。将所有的像素计算完后,就成功的渲染了一个简单三角形。以上过程感觉是很复杂,但在GPU并行计算下,只需单次的计算即可完成上述运算,渲染速度非常之快。
测试 渲染结果 OpenGL : 着色器语言GLSL问题理解
文章图片

输入为:
GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f}; GLfloat vColors [] = { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f };

此时可以看到图中效果,若再将片段着色器稍微修改:
vFragColor = vec4(1,1,1,1) - vVaryingColor ;

则可以看到如图所示: OpenGL : 着色器语言GLSL问题理解
文章图片
对每个像素值取以相反数,得到图片中的效果,验证上文片段着色器插值描述。再对顶点着色器进行修改:
gl_Position = vVertex - vec4(0.5,0.5,0,0) ;

则可以看到如图所示:

OpenGL : 着色器语言GLSL问题理解
文章图片

对每个顶点进行平移,得到图中效果,验证了上文顶点着色器关于顶点输出位置的描述。还可对输出值gl_Position 乘上变换矩阵得到,视图变换,投影变换等。

    推荐阅读