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

Posted

技术标签:

【中文标题】没有纹理图像单元的 Opengl 纹理【英文标题】:Opengl Textures without Texture image Units 【发布时间】:2014-06-02 16:10:57 【问题描述】:

最近我发现一个 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);

我的片段着色器:

#version 410

in vec2 texCoordout;

uniform sampler2D mysampler;

out vec4 Fcolor;

void main()

Fcolor = texture (mysampler, texCoordout);

【问题讨论】:

可以,但需要扩展。这个概念被称为无绑定纹理。纹理图像单元是 GL 中的人工构造,硬件实际上总是通过传递对纹理内存本身的引用来工作,并且没有实际的绑定机制。 TIU 本质上只是状态容器;它们使纹理驻留和验证更简单,但它们不是必需的。 【参考方案1】:

这将起作用,并且在规格范围内:

默认纹理单元为GL_TEXTURE0,因此如果只使用纹理单元0,则无需调用glActiveTexture()。 Uniforms 的默认值为 0,这是引用纹理单元 0 的采样器的正确值。

我仍然会始终设置统一值以使其明确。如果您在这种情况下不设置制服,那么如果您曾经使用 0 以外的纹理单元,也很有可能会错过设置它。

【讨论】:

以上是关于没有纹理图像单元的 Opengl 纹理的主要内容,如果未能解决你的问题,请参考以下文章

Opengl 纹理映射和图像分辨率

OpenGL,禁用纹理单元、glActiveTexture 和 glBindTexture

纹理未正确显示 - 可能坐标是错误的 OpenGL、C++

为啥没有实现 OpenGL 灰度纹理性能增益?

纹理不填充图形 - OpenGL

8个纹理单元的opengl es多纹理着色器的思考