为什么我的OpenGL纹理是黑色的(在亲爱的Imgui中)?

发布于 2025-01-28 06:35:32 字数 1229 浏览 3 评论 0原文

在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());

然后,我在此类似的dearimgui中使用纹理:

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);

有人知道我在做什么错吗?

In OpenGL 4.6, I (attempt to) create and initialize a solid color texture as follows:

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());

I then use the texture in Dear ImGUI like this:

ImGui::Image((void*)(intptr_t) _textureHandle, ImVec2(WIDTH, HEIGHT));

However, this simply shows a black texture.

I also tried a different way of initialization (to no avail):

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);

Does anyone know what I'm doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

哎呦我呸! 2025-02-04 06:35:32

您通过OpenGL 4.5 DSA创建了纹理,但没有使用DSA设置纹理参数和图像。
您必须使用gltextureParametergltexturestorage2dgltexturesubimage2d而不是gltexparameterglteximage2d

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());

You created the texture by OpenGL 4.5 DSA, but didn't use DSA to set the texture parameters and image.
You have to use glTextureParameter, glTextureStorage2D and glTextureSubImage2D instead of glTexParameter and 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());
ˉ厌 2025-02-04 06:35:32

如果不生成 mipmaps (with glgeneratemipmap 您必须设置gl_texture_min_filter非MIPMAP过滤器。如果您不将缩小功能更改为gl_nearestgl_linear,则纹理将是“ MIPMAP不完整”。

EITER生成MIPMAP:

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);

If don't generate mipmaps (with glGenerateMipmap) you must set GL_TEXTURE_MIN_FILTER to a non mipmap filter. The texture would be "Mipmap Incomplete" if you do not change the minifying function to GL_NEAREST or GL_LINEAR.

Eiter generate mipmaps:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, data.data());
glGenerateMipmap(GL_TEXTURE_2D);

Or use GL_LINEAR for the minifying function:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文