读书人

【OpenGL】GLSL-两面渲染技术(Two-sid

发布时间: 2012-08-02 11:35:26 作者: rapoo

【OpenGL】GLSL-双面渲染技术(Two-sided rendering)

当我们渲染一个完全封闭的物体的时候,多边形的背面都是隐藏的,我们无法看见。但是如果这个物体有一些空洞,那么一些背面就可以被看见了。然而因为这些多边形的法向量的方向在这个时候不是正确的,所以会渲染出错误的结果。为了合理的渲染这些背面,我们必须反转法向量,然后基于这些反转的法向量来计算光照。

下图显示了一个采用Phong光照模型绘制茶壶使用双面渲染与否的结果对比:

【OpenGL】GLSL-两面渲染技术(Two-sided rendering)

图一 使用双面渲染与不使用的效果对比

一、固定管线OpenGL实现双面渲染

在固定管线中,我们需要用一个函数来启用双面光照:

glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);

这样,OpenGL将会反转表面的法线的方向,表示背面多边形的法线。

实例:

【OpenGL】GLSL-两面渲染技术(Two-sided rendering)

二、可编程管线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);}}


读书人网 >移动开发

热点推荐