【问题标题】:Why GL_CLAMP matters here?为什么 GL_CLAMP 在这里很重要?
【发布时间】:2012-07-16 18:24:19
【问题描述】:

我正在运行this example

但在变化:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

到:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);

我在顶部和右侧看到的图像略有不同。

但是从代码中可以看出:

glBegin(GL_QUADS);
//lower left
glTexCoord2f(0, 0); 
glVertex2f(-1.0, -1.0);
//upper left
glTexCoord2f(0, 1.0);
glVertex2f(-1.0, 1.0);
//upper right
glTexCoord2f(1.0, 1.0);
glVertex2f(1.0, 1.0);
//lower right_
glTexCoord2f(1.0, 0); 
glVertex2f(1.0, -1.0);
glEnd();

纹理不会超出范围,为什么 GL_CLAMP 很重要?

【问题讨论】:

    标签: opengl


    【解决方案1】:

    在片段着色器中,颜色与当前纹素右上角的颜色混合。纹理坐标中添加了vec2(0.0625, 0.0625)。因此,在查找更高或等于 (1.0 - 0.0625) = 0.9375 的纹理坐标时,您始终使用 GL_CLAMP 获得相同的值。

    void main() {
        vec4 s1 = texture2D(tex0, gl_TexCoord[0].st);
        vec4 s2 = texture2D(tex1, gl_TexCoord[0].st + vec2(0.0625, 0.0625));
        gl_FragColor = mix(vec4(1, s1.g, s1.b, 0.5), vec4(s2.r, s2.g, 1, 0.5), 0.5);
    }
    

    【讨论】:

    • 你能解释一下0.0625=1.0/16这个神奇的值是从哪里来的吗?
    • @StevenLu 我刚刚发现这个向量被添加到纹理坐标中,因此可以计数超过 1.0,GL_CLAMP 发挥作用。要了解着色器中实际执行的操作,您最好询问author of this code
    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 2021-08-27
    相关资源
    最近更新 更多