【发布时间】:2019-05-20 10:08:29
【问题描述】:
我想通过模型、视图和透视投影变换来渲染从 3D 模型渲染的 2D 图像。但是,对于输出图像中的每个像素/片段,我想在原始网格中存储顶点索引的表示,该表示在物理上最接近来自相机中心的光线与网格相交的点。
我对执行此操作所涉及的数学有很好的理解,并且可以构建适当的光线跟踪代码“速写”来获得此结果,但想看看是否可以在 OpenGL 中实现,例如通过片段着色器。
我不是 OpenGL 专家,但我最初的阅读建议一种可能的方法是为支持整数值(以存储索引)的片段着色器设置特定的渲染目标,并将整个网格坐标作为 uniform 传递给然后片段着色器在将gl_FragCoord 反向转换到模型空间后执行搜索最近的坐标。
我担心这会表现得很糟糕 - 我的网格有大约 10,000 个顶点。
我的问题是:这对于 OpenGL 来说是不是一个糟糕的用例?如果不是,我的方法是否合理?如果不是,您会建议 insetad。
编辑:虽然指示的答案确实包含该问题的解决方案的核心,但它绝不是重复的问题;这是一个不同的问题,不同的答案有共同的元素(光线追踪)。搜索此问题 n 答案的人极不太可能找到建议的重复项。
【问题讨论】:
-
在每个三角形内,您是否只想将形成三角形的顶点视为最近顶点的候选,还是所有全局顶点(可能来自完全不同的三角形)?
-
你传递你在纹理中编码的网格......我就是这样做的:Reflection and refraction impossible without recursive ray tracing? 不需要整数我使用浮点数,但你必须选择纹理的内部格式不钳制到
<0,1>范围。顺便说一句,还有一些计算着色器可能会更好 -
@derhass 我没有考虑过的好问题。我认为对于我的用例来说,假设最近的顶点是包围这个片段的三角形之一是合理的。
-
@Spektre 感谢指导将阅读和学习...
-
@DaveDurbin 在片段着色器中负责三角形射线相交计算的部分中,您得到了三角形的重心坐标......所以只需决定它更接近
(0,0),(0,1)或(1,1)的哪个点只需四舍五入坐标就应该很容易...
标签: opengl glsl mesh fragment-shader