我正在尝试加载.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);
该窗口应包含指定的纹理,相反,我得到一个带有异常的白色窗口。
答案 0 :(得分:0)
参数STBI_rgb
表示要加载具有3个颜色通道的生成纹理。这导致图像缓冲区(image
)每像素3个字节。
但是,当您通过glTexImage2D
指定二维纹理图像时,指定的格式为GL_RGBA
,建议使用4个通道,因此每个像素4个字节。
这导致超出范围读取数据缓冲区。将格式参数更改为GL_RGB
,以解决该问题。
进一步请注意,默认情况下OpenGL假定图像每行的开头对齐4个字节。这是因为GL_UNPACK_ALIGNMENT
参数默认为4。由于图像具有3个颜色通道,并且包装紧密,因此行的开头可能未对齐。
在指定二维纹理图像(glTexImage2D
)之前,将GL_UNPACK_ALIGNMENT
参数更改为1。
此外,纹理还不完整(mipmap)。 GL_TEXTURE_MIN_FILTER
的初始值为GL_NEAREST_MIPMAP_LINEAR
。如果不进行更改并且不创建mipmap,则纹理不是“完整”的,也不会是“显示的”。参见glTexParameter
。
将缩小过滤器设置为GL_NEAREST
或GL_LINEAR
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
或通过glGenerateMipmap(GL_TEXTURE_2D)
生成mipmap来解决该问题。
例如:
glBindTexture(GL_TEXTURE_2D, t);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);