OpenGL ES 中如何实现在房间中查看屋内摆设的效果
太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)
本文遵循“署名-非商业用途-保持一致”创作公用协议
如题的效果,分析一下,不难发现,当要能看到房间内的东西时,那么房间靠近观察者的墙需要打掉。
那么怎么打掉呢?买把锤子或者用电锯锯得更齐刷点儿,也可能还有其它更好的办法。
不过有一点是可以肯定的,就是只能拿这些工具来处理房间的墙,不能抡到屋里的东西,那么这里就确定了一个事儿,那就是目标仅为房间的墙。
从OpenGL ES角度来看,怎么打掉这面墙,可能要涉及点事儿,先说明白,那就是我们看到的墙,假设是半透明的,那么基本上会有一面或两面墙的外面能看到,其它的墙均看不见,而我们要打掉的就是能看到外面的墙,以便看到外面看不到的墙的里面。
基于这些非常简的道理,我们再来看OpenGL ES给我们提供了哪些可以用的家伙事儿。
OpenGL ES有一个特性,叫背面剔除,是一种性能优化的技术,看不到的面儿,还要求GPU渲染,浪费资源,可以指定让GPU不渲染。
另外,OpenGL ES还有一个特性,逆时针的三个点组成一个正面的三角形,也可以指定顺时针三点个组成一个正面三角形,这样三个点组成的三角形有两个面,一个是正面儿,一个是背面儿。
有了上面OpenGL ES提供的这两件家伙事儿,估计再用你的聪明小脑瓜子一想,这事儿就齐活了。确实地告诉您,真的齐活了,如果还没齐活,那您就得反复琢磨琢磨了,领悟的事儿,只可意会,不可言传,我真没迈关子,这事儿就得您自个儿想明白了才行,我用我这小脑袋瓜子也是这么想明白的,花了好久,也许,您很聪 明,我这125的智商还是太低下,一下子就想明白了,那您就享福了,继续吧。
// 允许背面消除
glEnable(GL_CULL_FACE);
// 设定顺时针为正面
glFrontFace(GL_CW);
// 绑定顶点缓存,并指定顶点坐标、法线坐标和纹理坐标三者组成的顶点的字节数,以及每个顶点在该缓存起点开始的指针偏移量
glBindBuffer(GL_ARRAY_BUFFER, [_vboArray[0] vertexBuffer]);
// 指示读取各段数据的位置
glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, stride, 0);
glVertexAttribPointer(_textureCoordSlot, 3, GL_FLOAT, GL_FALSE, stride, texCoordOffset);
glVertexAttribPointer(_normalSlot, 3, GL_FLOAT, GL_FALSE, stride, normalOffset);
// Draw the triangles.
//
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, [_vboArray[0] triangleIndexBuffer]);
// 指示GPU使用以上的三维信息绘制出二维图形到帧缓存中
glDrawElements(GL_TRIANGLES, [_vboArray[0] triangleIndexCount], GL_UNSIGNED_SHORT, 0);
// GPU画完后,二维图片保存到桢缓存了,别忘了恢复到默认的逆时针为正面
glFrontFace(GL_CCW);
// 关闭背面消除,否则有些地方会支离破碎
glDisable(GL_CULL_FACE);
齐活了您内!
可是...咋让灯光照到里面去呢?这个真有点难度!
参考资料:
罗朝辉的 OpenGL ES 2.0 iOS教程 :http://blog.csdn.net/column/details/opengl-es2-ios.html