你如何绘制 sampler2D?

How do you draw a sampler2D?

我是 Glsl 的新手,完全不知道自己在做什么。我一直在寻找学习资源,但是,其中大多数都非常笼统,例如 the book of shaders or really overwhelming like this reference

无论如何,我正在寻找“片段”到底是什么。我认为它只是指需要渲染的像素。如果是这种情况,gl_FragCoord return 是什么意思?我弄乱了它,我不认为它 return 是当前片段的 x,y 但着色器书说

"vec4 gl_FragCoord, which holds the screen coordinates of the pixel or screen fragment that the active thread is working on."

我还看到它 returns 的值从 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 包含 window 相对坐标。左下方片段的坐标为 (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));