C++ glTexSubImage产生黑色纹理,而glTexImage效果良好

C++ glTexSubImage产生黑色纹理,而glTexImage效果良好,c++,image,opengl,glsl,C++,Image,Opengl,Glsl,当我使用glTexImage2D绑定图像时,它的渲染效果很好 首先,片段着色器中的代码: 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
绑定图像时,它的渲染效果很好

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

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

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

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

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

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

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);
GLuint纹理;
glGenTextures(1,&纹理);
玻璃纹理(GL_纹理0);
glBindTexture(GL_TEXTURE_2D,纹理);
int宽度、高度;
unsigned char*image=SOIL_load_image(Resource::getPath(“Images/2hehwdv.jpg”).c_str(),&宽度和高度,0,SOIL_load_RGBA);
标准::cout
GL_RGBA
是一种无大小限制的格式

internalFormat
参数必须传递一个

glGetError()
调用
gltextorage2d()
GL\u INVALID\u ENUM

如果
internalformat
不是有效大小的内部格式,则生成
GL\u INVALID\u ENUM


glTexStorage2D()
call
GL\u RGBA
上,尝试使用类似
GL\u RGBA8

的大小调整格式。GL\u RGBA
看起来不是有效的大小调整格式。试试
GL_RGBA8
@genpfault你说得对,我只需在
gltextorage2d
中用
GL_RGBA8
替换
GL_RGBA8
(不在
glTexSubImage2D
中)。你能把这个加上解释吗?
glTexStorage2D( GL_TEXTURE_2D, 1, GL_RGBA, width, height );
                                  ^^^^^^^ not sized