【问题标题】:How to render closest vertex in OpenGL fragment shader [duplicate]如何在OpenGL片段着色器中渲染最近的顶点[重复]
【发布时间】: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


【解决方案1】:

首先,10000 个顶点作为统一在 glsl 中不是一个好的做法。您可以使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-24
    • 2015-04-04
    • 1970-01-01
    • 2014-02-16
    • 2023-03-25
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多