2012-07-16 81 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