opengl - gl_FragCoord 中的 1/w 坐标代表什么?

标签 opengl fragment-shader

gl_FragCoord 变量存储四个分量:(x, y, z, 1/w)

w 坐标是什么?为什么将其存储为 1/w

最佳答案

GLSL 和 OpenGL 规范在这方面不必要地令人困惑。 OpenGL 规范更容易理解:gl_FragCoord 存储窗口空间顶点位置的 X、Y 和 Z 分量。 X、Y 和 Z 值的计算方式与计算窗口空间位置时所描述的相同(尽管像素中心和左上角原点可以修改 X 和 Y 值)。规范的坐标变换部分对此进行了描述。

gl_FragCoord 的 W 分量为 (1/Wc),其中 Wc剪辑空间 顶点位置。它是来自顶点着色器的 gl_Position.w

保留 Wc 的唯一有用目的是 reverse-transform gl_FragCoord恢复剪辑空间位置。正如该页面所示,需要乘以 Wc。但由于 gl_FragCoord 仅存储该值的倒数,因此现在需要除以 gl_FragCoord.w

因此,我们可以假设 OpenGL 以这种方式存储它,因为 OpenGL 不允许有太多意义;)看,OpenGL 规范的每个部分都必须有一些有点无意义的东西,这是一条规则。 XYZ 组件太有意义了,因此他们决定让它存储您实际想要的值的倒数。

好吧,从技术上讲,这是 3D Labs 创建 GLSL 时代的历史工件。我确信他们这样做纯粹是出于自私的硬件原因,但我没有真正的证据证明这一点。

关于opengl - gl_FragCoord 中的 1/w 坐标代表什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10389040/

相关文章:

libgdx - 如何创建和使用非常大的调色板纹理以在 opengl 中使用?

opengl - GLU NURBS 渲染错误

c++ - 写入超过 1 个输出的片段着色器错误

opengl - 应用 Material 时着色效果不佳

c - OpenGL 模型、 View 、投影矩阵

android - 通过 fragment 着色器将 YUV 转换为 RGB

c++ - 为 Qt5 指定 OpenGL 桌面而不是 ES

java - 在 GLSL 片段着色器中将 YUV (yCbCr420p) 转换为 RGB?

c++ - glUseProgram() 和 glUseShaderProgram() 有什么区别?

c++ - Eclipse C++ OpenGL - 无法构建项目