OpenGL ES 如何能看到一个物体内部和象3dmax中能只显示网格线
太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)
本文遵循“署名-非商业用途-保持一致”创作公用协议
转载请保留此句:太阳火神的美丽人生 - 本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。
上一篇 OpenGL ES 正反面设置指令 中分析了正反面的判区方法,那么正反面有什么用呢?接下来我们就要引入一个叫做背面消除的概念。在3dmax中有个选项,当你用挤压修改器挤出一个中空的长方体时,在外面是看不到里面的,这时就可以使用背面消除,把看不到的面消掉,而且结合正反面设置,把原本对着观看者的面设成背面,就会被消除了,这时就只能看到远离观看者的面的在长方体内部的面儿了。
这就是房间要被观看到里面内容时的做法,也有一种叫天空...的方法,不太懂,没去研究。最终效果是有正对着观看者的墙不被渲染,实际观察发现,可能存在一面墙或两面墙被打掉的可能性。
下面就来看看这个神奇的方法,我也是用了好久,反复调测,才用明白和真正理解,另外还有一个与背面消除使能配合使用的 glCullFace 指令,它能设置是背面消除,还是正面消除,或者正、背面同时消除。
边翻译以下内容,边明白了另一个事情,在 3dmax 中是显示一个几何体的线框是可以的,那么在 OpenGL ES 中做起来也是很简单的,就是用到 glCullFace 指令,传递 GL_FRONT_AND_BACK 这个参数,这样就把正、反面都消除了,但仅消除面而已,任何一个三维体,都是通过点、面、线三者才绘制成的,如果点和线不绘制,就会漏光。
有了这些基础知识,我们就能明白了,面只是点和线内部的区域,仅这部分不被绘制而已。
实际的计算绘制过程,也应该是根据提供的顶点,算出两顶点之间的线,再根据一个三角形的三个顶点算出的三条件向中间面的区域进行插值计算得出相应片元的颜色,这就是栅格化操作吧,之前是看不明白的,这里确实让人毛塞顿开。
其实写博客的过程,也是一个思考、分析的过程。思想总是要表达出来,才能让自已清楚地知道哪里有偏差,才能找到问题,做进一步的加工处理和修正。
glCullFace — 指定是否正面或背面可以被消除 specify whether front- or back-facing facets can be culled
void glCullFace( |
GLenum mode) ; |
mode
指定是否正面或背面侯选用于消除。标识常量 GL_FRONT
, GL_BACK
, 和 GL_FRONT_AND_BACK 可作为参数。初始值是 GL_BACK。
Specifies whether front- or back-facing facets are candidates for culling. Symbolic constants GL_FRONT
, GL_BACK
, andGL_FRONT_AND_BACK
are accepted. The initial value is
.GL_BACK
glCullFace 指定在面消除启用时,是正面还是背面被消除(按 mode 指定)。要启用和禁用面消除,调用 glEnable 和 glDisable 指令并传 GL_CULL_FACE 参数。面包括三角形、四边形、多边形和长方形。
glFrontFace 指定顺时针面和逆时针面哪一个是正面哪一个是背面。参看 glFrontFace 。
glCullFace
specifies whether front- or back-facing facets are culled (as specified by mode) when facet culling is enabled. Facet culling is initially disabled. To enable and disable facet culling, call the glEnable and glDisable commands with the argument GL_CULL_FACE
. Facets include triangles, quadrilaterals, polygons, and rectangles.
glFrontFace specifies which of the clockwise and counterclockwise facets are front-facing and back-facing. See glFrontFace.
如果 mode 是 GL_FRONT_AND_BACK ,就没有面被绘制了,但是其它图元如点和线仍被绘制。
If mode
is GL_FRONT_AND_BACK
, no facets are drawn, but other primitives such as points and lines are drawn.
如果 mode 是一个不可接受的值,那么就会产生 GL_INVALID_ENUM 错误信息。
GL_INVALID_ENUM
is generated if mode
is not an accepted value.
glIsEnabled with argument GL_CULL_FACE
glGet with argument GL_CULL_FACE_MODE
glEnable, glFrontFace
Copyright © 1991-2006 Silicon Graphics, Inc. This document is licensed under the SGI Free Software B License. For details, seehttp://oss.sgi.com/projects/FreeB/.