如何在OpenGL片段着色器中渲染最接近的顶点

时间:2018-12-19 21:22:59

标签: opengl glsl mesh fragment-shader

我想使用模型,视图和透视投影转换来渲染从3D模型渲染的2D图像。但是,对于输出图像中的每个像素/片段,我想在原始网格中存储顶点的索引表示,该顶点在物理上最接近来自相机中心的光线与网格相交的点。

我对执行此操作涉及的数学有很好的了解,可以构建适当的光线追踪代码“ longhand”以获取此结果,但想了解是否可以通过OpenGL在OpenGL中实现片段着色器。

我不是OpenGL专家,但是我的初步阅读建议一种可能的方法是为片段着色器设置一个特定的渲染目标,以支持整数值(以存储索引)并将整个网格坐标作为{{1} }转换为片段着色器,然后将uniform反向转换为模型空间后,搜索最近的坐标。

我担心这会表现得很丑-我的网格具有大约10,000个顶点。

我的问题是:这看起来像是OpenGL的较差用例吗?如果没有,我的方法是否合理>如果没有,您会建议insetad。

编辑:虽然所示的答案确实包含该问题的解决方案的内核,但它绝不是重复的问题;这是一个不同的问题,答案不同,具有共同的要素(光线追踪)。搜寻该问题的n个答案的人高度不太可能找到建议的重复项。

1 个答案:

答案 0 :(得分:0)

首先,在glsl中将10000个顶点作为统一不是一个好习惯。您可以使用ubo或创建数据纹理,然后将该纹理作为统一纹理上传,请参见以下文章: GLSL: Replace large uniform int array with buffer or texture

我对光线追踪不熟悉。但是,我认为在大多数情况下,将大量数据上传到gpu需要使用纹理统一。 https://www.opengl.org/discussion_boards/showthread.php/200487-Ray-intersection-with-GLSL?p=1292112&viewfull=1#post1292112