openGL如何使用unsigned int顶点数据绘制

时间:2016-02-29 05:56:22

标签: c++ opengl

我正在做一个简单的openGL程序,它涉及渲染到屏幕外的深度纹理。但是,我处理的浮动深度超过了浮点数精度所代表的深度。因此,我需要使用unsigned int来绘制我的点。当我尝试实现这个时,我遇到了两个问题。

1)每当我尝试绘制一个使用unsigned int(屏幕坐标)进行绘制的VBO时,它都不会落在-1到1的范围内,因此它们都不会绘制到屏幕上。我能找到解决这个问题的唯一方法是使用正交投影矩阵来调整它以绘制到屏幕坐标 这种理解是否正确或是否有更简单的方法 如果它是正确的,你如何正确地实现它我想要的。

2)其次,当以这种方式绘制时,是否有任何方法可以保留初始值(在绘制时不将它们转换为浮点数),因此当您再次读回它们时它们没有什么不同,这是必要的,因为我的目标是创建一个随机点的深度缓冲,随机深度可达2 ^ 32。如果将其转换为浮点数,则精度会丢失,因此再次读出的数据与放入的数据不同。

1 个答案:

答案 0 :(得分:1)

这是解决问题的错误方法。要回答您的问题,gl_Positionvec4。因此,OpenGL看到的深度是浮动的。除了完全忽略深度缓冲区并在片段着色器中自己进行“深度测试”之外,你无法做任何改变。

问题的首选解决方案是使用浮点深度缓冲区。使用GL_DEPTH_COMPONENT_32F或类似的东西。但由于OpenGL defines its coordinate transforms的遗留问题令人不幸,仅此一点是不够的。看,浮点数在[0,1]范围内放置了很多精度,但它偏向于接近零。但是由于OpenGL定义其变换的方式,that precision gets lost along the way;实际上,浮点数的指数部分永远不会被使用。它使32位浮点看起来像24位定点值。

OpenGL修复了ARB_clip_control的问题,恢复了有效使用完整32位浮点数的能力。如果可能的话,你应该尝试使用它。