mirror of
https://github.com/LearnOpenGL-CN/LearnOpenGL-CN.git
synced 2025-08-23 20:55:27 +08:00
校对 04/02
This commit is contained in:
@@ -2,19 +2,19 @@
|
||||
|
||||
本文作者JoeyDeVries,由Django翻译自http://learnopengl.com
|
||||
|
||||
尝试在头脑中想象一下有一个3D立方体,你从任何一个方向去看他,你最多可以一次看到多少个面。如果你的想象力不是过于丰富,你最终最多能数出来的面是3个。你可以从一个立方体的任意位置和方向上去看它,但是你永远不能看到多于3个面。所以我们为何还要去绘制那三个不会显示出来的3个面呢。如果我们可以以某种方式丢弃它们,我们会提高像素着色器50%的性能!
|
||||
尝试在头脑中想象一下有一个3D立方体,你从任何一个方向去看他,你最多可以一次看到多少个面。如果你的想象力不是过于丰富,你最终最多能数出来的面是3个。你可以从一个立方体的任意位置和方向上去看它,但是你永远不能看到多于3个面。所以我们为何还要去绘制那三个不会显示出来的3个面呢。如果我们可以以某种方式丢弃它们,我们会提高片段着色器50%的性能!
|
||||
|
||||
!!! Important
|
||||
|
||||
|
||||
我们所说的是大于50%而不是50%,因为从一个角度只有2个或1个面能够被看到。这种情况下我们就能够节约50%以上的了。
|
||||
|
||||
|
||||

|
||||
|
||||
这的确是个好主意,但是有个问题需要我们去解决:我们如何知道某个面在观察者的视野中不会出现呢?如果我们去想象任何封闭的形状,它每个面有两面。一面面向用户,另一面背对用户。假如我们只渲染面向观察者的面会怎样?
|
||||
|
||||
这正是面剔除所做的(face culling)。OpenGL检查所有正面朝向(front facing)观察者的面,并渲染它们,而丢弃所有背面朝向(back facing)的面,这样就节约了我们很多像素着色器的命令(它们很昂贵!)。我们必须告诉OpenGL我们使用的哪个面是正面,哪个面是反面。OpenGL使用一种聪明的手段解决这个问题——分析顶点数据的链接顺序(winding order)。
|
||||
这正是面剔除所做的(face culling)。OpenGL检查所有正面朝向(front facing)观察者的面,并渲染它们,而丢弃所有背面朝向(back facing)的面,这样就节约了我们很多片段着色器的命令(它们很昂贵!)。我们必须告诉OpenGL我们使用的哪个面是正面,哪个面是反面。OpenGL使用一种聪明的手段解决这个问题——分析顶点数据的链接顺序(winding order)。
|
||||
|
||||
|
||||
|
||||
|
||||
25.1 顶点链接顺序(winding order)
|
||||
|
||||
@@ -45,7 +45,7 @@ GLfloat vertices[] = {
|
||||
|
||||
在顶点数据中,我们定义的是两个逆时针顺序的(前面的三角是1、2、3后面剪的也是1、2、3(如果我们从这个三角的前面去观察))。然而,从观察者的方面看,后面的三角形是顺时针的,如果我们仍以1、2、3的顺序以观察者当面的视野看的话。即使我们以逆时针顺序定义后面的三角形,它现在还是变为顺时针。它正是我们打算剔除(丢弃)的不可见的面!
|
||||
|
||||
|
||||
|
||||
|
||||
###面剔除
|
||||
|
||||
@@ -100,4 +100,4 @@ glCullFace(GL_FRONT);
|
||||
|
||||
###练习
|
||||
|
||||
你可以自己重新定义一个顺时针的顶点顺序,然后用顺时针作为正面把它渲染出来吗:[解决方案](http://learnopengl.com/code_viewer.php?code=advanced/faceculling-exercise1)。
|
||||
你可以自己重新定义一个顺时针的顶点顺序,然后用顺时针作为正面把它渲染出来吗:[解决方案](http://learnopengl.com/code_viewer.php?code=advanced/faceculling-exercise1)。
|
||||
|
Reference in New Issue
Block a user