首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我的OpenGL纹理是黑色的(在亲爱的ImGUI)?

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

Stack Overflow用户
提问于 2022-05-11 21:45:18
回答 2查看 364关注 0票数 2

在OpenGL 4.6中,我(尝试)创建并初始化一个实色纹理如下:

代码语言:javascript
运行
复制
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());

然后我使用亲爱的ImGUI中的纹理,如下所示:

代码语言:javascript
运行
复制
ImGui::Image((void*)(intptr_t) _textureHandle, ImVec2(WIDTH, HEIGHT));

然而,这只是显示一个黑色的纹理。

我还尝试了一种不同的初始化方法(但没有结果):

代码语言:javascript
运行
复制
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);

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-12 12:15:37

您通过OpenGL 4.5DSA创建了纹理,但没有使用DSA来设置纹理参数和图像。

您必须使用glTextureParameterglTextureStorage2DglTextureSubImage2D,而不是glTexParameterglTexImage2D

代码语言:javascript
运行
复制
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());
票数 3
EN

Stack Overflow用户

发布于 2022-05-12 04:57:49

如果不生成mipmaps (使用glGenerateMipmap),则必须将GL_TEXTURE_MIN_FILTER设置为非mipmap过滤器。如果不将缩小功能更改为GL_NEARESTGL_LINEAR,则纹理将是"Mipmap不完全“。

Eiter生成mipmap:

代码语言:javascript
运行
复制
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, data.data());
glGenerateMipmap(GL_TEXTURE_2D);

或者使用GL_LINEAR作为小型化函数:

代码语言:javascript
运行
复制
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72207931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档