现代OpenGL+Qt学习笔记之九:smooth和flat着色模式
主要内容
介绍OpenGL中的着色模式的概念和在GLSL中的实现方式。
着色模式
在传统OpenGL的固定管线中,函数void glShadeModel ( GLenum mode)的作用是设置着色模式。
参数mode可以是GL_SMOOTH(默认值)或GL_FLAT。采用flat着色时(即GL_FLAT),OpenGL将使用图元中某个顶点的颜色来渲染整个图元,通常情况下会选择图元的第一个或最后一个顶点的颜色作为该图元的颜色,可以通过glProvokingVertex()函数设置,其参数可以是GL_FIRST_VERTEX_CONVENTION(第一个顶点)或GL_LAST_VERTEX_CONVENTION(第二个顶点)。
在使用smooth着色时(即GL_SMOOTH),OpenGL会独立的处理图元中各个顶点的颜色。对于线段图元,线段上各点的颜色将根据两个顶点的颜色通过插值得到。对于多边形图元,多边形内部区域的颜色将根据所有顶点的颜色插值得到。
在GLSL中,切换flat或者smooth模式非常简单,只需要修改(添加)一个限定符(flat 或 smooth)即可。现在在现代OpenGL+Qt学习笔记之八:GLSL双面渲染的程序基础上进行修改。首先为了让两种着色模式下的渲染结果差距更加明显,我们采用更加稀疏的网格来表示茶壶模型。修改openglwidget.cpp中44行的代码(初始化茶壶网格模型)如下:
teapot = new VBOTeapot(7, transform);
运行程序,其结果就是默认的smooth着色模式的渲染结果:
要实现flat渲染模式也非常简单,只需要将顶点着色器和片元着色器中顶点的输入和输出变量前加上限定符flat即可。如在顶点着色器中,输出变量为:
flat out vec3 FrontColor;
flat out vec3 BackColor;
在片元着色器中,对应的输入变量为:
flat in vec3 FrontColor;
flat in vec3 BackColor;
保存后运行程序的结果就是flat着色模式下的渲染结果:
实际上,在两个着色器中,其输入输出变量前是有一个默认的限定符smooth的,如果要显示的说明采用smooth着色模式对模型进行渲染,可以修改着色器中相关的输入输出变量声明如下:
smooth out vec3 FrontColor;
smooth out vec3 BackColor;
及
smooth in vec3 FrontColor;
smooth in vec3 BackColor;
源码地址:http://download.csdn.net/download/chaojiwudixiaofeixia/10003276