首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >glTexImage2D访问违反

glTexImage2D访问违反
EN

Stack Overflow用户
提问于 2018-09-22 11:50:24
回答 1查看 1.2K关注 0票数 1

我已经发了这个问题,但没有得到任何有用的答案。我试图在OpenGL中创建两个纹理。起初我是这样做的:

代码语言:javascript
复制
unsigned int texture1, texture2;
glGenTextures(1, &texture1);
glBindTexture(GL_TEXTURE_2D, texture1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
int width, height, nrChannels;
stbi_set_flip_vertically_on_load(true);
unsigned char *data = stbi_load("C:\\Users\\A\\Desktop\\wall.jpg", &width, &height, &nrChannels, 0);
if (data)
{
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
    glGenerateMipmap(GL_TEXTURE_2D);
}
else
{
    std::cout << "Failed to load texture" << std::endl;
}
stbi_image_free(data);
glGenTextures(1, &texture2);
glBindTexture(GL_TEXTURE_2D, texture2);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
data = stbi_load("C:\\Users\\A\\Desktop\\awesomeface.png", &width, &height, &nrChannels, 0);
if (data)
{
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
    glGenerateMipmap(GL_TEXTURE_2D);
}
else
{
    std::cout << "Failed to load texture" << std::endl;
}
stbi_image_free(data);

这段代码运行的很好,没有明显的问题。显然,两次构建这些纹理都是完全相同的过程,所以我想我应该使用for循环来代替:

代码语言:javascript
复制
unsigned int textures[2];
int width, height, nrChannels;
unsigned char *data = stbi_load("C:\\Users\\A\\Desktop\\wall.jpg", &width, &height, &nrChannels, 0);
glGenTextures(2, textures);
for (int i = 0; i < 2; i++)
{
    if (i == 1)
    {
        stbi_image_free(data);
        data = stbi_load("C:\\Users\\A\\Desktop\\awesomeface.png", &width, &height, &nrChannels, 0);
    }
    glBindTexture(GL_TEXTURE_2D, (i == 0) ? textures[0] : textures[1]);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    if (data)
    {
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, (i = 0) ? GL_RGB : GL_RGBA, GL_UNSIGNED_BYTE, data);
        glGenerateMipmap(GL_TEXTURE_2D);
    }
    else
    {
        std::cout << "Failed to load texture!" << std::endl;
    }
}

但是,这段代码完全与LearnOpenGL.exe: 0xC0000005:访问冲突读取位置0x0A47B000中0x03C78893 (ig9icd32.dll)处的错误:未处理异常完全中断。

我相信你可以指出很多你不喜欢的代码,或者可能会成为一个问题的东西,但既然我只是想要一个具体的问题的答案,请不要发布一个答案,除非你有一些东西,实际上会使这段代码编译。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-22 11:55:10

表达式(i = 0)

代码语言:javascript
复制
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, (i = 0) ? GL_RGB : GL_RGBA, GL_UNSIGNED_BYTE, data);

这导致i循环的控制变量for连续设置为0,并且循环永远不会终止。

您必须使用比较运算符==而不是赋值运算符=

代码语言:javascript
复制
(i == 0) ? GL_RGB : GL_RGBA

注意,表达式

代码语言:javascript
复制
(i = 0) ? GL_RGB : GL_RGBA

被评估为

代码语言:javascript
复制
0 ? GL_RGB : GL_RGBA

这会导致

代码语言:javascript
复制
GL_RGBA

第一个图像是带有3个颜色通道的图像,但是由于操作错误,您尝试读取4个彩色通道并访问超出边界的data缓冲区。这将导致读取数据时出现访问冲突:

0xC0000005:访问冲突读取位置0x0A47B000。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52456419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档