1
0
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:
Geequlim
2015-08-01 16:07:05 +08:00
parent 91eb0bacfd
commit caff344dcc
11 changed files with 336 additions and 325 deletions

View File

@@ -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%以上的了。
![](http://learnopengl.com/img/advanced/faceculling_windingorder.png)
这的确是个好主意,但是有个问题需要我们去解决:我们如何知道某个面在观察者的视野中不会出现呢?如果我们去想象任何封闭的形状,它每个面有两面。一面面向用户,另一面背对用户。假如我们只渲染面向观察者的面会怎样?
这正是面剔除所做的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)。