c++ - glTexSubImage 会导致黑色纹理,而 glTexImage 效果很好

标签 c++ image opengl glsl

当我使用 glTexImage2D 绑定(bind)图像时,它渲染得很好。

首先是片段着色器中的代码:

uniform sampler2D tex;
in vec2 tex_coord;
// main:
fragment_out = mix(
                   texture(tex, tex_coord),
                   vec4(tex_coord.x, tex_coord.y, 0.0, 1.0),
                   0.5
                   );

使用此代码,它绘制图像:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 
             0, GL_RGBA, GL_UNSIGNED_BYTE, image);

working fine

但是如果我通过 glTexSubImage2D 绑定(bind)它,纹理将被绘制为黑色。

glTexStorage2D(GL_TEXTURE_2D,
               1,
               GL_RGBA,
               width, height);
glTexSubImage2D(GL_TEXTURE_2D,
                0,
                0, 0,
                width, height,
                GL_RGBA,
                GL_UNSIGNED_BYTE,
                image);

not working at all

当我在第二个代码中将 GL_RGBA 替换为 GL_RGBA8GL_RGBA16 时,渲染会失真。

distorted

这是整个纹理加载和绑定(bind)代码:

GLuint texture; 
glGenTextures(1, &texture);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
int width, height;
unsigned char *image = SOIL_load_image(Resource::getPath("Images/2hehwdv.jpg").c_str(), &width, &height, 0, SOIL_LOAD_RGBA);
std::cout << SOIL_last_result() << std::endl;
std::cout << width << "x" << height << std::endl;
glTexStorage2D(GL_TEXTURE_2D,
               1,
               GL_RGBA,
               width, height);
glTexSubImage2D(GL_TEXTURE_2D,
                0,
                0, 0,
                width, height,
                GL_RGBA,
                GL_UNSIGNED_BYTE,
                image);

//glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glGenerateMipmap(GL_TEXTURE_2D);

有人可以向我解释一下这种行为吗?

最佳答案

glTexStorage2D( GL_TEXTURE_2D, 1, GL_RGBA, width, height );
                                  ^^^^^^^ not sized

GL_RGBA 是一种未调整大小的格式。

glTexStorage2D()internalFormat 参数必须传递 sized internal format

glTexStorage2D()之后调用glGetError()would have returned GL_INVALID_ENUM:

GL_INVALID_ENUM is generated if internalformat is not a valid sized internal format.

尝试使用Table 1中的大小格式就像GL_RGBA8

关于c++ - glTexSubImage 会导致黑色纹理,而 glTexImage 效果很好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18900685/

相关文章:

c++ - 创建保龄球游戏。更改 X 轴时修改球的形状

c++ - 具有不同顺序或变量的模板类(颜色/像素类)

html - 带横向和纵向的幻灯片

c++ - 这个 operator< 语法是什么?

c++ - 使用 openCV 查找图像轮廓

Android 在图像捕获时内存不足

opengl - glXSwapBuffers() 阻塞直到 vblank

c++ - 在 Qml 场景下使用 OpenGL 渲染时出现奇怪的错误

C++:追加到 vector 字符串

c++ - 使用快速排序算法的类型问题