如何在 OpenGL 片段着色器中渲染最近的顶点
How to render closest vertex in OpenGL fragment shader
我想渲染从具有模型、视图和透视投影变换的 3D 模型渲染的 2D 图像。然而,对于输出图像中的每个 pixel/fragment,我想存储原始网格中顶点索引的表示,该索引在物理上最接近来自相机中心的光线与网格相交的点。
我对执行此操作所涉及的数学有很好的理解,并且可以构建适当的光线跟踪代码 'longhand' 来获得此结果,但想看看是否有可能在 OpenGL 中实现,例如通过片段着色器。
我不是 OpenGL 专家,但我最初的阅读建议一种可能的方法是为片段着色器设置一个特定的渲染目标,该渲染目标支持整数值(以存储索引)并将整个网格坐标作为 uniform
到片段着色器,然后在将 gl_FragCoord
反向转换为模型 space.
后搜索最近的坐标
我担心这会表现得很糟糕 - 我的网格有大约 10,000 个顶点。
我的问题是:对于 OpenGL 这似乎是一个糟糕的用例?如果不是,我的做法是否合理>如果不是,你建议插入什么。
编辑: 虽然指示的答案 确实 包含该问题解决方案的核心,但它绝不是重复问题;这是一个具有共同元素(光线追踪)的不同答案的不同问题。有人搜索此问题的第 n 个答案非常 不太可能找到建议的重复项。
首先,10000 个顶点作为统一在 glsl 中不是一个好的做法。您可以使用 ubo 或创建数据纹理,然后将此纹理作为统一纹理上传,请参见以下内容 post:
GLSL: Replace large uniform int array with buffer or texture
我不熟悉光线追踪。但是,我认为在大多数情况下,将大量数据上传到gpu 需要使用texture uniform。
https://www.opengl.org/discussion_boards/showthread.php/200487-Ray-intersection-with-GLSL?p=1292112&viewfull=1#post1292112
我想渲染从具有模型、视图和透视投影变换的 3D 模型渲染的 2D 图像。然而,对于输出图像中的每个 pixel/fragment,我想存储原始网格中顶点索引的表示,该索引在物理上最接近来自相机中心的光线与网格相交的点。
我对执行此操作所涉及的数学有很好的理解,并且可以构建适当的光线跟踪代码 'longhand' 来获得此结果,但想看看是否有可能在 OpenGL 中实现,例如通过片段着色器。
我不是 OpenGL 专家,但我最初的阅读建议一种可能的方法是为片段着色器设置一个特定的渲染目标,该渲染目标支持整数值(以存储索引)并将整个网格坐标作为 uniform
到片段着色器,然后在将 gl_FragCoord
反向转换为模型 space.
我担心这会表现得很糟糕 - 我的网格有大约 10,000 个顶点。
我的问题是:对于 OpenGL 这似乎是一个糟糕的用例?如果不是,我的做法是否合理>如果不是,你建议插入什么。
编辑: 虽然指示的答案 确实 包含该问题解决方案的核心,但它绝不是重复问题;这是一个具有共同元素(光线追踪)的不同答案的不同问题。有人搜索此问题的第 n 个答案非常 不太可能找到建议的重复项。
首先,10000 个顶点作为统一在 glsl 中不是一个好的做法。您可以使用 ubo 或创建数据纹理,然后将此纹理作为统一纹理上传,请参见以下内容 post: GLSL: Replace large uniform int array with buffer or texture
我不熟悉光线追踪。但是,我认为在大多数情况下,将大量数据上传到gpu 需要使用texture uniform。 https://www.opengl.org/discussion_boards/showthread.php/200487-Ray-intersection-with-GLSL?p=1292112&viewfull=1#post1292112