【OpenGL】GLSL-双面渲染技术(Two-sided rendering)
当我们渲染一个完全封闭的物体的时候,多边形的背面都是隐藏的,我们无法看见。但是如果这个物体有一些空洞,那么一些背面就可以被看见了。然而因为这些多边形的法向量的方向在这个时候不是正确的,所以会渲染出错误的结果。为了合理的渲染这些背面,我们必须反转法向量,然后基于这些反转的法向量来计算光照。
下图显示了一个采用Phong光照模型绘制茶壶使用双面渲染与否的结果对比:

图一 使用双面渲染与不使用的效果对比
一、固定管线OpenGL实现双面渲染
在固定管线中,我们需要用一个函数来启用双面光照:
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
这样,OpenGL将会反转表面的法线的方向,表示背面多边形的法线。
实例:
二、可编程管线OpenGL实现双面渲染
假设我们的光照(采用Phong光照模型)计算是基于顶点的。在顶点着色器中,我们需要为每个顶点分别计算两次:front face和back face。两次计算采用的法向量不同。
#version 400in vec3 FrontColor;in vec3 BackColor;layout (location = 0) out vec4 FragColor;void main(){if(gl_FrontFacing){FragColor = vec4(FrontColor,1.0);}else{FragColor = vec4(BackColor,1.0);}}
