OpenGL使用MS Paint自制纹理触发nvoglv64.dll访问异常如何解决
问题原因
你的代码在调用glTexImage2D时硬编码了源格式为GL_RGBA,但MS Paint默认导出的无透明层PNG图片是3通道(RGB)格式,从谷歌下载的PNG大多自带Alpha通道属于4通道格式,刚好匹配你写死的参数才没有报错。
当你加载Paint生成的3通道图片时,stbi_load返回的像素数据每像素只有3字节,OpenGL却按照每像素4字节读取,直接触发内存越界访问,就抛出了nvoglv64.dll(NVIDIA显卡驱动模块)的访问违规异常,和透明像素的具体取值没有关系。
修复方案
你可以任选以下一种方法解决:
- 方案1:强制stb_image自动把所有图片转成4通道返回,不需要修改纹理上传参数。把stbi_load的最后一个参数从
0改成4即可:
unsigned char* data = stbi_load("res/textures/BlackFrame.png", &width, &height, &numChannels, 4);
- 方案2:根据读取到的通道数动态指定上传格式:
GLenum format; if (numChannels == 1) format = GL_RED; else if (numChannels == 3) format = GL_RGB; else if (numChannels == 4) format = GL_RGBA; glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
额外提示:调用glTexImage2D之前可以加一行glPixelStorei(GL_UNPACK_ALIGNMENT, 1),避免因为图片宽度不是4的倍数导致纹理颜色错位的问题。
内容的提问来源于stack exchange,提问作者Anton Loubman
相关产品推荐
相关产品推荐

