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并行计算下,只需单次的计算即可完成上述运算,渲染速度非常之快。
测试 渲染结果
文章图片
输入为:
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 ;
则可以看到如图所示:
文章图片
对每个像素值取以相反数,得到图片中的效果,验证上文片段着色器插值描述。再对顶点着色器进行修改:
gl_Position = vVertex - vec4(0.5,0.5,0,0) ;
则可以看到如图所示:
文章图片
对每个顶点进行平移,得到图中效果,验证了上文顶点着色器关于顶点输出位置的描述。还可对输出值gl_Position 乘上变换矩阵得到,视图变换,投影变换等。
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- 人生感悟记#环境仪器宋庆国成长记#072
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 视频转换器哪种好用()
- NeuVector 会是下一个爆款云原生安全神器吗()
- 操作系统|[译]从内部了解现代浏览器(1)
- 探索免费开源服务器tomcat的魅力
- 机器学习|机器学习 Andrew Ng《Machine Learning》课程笔记1
- 《机器学习实战》高清中文版PDF英文版PDF+源代码下载
- 机器学习一些简单笔记