gpt4 book ai didi

opengl - OpenGL中纹素和屏幕像素之间的一对一映射

转载 作者:行者123 更新时间:2023-12-03 23:56:50 24 4
gpt4 key购买 nike

我正在使用 OpenGL 执行以下操作。我的屏幕尺寸为 512*512。我有一个与屏幕大小相同的纹理。我想绘制一个覆盖整个屏幕的四边形,并在像素和纹素之间建立一对一的映射,这样我就可以做 texelFetch在着色器中使用屏幕坐标。

首先,如果我设置四边形的角,如下所示:

(-1, 1)+-----------+(1,1)
| |
| |
| |
| |
| |
(-1,-1)+-----------+(1,-1)

并将它们对应的纹理坐标设置为:
(0,511)+-----------+(511,511)
| |
| |
| |
| |
| |
(0, 0)+-----------+(511,0)

我刚刚使用以下片段着色器获得了一个白屏,它试图为其四个边界分配不同的颜色:
#version 330

in vec2 fUV; // sent from vertex shader

out vec4 color;

void main() {
if (fUV.x == 0) // leftmost
color = vec4(1.0, 0.0, 0.0, 1.0);
else if (fUV.y == 0) // bottom
color = vec4(0.0, 1.0, 0.0, 1.0);
else if (fUV.x == 511) // rightmost
color = vec4(0.0, 0.0, 1.0, 1.0);
else if (fUV.y == 511) // top
color = vec4(1.0, 0.0, 1.0, 1.0);
else // otherwise
color = vec4(1.0, 1.0, 1.0, 1.0);

// check if uv equals an integer
if (fUV.y == 100)
color = vec4(0.0, 0.0, 0.0, 1.0);
}

这意味着所有平等测试都失败了。

其次,如果我添加半像素宽度偏移 d= 1.0 / 512到所有-1坐标:
(-1+d, 1 )+-----------+(1,1)
| |
| |
| |
| |
| |
(-1+d,-1+d)+-----------+(1,-1+d)

保持其他东西不变,我在屏幕上画了最左边的红线。

我得到的上述结果确实令人困惑。为什么只画了最左边的一列而没有画最下面的一列?

我想知道我应该如何绘制一个四边形并设置它们的坐标,以便我可以在像素和纹素之间建立一对一的映射。

最佳答案

您将像素误解为点。默认情况下,OpenGL 将它们视为中心具有半整数坐标的正方形。这意味着如果您提交以下纹理坐标:

(0,511)+-----------+(511,511)
| |
| |
| |
| |
| |
(0, 0)+-----------+(511,0)

然后是屏幕坐标处的右下片段 (511, 0)将在 (511.5, 0.5) 采样, 并将得到纹理坐标插值 (510.501, 0.499023) .

有几种方法可以实现您的目标。
  • 使用以下纹理坐标并截断:
    (0,512)+-----------+(512,512)
    | |
    | |
    | |
    | |
    | |
    (0, 0)+-----------+(512,0)

    现在在 (511.5, 0.5) 处插入坐标给 (511.5, 0.5) , 并截断为整数给出 (511, 0) ,这是 texelFetch 的像素坐标.
  • 使用gl_FragCoord.xy而不是纹理坐标。它包含与前一项中的插值纹理坐标相同的数字。
  • 使用归一化 [0,1] 纹理坐标和 texture而不是 texelFetch查找:
    (0,1)+-----------+(1,1)
    | |
    | |
    | |
    | |
    | |
    (0,0)+-----------+(1,0)

    如果您的视口(viewport)与纹理的大小完全相同,那么这将在像素和纹素之间建立精确的映射。

    这种方法是最灵活的,我强烈推荐给其他人。
  • 关于opengl - OpenGL中纹素和屏幕像素之间的一对一映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44342070/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com