gl_FragCoord 的范围是多少
Posted
技术标签:
【中文标题】gl_FragCoord 的范围是多少【英文标题】:What is the range of gl_FragCoord 【发布时间】:2013-05-29 23:09:36 【问题描述】:gl_FragCoord.xy
的范围是多少?我知道gl_FragCoord
s 是屏幕坐标,但实际范围是多少? ( 0, width - 1 )
还是 ( 1, width )
?当我进行一些基于 fragcoord 的计算时,glsl 编译器会生成什么样的错误(如果有)说我做了类似gl_FragCoord.x - 5
的事情?
ps:我不需要标准化。
【问题讨论】:
为什么你会认为如果你从另一个数字中减去一个数字,编译器会产生错误? 是的,你是对的。我的意思是将它们用作数组索引:)。 【参考方案1】:我对@987654323@ 的实际范围进行了测试,通过使用以下着色器代码和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 区别