OpenGL текстуры без текстуры изображения единиц

0

недавно я нашел пример 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);
}
  • 0
    Это возможно, но требует расширения. Концепция известна как бесконечные текстуры . Единицы текстурного изображения - это искусственная конструкция в GL, аппаратное обеспечение фактически всегда работало, передавая ссылки на саму память текстур, и не имеет реального механизма связывания. TIU по сути являются просто государственными контейнерами; они упрощают размещение и проверку текстур, но не являются необходимыми.
Теги:
opengl
3d
textures

1 ответ

2
Лучший ответ

Это будет работать и находится в пределах спецификаций:

  • Единицей текстуры по умолчанию является GL_TEXTURE0, поэтому нет необходимости когда-либо вызывать glActiveTexture() если используется только единица текстуры 0.
  • Униформа имеет значение по умолчанию 0, что является правильным значением для сэмплера, который ссылается на блок текстуры 0.

Я все равно всегда ставил бы однородные значения, чтобы сделать их явными. Если вы не установите форму в этом случае, гораздо более вероятно, что вы пропустите, чтобы установить его, если вы когда-либо использовали блок текстуры, отличный от 0.

  • 0
    спасибо, это объясняет это очень хорошо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню