摘要:        
到上一篇为止,拾取一个VBO里的单个图元的问题已经彻底解决了。那么来看下一个问题:一个场景里可能会有多个VBO,此时每个VBO的gl_VertexID都是从0开始的,那么如何区分不同VBO里的图元呢?总结起来,Modern OpenGL可以利用gl_VertexID的存在,借助一点小技巧,实现拾取多个VBO内的任一图元的功能。不过这个方法显然只能拾取一个图元,就是Z缓冲中离屏幕最近的那个图元,不像射线一样能穿透过去拾取多个。    阅读全文
到上一篇为止,拾取一个VBO里的单个图元的问题已经彻底解决了。那么来看下一个问题:一个场景里可能会有多个VBO,此时每个VBO的gl_VertexID都是从0开始的,那么如何区分不同VBO里的图元呢?总结起来,Modern OpenGL可以利用gl_VertexID的存在,借助一点小技巧,实现拾取多个VBO内的任一图元的功能。不过这个方法显然只能拾取一个图元,就是Z缓冲中离屏幕最近的那个图元,不像射线一样能穿透过去拾取多个。    阅读全文
posted @ 2015-05-31 04:28
BIT祝威
阅读(2894)
评论(0)
推荐(1)
        

GL_FLAT模式下,各种类型的图元的颜色都是由绘制它的最后一个顶点的颜色给出的。我们只需在做Picking的绘制时,在GL_FLAT状态下绘制图元,就可以用glReadPixel()获取到应拾取的图元的最后一个顶点的编号。根据上一节的表格,很容易推算出此编号代表的图元。GLSL里的flat关键字。给in/out变量附加一个flat,就相当于Legacy OpenGL里调用了glShadeMode(GL_FLAT);    
这个思路的核心就是设计一个gl_VertexID与gl_FragColor之间的一一对应的函数。再加上我们能够用glReadPixel()获取屏幕上任意位置的颜色信息(gl_FragColor),这样就能够得到拾取到的顶点的gl_VertexID,即该顶点在VBO中的位置。这个方法支持的VBO的顶点数上限是(256*256*256*256=4294967296)。不过目前的显卡支持的VBO最大容量据此上限还差很多。所以放心使用好了。    
    
    
浙公网安备 33010602011771号