OpenGL ES 如何能看到一个物体内部和象3dmax中能只显示网格线

摘要:
之前的OpenGLES前后设置指令分析了前后分割方法。前面和后面有什么用?在翻译以下内容时,我学到了另一件事。在3dmax中,可以显示几何体的线框。在OpenGLES中,使用glCullFace命令传输GL_FRONT_AND_这个参数BACK也非常简单,它消除了前面和后面,但只消除了脸部。任何三维体积都是通过点、面和线绘制的。如果不绘制点和线,光线将泄漏。标识常数GL_ FRONT、GL_ BACK和GL_ FRONT_ and_ BACK可用作参数。要启用和禁用面部消除,请调用glEnable和glDisable命令,并传递GL_CULL_face参数。

上一篇 OpenGL ES 正反面设置指令 中分析了正反面的判区方法,那么正反面有什么用呢?接下来我们就要引入一个叫做背面消除的概念。在3dmax中有个选项,当你用挤压修改器挤出一个中空的长方体时,在外面是看不到里面的,这时就可以使用背面消除,把看不到的面消掉,而且结合正反面设置,把原本对着观看者的面设成背面,就会被消除了,这时就只能看到远离观看者的面的在长方体内部的面儿了。


这就是房间要被观看到里面内容时的做法,也有一种叫天空...的方法,不太懂,没去研究。最终效果是有正对着观看者的墙不被渲染,实际观察发现,可能存在一面墙或两面墙被打掉的可能性。


下面就来看看这个神奇的方法,我也是用了好久,反复调测,才用明白和真正理解,另外还有一个与背面消除使能配合使用的 glCullFace 指令,它能设置是背面消除,还是正面消除,或者正、背面同时消除。


OpenGL ES 如何能看到一个物体内部和象3dmax中能只显示网格线第1张

OpenGL ES 如何能看到一个物体内部和象3dmax中能只显示网格线第2张


边翻译以下内容,边明白了另一个事情,在 3dmax 中是显示一个几何体的线框是可以的,那么在 OpenGL ES 中做起来也是很简单的,就是用到 glCullFace 指令,传递 GL_FRONT_AND_BACK 这个参数,这样就把正、反面都消除了,但仅消除面而已,任何一个三维体,都是通过点、面、线三者才绘制成的,如果点和线不绘制,就会漏光。

有了这些基础知识,我们就能明白了,面只是点和线内部的区域,仅这部分不被绘制而已。

实际的计算绘制过程,也应该是根据提供的顶点,算出两顶点之间的线,再根据一个三角形的三个顶点算出的三条件向中间面的区域进行插值计算得出相应片元的颜色,这就是栅格化操作吧,之前是看不明白的,这里确实让人毛塞顿开。


其实写博客的过程,也是一个思考、分析的过程。思想总是要表达出来,才能让自已清楚地知道哪里有偏差,才能找到问题,做进一步的加工处理和修正。

Name

glCullFace — 指定是否正面或背面可以被消除 specify whether front- or back-facing facets can be culled

C Specification

void glCullFace(GLenum mode);
 

Parameters

mode

指定是否正面或背面侯选用于消除。标识常量 GL_FRONTGL_BACK, 和 GL_FRONT_AND_BACK 可作为参数。初始值是 GL_BACK。

Specifies whether front- or back-facing facets are candidates for culling. Symbolic constants GL_FRONTGL_BACK, andGL_FRONT_AND_BACK are accepted. The initial value is GL_BACK.

描述 Description

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.

注意 Notes

如果 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.

错误信息 Errors

如果 mode 是一个不可接受的值,那么就会产生 GL_INVALID_ENUM 错误信息。

GL_INVALID_ENUM is generated if mode is not an accepted value.

Associated Gets

glIsEnabled with argument GL_CULL_FACE

glGet with argument GL_CULL_FACE_MODE

See Also

glEnableglFrontFace

Copyright

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/.





免责声明:文章转载自《OpenGL ES 如何能看到一个物体内部和象3dmax中能只显示网格线》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇彻底解决MacOS上应用程序快捷键冲突的问题,自定义快捷键设置高并发秒杀系统API之SSM集成swagger与AdminLTE下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

opengl es 学习

http://blog.csdn.net/lpt19832003/archive/2010/03/03/5342070.aspx 1、学习网站 官方网站 http://www.khronos.org/opengles/ 最经典的Nehe 学习网站 http://nehe.gamedev.net/ 中文的Nehe 学习网站 http://www.owlei...

基于OpenGL编写一个简易的2D渲染框架-08 重构渲染器-整体架构

  事实上,前面编写的渲染器 Renderer 非常简陋,虽然能够进行一些简单的渲染,但是它并不能满足我们的要求。 当渲染粒子系统时,需要开启混合模式,但渲染其他顶点时却不需要开启混合模式。所以同时渲染粒子系统和其他纹理时会得不到想要的结果,渲染器还存在许多的不足: 1、当渲染许多透明图形时,没有对其进行排序,使得本应透明的图形没有透明。 2、不能对不同的...

在Android应用中使用OpenGL

Android为OpenGL  ES支持提供了GLSurfaceView组件,这个组件用于显示3D图形。GLSurfaceView本身并不提供绘制3D图形的功能,而是由GLSurfaceView.Renderer来完成了SurfaceView中3D图形的绘制。 归纳起来,在Android中使用OpenGL  ES需要三个步骤: 1、创建GLSurfaceV...

opengl中拾取操作的实现

opengl采用一种比较复杂的方式来实现拾取操作,即选择模式。选择模式是一种绘制模式,它的基本思想是在一次拾取操作时,系统会根据拾取操作的参数(如鼠标位置)生成一个特定视景体,然后又系统重新绘制场景中的所有图元,但这些图元并不会绘制到颜色缓存中,系统跟踪有哪些图元绘制到了这个特定的视景体中,并将这些对象的标识符保存到拾取缓冲区数组中。 步骤: 1、设置拾取...

OpenGL的核心模式与立即渲染模式

早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管线),这个模式下绘制图形很方便。OpenGL的大多数功能都被库隐藏起来,开发者很少能控制OpenGL如何进行计算的自由。而开发者迫切希望能有更多的灵活性。随着时间推移,规范越来越灵活,开发者对绘图细节有了更多的掌控。立即渲染模式确实容易使用和理解,但是效率太低。因此从Open...

简单基于OPENGL的三维CAD框架(1)工具类

在vc++中有CDC类,同样也可以开发基于OPENGL的OPenGLDC类,这样可以像调用CDC类一样调用OPenGLDC类 首先给出两个工具类,点类和向量类 typedef struct tagVector3D {double dx;double dy;double dz;} VECTOR3D; class CVector3D : public VECT...