如何绘制二维采样器?

问题描述 投票:0回答:1

我是 GLSL 新手,完全不知道自己在做什么。我一直在寻找学习资源,但是,大多数资源要么非常笼统,如着色器书,要么非常令人难以抗拒,如此参考资料

不管怎样,我正在寻找“碎片”到底是什么。我认为它只是指需要渲染的像素。如果是这种情况,

gl_FragCoord
返回什么?我已经搞乱了它,我不认为它返回当前片段的 x,y,但着色器书说

“vec4 gl_FragCoord,它保存活动线程正在处理的像素或屏幕片段的屏幕坐标。”

我还看到它返回从 0 到 1 的值,最初是 (0.5,0.5)。我不知道 (0.5,0.5) 指的是什么。是屏幕的百分比吗?就像在 800px x 800px 的屏幕上 0.5,0.5 会对应 400,400 吗?如果是这样,为什么这种事情不起作用:

void main() {
  vec4 screencol = texture2D(displayimg, gl_FragCoord.xy*vec2(width,height));
  gl_FragColor = screencol;
}

宽度和高度存储屏幕尺寸并显示为sampler2D。

我只是想渲染一个sampler2D,我一定错过了一些东西,因为这看起来应该是非常标准和可实现的。使用上面的代码我得到一个错误:

OpenGL error 1282 at top endDraw(): invalid operation
glsl processing
1个回答
2
投票

gl_FragCoord.xy
包含窗口相对坐标。左下片段的坐标为 (0.5, 0.5)。右上角片段的坐标为 (width-0.5, height-0.5)。请参阅
gl_FragCoord

但是纹理坐标必须在 [0.0, 1.0] 范围内指定。 左下角坐标为(0.0,0.0)。右上角坐标为(1.0, 1.0)。
texture2D
的参数需要是纹理坐标:

vec4 screencol = texture2D(displayimg, gl_FragCoord.xy*vec2(width,height));

vec4 screencol = texture2D(displayimg, gl_FragCoord.xy / vec2(width, height));
© www.soinside.com 2019 - 2024. All rights reserved.