当前位置: 首页 > 知识库问答 >
问题:

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

居乐池
2023-03-14

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

共有1个答案

南宫奇思
2023-03-14

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

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

我仍然会设置统一的值,只是为了让它明确。在这种情况下,如果不设置制服,如果使用的纹理单位不是0,则更可能无法设置制服。

 类似资料:
  • “我在我的申请中发现了一个奇怪的行为,希望你能解释给我听。”。你看,我有两个3D纹理,它们被发送到片段着色器,渲染得非常好。但有一个问题,当我创建另一个纹理(它是1D纹理)时,一个黑屏正在被渲染,而不是正确的前一个结果。 关于这个1D纹理,我甚至没有将其发送到片段着色器。当我调用glTexImage1D(…)时,黑屏就出现了。我评论这句话,它就消失了!!这两种纹理被渲染。 我觉得纹理单位肯定有问题

  • 好的,所以我需要创建我自己的纹理/图像数据,然后在OpenGL中将它显示到一个四边形上。我让四边形工作,我可以用我自己的纹理加载器在上面显示一个TGA文件,它完美地映射到四边形。 但是我如何创建自己的“自制图像”,即每个像素1000x1000和3个通道(RGB值)?纹理数组的格式是什么,例如如何将像素(100,100)设置为黑色? 这就是我对完全白色的图像/纹理的想象: 编辑:下面的答案是正确的,

  • 我有一个从路径创建纹理的类,但当我尝试加载具有3个通道(rgb)的纹理时,它会在运行这一行时出现读取访问冲突异常 我试图改变stbi加载函数中的参数,但是没有用。 当我加载图像时,它设置了正确的宽度、高度和通道数据,所以我不知道我做错了什么 指向数据的指针也不是nullptr

  • 我总是只画一个纹理,选择0纹理单位 选择其他纹理单元的标准是什么? 我的意思是:如果我必须处理多个纹理,我应该选择哪个单元?我是openGL的初学者,我想知道我是否可以使用相同的0纹理单元来制作所有的图形纹理。有多少个纹理单元?如果有N个纹理单元,我最多可以使用N个纹理吗?

  • OpenGL标准是否要求应该给一个程序没有绑定到纹理单元的统一采样器2D给出一个texture 2d操作的结果? 例如在像素着色器中: 在该计划中: 对于上下文,我想知道是否可以对纹理实体和非纹理实体使用相同的着色器,其中(希望如此),我只需要确保没有任何东西绑定到GL_TEXTURE_2D,以便texture2d()返回0,0,0,1。否则,我需要为每个置换使用一个着色器。

  • 我需要在着色器中使用两个纹理,一个在顶点着色器中,另一个在片段着色器中。在这两种情况下,它们都在着色器中引用,例如