2012-06-03 21 views
20

OpenGL 2.1 numaralı belgede doku örneği okudum. Fragment gölgelendirici şuna benzer:Sampler2d nedir?

#version 120 

uniform sampler2D texture; 
varying vec2 texcoord; 

void main(void) 
{ 
    gl_FragColor = texture2D(texture, texcoord); 
} 

texcoord vertex shader geçirilir.

aşağıdaki C++ render kod kullanılır:

void render() 
{ 
    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, texture_id); 
    glUniform1i(unf_texture, 0); 
} 

Bazı şeyleri karıştı. parça gölgelendirici olarak

  1. , doku (glUniform1i ile) sıfır değeri geçirilir: Bazı soru vardır. Değer gerçekten Sıfır mı? Değer başka bir şey mi?

  2. glActiveTexture gerçekten arandı mı?

  3. Neden glUniform1i'de Sıfır değeri iletiliyor?

cevap

29

Sampler2D, texture unit'a bağlanır. GlUniform çağrısı onu doku birimi sıfıra bağlar. GlActiveTexture çağrısı yalnızca birden çok doku birimi kullanacaksanız gereklidir (çünkü GL_TEXTURE0 zaten varsayılan değerdir).

+24

Her zaman "glActiveTexture" olarak adlandırmak için bir alışkanlık yapmalısınız. Bu şekilde birden fazla doku kullanmanız gerektiğinde, dünyayı kırmayacaksınız. –

+0

açıklığa kavuşturmak - bu nedenle, aynı "GL_TEXTURE0" altında bağlanabilecek her bir yaprağın (1D, 2D, 3D), sampler1D/2D/3D'ye aynı değere (0) geçirilmesi gerektiği doğru mu? ve "GL_TEXTURE1" altında atanan bir doku, 1 değerinin gölgelendiricinin içindeki üniteye geçmesini gerektirebilir? – Chris

+1

@Chris Evet, bu doğru. –