2012-07-16 82 views
0

我跑this example为什么GL_CLAMP在这里很重要?

但改变:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 

到:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 

和我在顶部和右侧有一个稍微不同的图像。

enter image description here

但作为从代码中看出:

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事项?

回答

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

你能解释一下这个'0.0625' ='1.0/16'的魔法值来自哪里吗? – 2012-07-16 21:36:10

+0

@StevenLu我刚刚发现这个矢量被添加到纹理坐标,因此它可以计数超过1.0,其中'GL_CLAMP'进场。要了解着色器中实际做了什么,最好问一下[此代码的作者](http://stackoverflow.com/a/3585515/344480)。 – Matthias 2012-07-17 09:37:15