В OpenGL 4.6 я (пытаюсь) создать и инициализировать текстуру сплошного цвета следующим образом:
glCreateTextures(GL_TEXTURE_2D, 1, &_textureHandle);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); // This doesn't change the outcome
std::vector<unsigned char> data(3 * WIDTH * HEIGHT, static_cast<unsigned char>(200));
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, data.data());
Затем я использую текстуру в Dear ImGUI следующим образом:
ImGui::Image((void*)(intptr_t) _textureHandle, ImVec2(WIDTH, HEIGHT));
Однако это просто показывает черную текстуру.
Я также пробовал другой способ инициализации (безрезультатно):
unsigned char* data = new unsigned char[3 * WIDTH * HEIGHT];
for (unsigned int i = 0; i < (int)(WIDTH * HEIGHT); i++) {
data[i * 3] = (unsigned char)255;
data[i * 3 + 1] = (unsigned char)50;
data[i * 3 + 2] = (unsigned char)170;
}
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
Кто-нибудь знает, что я делаю неправильно?
Если не генерировать мип-карты (с glGenerateMipmap
), вы должны установить GL_TEXTURE_MIN_FILTER
на фильтр без MIP-карт. Текстура будет «Mipmap Incomplete», если вы не измените функцию минимизации на GL_NEAREST
или GL_LINEAR
.
Или сгенерируйте MIP-карты:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, data.data());
glGenerateMipmap(GL_TEXTURE_2D);
Или используйте GL_LINEAR
для функции минификации:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP);
Вы создали текстуру с помощью OpenGL 4.5 DSA, но не использовали DSA для установки параметров текстуры и изображения.
Вы должны использовать glTextureParameter
, glTextureStorage2D
и glTextureSubImage2D
вместо glTexParameter
и glTexImage2D
.
glCreateTextures(GL_TEXTURE_2D, 1, &_textureHandle);
glTextureParameteri(_textureHandle, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTextureParameteri(_textureHandle, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTextureParameteri(_textureHandle, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTextureParameteri(_textureHandle, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
std::vector<unsigned char> data(3 * WIDTH * HEIGHT, static_cast<unsigned char>(200));
glTextureStorage2D(_textureHandle, 1, GL_RGB8, WIDTH, HEIGHT);
glTextureSubImage2D(_textureHandle, 0, 0, 0, WIDTH, HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, data.data());
Большое спасибо! Я знал, что есть функции, которые объединяют вызовы
Gen
иBind
, но я не знал, что это называется DSA, и я не знал, что эти два типа функций нельзя использовать взаимозаменяемо. Но есть одно но: аргумент внутреннего формата дляglTextureStorage2D()
должен бытьGL_RGB8
вместоGL_RGB
.