C++ glTexImage2D访问冲突

C++ glTexImage2D访问冲突,c++,opengl,memory,textures,C++,Opengl,Memory,Textures,我已经发布了这个问题,但没有得到任何有用的答案。我正在尝试在OpenGL中创建两个纹理。最初我是这样做的: 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_2

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

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);
unsigned int texture1,texture2;
glGenTextures(1和1);
glBindTexture(GL_TEXTURE_2D,texture1);
glTexParameteri(GL_纹理2D、GL_纹理包裹S、GL_重复);
glTexParameteri(GL_纹理2D、GL_纹理包裹、GL_重复);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
int宽度、高度、通道数;
stbi设置垂直翻转加载(真);
unsigned char*data=stbi_load(“C:\\Users\\A\\Desktop\\wall.jpg”、&width、&nrChannels、0);
如果(数据)
{
GLTEXAGE2D(GL_纹理_2D,0,GL_RGB,宽度,高度,0,GL_RGB,GL_无符号字节,数据);
GLGENATEMIPMAP(GL_纹理_2D);
}
其他的
{
std::cout表达式
(i=0)

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, (i = 0) ? GL_RGB : GL_RGBA, GL_UNSIGNED_BYTE, data);
这导致
for
循环的
控制变量
i
连续设置为0,并且循环从未终止

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

(i == 0) ? GL_RGB : GL_RGBA

注意,表达式

(i = 0) ? GL_RGB : GL_RGBA
被评估为

0 ? GL_RGB : GL_RGBA
导致

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

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


@箭鱼这不是重复的,因为
(i=0)
问题在这个问题上,而不是在另一个问题上。@Rabbid76在这方面你是对的。但是,因为那里的代码基本上与你在回答中指出的缺陷相同,所以这两个问题又回到了现状。
GL_RGBA