你怎么画一个sampler2D?

问题描述

我是 Glsl 的新手,完全不知道我在做什么。然而,我一直在寻找要学习的资源,其中大多数要么像 the book of shaders 一样非常笼统,要么像 this reference 一样令人难以抗拒。

无论如何,我正在寻找“片段”究竟是什么。我认为它只是指需要渲染的像素。如果是这种情况, 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;
}

其中 width 和 height 存储屏幕尺寸,而 displayimg 是一个 sampler2D。

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

OpenGL error 1282 at top endDraw(): invalid operation

感谢您的帮助。

ps,这对您掌握 glsl 的人来说可能令人难以置信,对不起

解决方法

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));