为什么我的OpenGL纹理是黑色的(在亲爱的Imgui中)?
在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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您通过OpenGL 4.5 DSA创建了纹理,但没有使用DSA设置纹理参数和图像。
您必须使用
gltextureParameter
,gltexturestorage2d
和gltexturesubimage2d
而不是gltexparameter
和glteximage2d
。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
andglTextureSubImage2D
instead ofglTexParameter
andglTexImage2D
.如果不生成 mipmaps (with
glgeneratemipmap
您必须设置gl_texture_min_filter
非MIPMAP过滤器。如果您不将缩小功能更改为gl_nearest
或gl_linear
,则纹理将是“ MIPMAP不完整”。EITER生成MIPMAP:
或使用
gl_linear
进行缩放功能:If don't generate mipmaps (with
glGenerateMipmap
) you must setGL_TEXTURE_MIN_FILTER
to a non mipmap filter. The texture would be "Mipmap Incomplete" if you do not change the minifying function toGL_NEAREST
orGL_LINEAR
.Eiter generate mipmaps:
Or use
GL_LINEAR
for the minifying function: