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

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

ps:我不需要标准化。

【问题讨论】:

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

标签: c++ opengl glsl shader


【解决方案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。查看其他答案。
猜你喜欢
  • 2017-04-30
  • 1970-01-01
  • 2020-03-19
  • 2019-06-20
  • 2023-03-25
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多