c++ - 没有纹理图像单元的 Opengl 纹理

标签 c++ opengl 3d textures

最近我发现了一个 Opengl 示例,它应用单个纹理而不指定纹理图像单元并且没有将相应的单元整数统一发送到着色器,是否可以在不使用纹理单元的情况下应用纹理?或者它只是为事件纹理单元及其着色器采样器值使用默认值。

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

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_TEXTURE0,因此如果只使用纹理单元 0,则无需调用 glActiveTexture()
  • Uniform 的默认值为 0,这是引用纹理单元 0 的采样器的正确值。

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

关于c++ - 没有纹理图像单元的 Opengl 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23998861/

相关文章:

C++ 忽略并清除缓冲区

c++ - 调用模板显式实例化时如何开启自动匹配?

c++ - 尝试使用 OpenGL 时出错

java - JOGL 阴影贴图

c++ - Opengl 着色器 vec3 未更新

css - 3D CSS 变换 - 变换 :rotateX(180deg);

java - Android 围绕其中心旋转位图

java - 无法加速像素修改的 BufferedImages

c++ - 无法从对 main() 的函数调用正确返回值

c++ - 从指针创建 Mat