2017-10-11 72 views
1

这里是我的片段着色器:奇怪的事情我在片段着色器纹理

#version 330 core 
in vec2 param_uv; 
uniform sampler2D uniform_texturetoto; 
out vec3 color; 
void main() 
{ 
    color = texture(uniform_texturetoto, param_uv).rgb; 
} 

,这里是一片我主要的C++代码:

GLuint textureID; 
glGenTextures(1, &textureID); 
glBindTexture(GL_TEXTURE_2D, textureID); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texture->w, texture->h, 0, GL_RGB, GL_UNSIGNED_BYTE, my_texture_pixels); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

...

glBindTexture(GL_TEXTURE_2D, textureID); 

我的问题是,一切工作正常。这是不正常的,因为uniform_texturetoto从来没有在我的主要C++程序中使用。我可以用任何变量名替换uniform_texturetoto,程序仍然有效!

我的问题是...为什么?

感谢

+0

你是说你没有为uniform_texturetoto调用glGetUniformLocation()并且你没有将它绑定到任何纹理单元,并且代码仍在工作? –

+1

采样器统一的默认值很可能为0.由于您将纹理绑定到纹理单元0,所以一切正常。 – BDL

回答

1

我觉得GLSL的规格已经回答了它

使用4.50规范,4.3.5节有答案:

所有统一变量是只读的,在外部要么初始化在链接时或通过API。链接时初始值是变量初始值设定项的值(如果存在),如果没有初始值设定项,则为0。

我认为这就是为什么你的代码工作正常。