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)给片段着色器。


片段着色器

在图形光栅化后的每个像素调用一次片段着色器,所谓光栅化,是将一个图形切成无数个整齐排列的小格子,而这每个小格子就是像素。假设点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问题理解_第1张图片
输入为:
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问题理解_第2张图片

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

OpenGL : 着色器语言GLSL问题理解_第3张图片

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

你可能感兴趣的:(OpenGL)