Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用STBI_image OpenGL加载图像时在0x69ABF340引发异常_C++_Opengl_Textures - Fatal编程技术网

C++ 使用STBI_image OpenGL加载图像时在0x69ABF340引发异常

C++ 使用STBI_image OpenGL加载图像时在0x69ABF340引发异常,c++,opengl,textures,C++,Opengl,Textures,我试图加载一个.jpg图像作为背景,我加载了stbi_load,但是当我尝试绘制纹理时,我得到以下错误: 在0x69ABF340(nvoglv32.dll)处引发异常 0xC0000005:访问冲突读取位置0x0C933000。发生 我尝试在加载图像时更改通道,可能图像不是rgb而是rgba,但没有成功 int width = 1280; int height = 720; int channels = 3; GLuint t; stbi_set_flip_ver

我试图加载一个.jpg图像作为背景,我加载了stbi_load,但是当我尝试绘制纹理时,我得到以下错误: 在0x69ABF340(nvoglv32.dll)处引发异常 0xC0000005:访问冲突读取位置0x0C933000。发生

我尝试在加载图像时更改通道,可能图像不是rgb而是rgba,但没有成功

int width = 1280;
    int height = 720;
    int channels = 3;
    GLuint t;
    stbi_set_flip_vertically_on_load(true);
    unsigned char *image = stbi_load("bg.jpg",
        &width,
        &height,
        &channels,
        STBI_rgb);
    glEnable(GL_TEXTURE_2D);
    glGenTextures(1, &t);

    glBindTexture(GL_TEXTURE_2D, t);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

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

    glBindTexture(GL_TEXTURE_2D, 0);

该窗口应包含指定的纹理,而我得到的是一个白色窗口,但有一个例外。

参数
STBI\u rgb
指示加载一个包含3个颜色通道的纹理。这导致图像缓冲区(
image
)由每像素3个字节组成

但是,当您指定二维纹理图像时,指定的格式为
GL\u RGBA
,这表示每个像素有4个通道和4个字节。
这会导致数据缓冲区读取超出范围。将format参数更改为
GL\u RGB
,以解决此问题

进一步注意,默认情况下,OpenGL假定图像每行的开头对齐4个字节。这是因为默认情况下参数为4。由于图像有3个颜色通道,并且排列紧密,因此行的开头可能未对齐。
在指定二维纹理图像之前,将参数更改为1(
glTexImage2D

此外,纹理(mipmap)不完整。
GL\u TEXTURE\u MIN\u FILTER
的初始值为
GL\u NEAREST\u MIPMAP\u LINEAR
。如果不更改它,也不创建mipmap,则纹理不是“完整”的,也不会“显示”。请参阅。
将缩小过滤器设置为
GL\u NEAREST
GL\u LINEAR

glTexParameteri(GL\u纹理\u 2D,GL\u纹理\u最小\u过滤器,GL\u最近);
或通过生成mipmap来解决此问题

e、 g:

glBindTexture(GL_TEXTURE_2D,t);
glTexParameteri(GL_纹理2D、GL_纹理包裹S、GL_重复);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glPixelStorei(GLU解包对齐,1);
GLTEXAGE2D(GL_纹理_2D,0,GL_RGB,宽度,高度,0,GL_RGB,GL_无符号字节,图像);

谢谢,这修复了异常。但是,我现在得到一个黑色窗口。@WillRobert我扩展了答案,可能缺少
glTexParameteri(GL\u纹理\u 2D,GL\u纹理\u最小\u过滤器,GL\u最近)