【发布时间】:2014-07-17 00:21:49
【问题描述】:
我正在尝试使用 OpenGL 和 GLSL 着色器实现点的最近邻搜索。 NN 计算工作正常,并将结果绘制到大小为 1024x1024 的纹理中(使用当前屏幕大小的视口)。 结果只包含一个 vec4 保存邻居的位置。
现在重要的部分是: 持有 vec4 的纹素正好位于点投影到的位置(我正在寻找邻居的点)。所以理论上,为了访问任意点的邻居,我将其世界位置投影到屏幕坐标并使用这些坐标来访问纹理(例如,使用texelFetch)。
如果我在顶点着色器中进行点投影并使用 gl_FragCoord 访问片段程序中的纹理,则此方法有效。但是现在我遇到了一种新情况,即这些点仅在片段着色器中可用(通过纹理/缓冲区访问),因此我必须手动计算屏幕位置。
我尝试了以下方法自行计算 gl_FragCoord,但它不起作用(仅限空白结果):
vec4 pointPos = ... //texture lookup
vec4 transformedPos = matProjectionOrtho * pointPos;
transformedPos.xy /= transformedPos.w;
transformedPos.xy = transformedPos.xy * 0.5f + 0.5f;
transformedPos.xy = vec2(transformedPos.x * textureWidth,
transformedPos.y * textureHeight);
投影矩阵matProjectionOrtho 对于所有渲染通道都是相同的,只是一个正交投影。 textureWidth 和 textureHeight 是保存相邻数据的纹理大小(通常为 1024x1024)。
屏幕/纹理位置的计算是否正确?
【问题讨论】:
-
您的问题的表述方式有点问题,但是...如果您要投影一个世界位置,那么除了您的之外,您还应该乘以一个视图矩阵投影矩阵。
-
@AndonM.Coleman 投影应该是独立于视图的,这就是为什么不使用视图矩阵的原因。 PS:我的母语不是英语,很抱歉措辞不好。还在练习:-)
-
投影不可能独立于视图。您需要一个方向来决定将什么投影到您的图像平面上。世界空间坐标没有说方向。如果您说您的坐标在视图空间中,那对我来说会更有意义。
-
有一个很好的视觉表示我的意思here。教科书 GL 将 view-space eye-space 称为 view-space eye-space,但它们是同一事物的两个词……有时您可能还会看到它称为 camera-space。