没有纹理图像单元的Opengl纹理

Opengl Textures without Texture image Units

本文关键字:Opengl 纹理 单元 纹理图像      更新时间:2023-10-16

最近我发现了一个Opengl的例子,应用a single纹理没有指定纹理图像单位,没有发送相应的单位整数统一到着色器,是否有可能应用纹理不使用纹理单位?或者它只是为活动纹理单元和它的着色器采样器值使用一个默认值。

我的代码块(纹理相关):

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
GLuint TextureID = 0;

SDL_Surface* Surface = IMG_Load("Abrams_Tank.jpg");
glGenTextures(1, &TextureID);
glBindTexture(GL_TEXTURE_2D, TextureID);
int Mode = GL_RGB;
if(Surface->format->BytesPerPixel == 4) {
    Mode = GL_RGBA;
}
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Surface->w, Surface->h, 0, GL_BGRA, GL_UNSIGNED_BYTE, Surface->pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);



GLuint vbo;
GLuint vbo_Text;
GLuint vao;

glGenBuffers(1, &vbo);
glGenBuffers(1, &vbo_Text);
glGenVertexArrays(1, &vao);



glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData) * 30,vertexData, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(sizeof(float) * 18));
glDrawArrays(GL_TRIANGLES, 0,6);

glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glBindBuffer(0, vbo);

my fragment shader:

#version 410
in vec2 texCoordout;
uniform sampler2D mysampler;
out vec4 Fcolor;
void main()
{
Fcolor = texture (mysampler, texCoordout);
}

这将工作,并在规格:

  • 默认的纹理单元是GL_TEXTURE0,所以如果只使用纹理单元0,就不需要调用glActiveTexture()
  • 制服的默认值为0,这是引用纹理单位0的采样器的正确值。

我仍然会设置统一的值,只是为了使它显式。如果你在这种情况下不设置统一,那么当你使用0以外的纹理单位时,你也更有可能错过设置它。