gl_FragCoord 的范围是多少

Posted

技术标签:

【中文标题】gl_FragCoord 的范围是多少【英文标题】:What is the range of gl_FragCoord 【发布时间】:2013-05-29 23:09:36 【问题描述】:

gl_FragCoord.xy 的范围是多少?我知道gl_FragCoords 是屏幕坐标,但实际范围是多少? ( 0, width - 1 ) 还是 ( 1, width )?当我进行一些基于 fragcoord 的计算时,glsl 编译器会生成什么样的错误(如果有)说我做了类似gl_FragCoord.x - 5 的事情?

ps:我不需要标准化。

【问题讨论】:

为什么你会认为如果你从另一个数字中减去一个数字,编译器会产生错误? 是的,你是对的。我的意思是将它们用作数组索引:)。 【参考方案1】:

我对@9​​87654323@ 的实际范围进行了测试,通过使用以下着色器代码和glReadPixels(0, 0, 1024, 1024, GL_RED, GL_FLOAT, xxx) 从我的帧缓冲区对象中获取着色器的输出,并且 FBO 附加了一个内部格式为 @ 的纹理987654325@.

out highp vec4 Output;

void main()

    Output = vec4(gl_FragCoord.xy, 0.0, 1.0);

实际结果是:gl_FragCoord.xy 在 [0.5, 1023.5] 范围内,而不是 [0.0, 1023.0]。

【讨论】:

来自spec: "默认情况下,gl_FragCoord 假定窗口坐标的左下角原点并假定像素中心位于半像素坐标处。例如,(x, y) 位置 (0.5, 0.5) 为窗口中最左下角的像素返回" 注意像素中心 概念。 khronos.org/opengl/wiki/… 有两个布局限定符会影响结果。 origin_upper_left 和 pixel_center_integer。 pixel_center_integer 会移动半个像素,这样每个像素的中心都是一个整数值。 谢谢,我用vec4 coord=gl_FragCoord-0.5; int index = int(coord.y * width + coord.x);【参考方案2】:

gl_FragCoord 坐标从 0 开始索引。

表达式gl_FragCoord.x - 5 将产生一个范围为 [-5, (width - 5) - 1] 的值

【讨论】:

谢谢。我想这是常识。 :) 不完全。默认情况下 GL 使用像素中心采样,因此添加 0.5。查看其他答案。

以上是关于gl_FragCoord 的范围是多少的主要内容,如果未能解决你的问题,请参考以下文章

启用 msaa 时 gl_FragDepth 是不是等于 gl_FragCoord.z?

gl_FragCoord.x, y, z 对于所有像素为 1,w 为深度

WebGL—gl_Position gl_FragCoord gl_PointCoord 区别

WebGL—gl_Position gl_FragCoord gl_PointCoord 区别

MCSession 的距离范围是多少?

每个片段照明和窗口到相机的转换