glTexImage2D 访问冲突
glTexImage2D acces violation
我已经 post 编辑了这个问题,但没有得到任何有用的答案。我正在尝试在 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);
此代码运行良好,没有任何可见问题。显然,两次构建这些纹理都是完全相同的过程,所以我想我会改用 for 循环:
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 中 0x03C78893 (ig9icd32.dll) 处未处理的异常:0xC0000005:访问冲突读取位置 0x0A47B000。
我相信你可以指出很多你不喜欢代码的地方,或者以后可能会成为问题的东西,但鉴于我真的只是想要这个特定问题的答案,请不要post 一个答案,除非你有真正能让这段代码编译的东西。
表达式(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 个颜色通道并越界访问 data
缓冲区。这会导致读取数据时出现访问冲突:
0xC0000005: Access violation reading location 0x0A47B000.
我已经 post 编辑了这个问题,但没有得到任何有用的答案。我正在尝试在 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);
此代码运行良好,没有任何可见问题。显然,两次构建这些纹理都是完全相同的过程,所以我想我会改用 for 循环:
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 中 0x03C78893 (ig9icd32.dll) 处未处理的异常:0xC0000005:访问冲突读取位置 0x0A47B000。
我相信你可以指出很多你不喜欢代码的地方,或者以后可能会成为问题的东西,但鉴于我真的只是想要这个特定问题的答案,请不要post 一个答案,除非你有真正能让这段代码编译的东西。
表达式(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 个颜色通道并越界访问 data
缓冲区。这会导致读取数据时出现访问冲突:
0xC0000005: Access violation reading location 0x0A47B000.