OpenGL ES 中如何实现在房间中查看屋内摆设的效果

OpenGL ES 中如何实现在房间中查看屋内摆设的效果

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino否则,出自本博客的文章拒绝转载或再转载,谢谢合作。



如题的效果,分析一下,不难发现,当要能看到房间内的东西时,那么房间靠近观察者的墙需要打掉。

那么怎么打掉呢?买把锤子或者用电锯锯得更齐刷点儿,也可能还有其它更好的办法。

不过有一点是可以肯定的,就是只能拿这些工具来处理房间的墙,不能抡到屋里的东西,那么这里就确定了一个事儿,那就是目标仅为房间的墙。


从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




上一篇:使用Python实现自动化截取Windows系统屏幕


下一篇:文件系统挂载、卸载及相关的工具 ⑨