glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->x, texture->y, 0, GL_RED, GL_UNSIGNED_BYTE, reinterpret_cast<void*>(full_texture));
这在技术上是合法的,但是never一个好主意。
首先,你需要了解第三个参数是什么glTexImage2D
是。这就是实际情况图像格式的纹理。您不是用一个通道创建纹理;而是用一个通道创建纹理。你正在创建一个纹理four渠道。
接下来,您需要了解最后三个参数的作用。这些是像素传输参数;它们描述了您提供给 OpenGL 的像素数据是什么样的。
该命令的意思是,“创建一个 4 通道纹理,然后将一些数据上传到just红色通道。该数据存储为无符号字节数组。”仅将数据上传到some纹理的通道在技术上是合法的,但几乎不是一个好主意。如果您要创建单通道纹理,则应该使用单通道纹理。这意味着正确的图像格式。
接下来,事情变得更加混乱:
new_texture->datasize = texture_width * texture_height*4;
您对“*4”的使用强烈表明您正在创建四通道像素数据。但您只上传单通道数据。你的其余计算与此一致;你似乎从未填写过任何数据通行证full_texture[texture_width * texture_height]
。所以你分配的内存可能比你需要的多。
最后一件事:always使用大小的内部格式。永远不要只使用GL_RGBA
; use GL_RGBA8
or GL_RGBA4
管他呢。不要让司机选择并希望它能给你一个好的选择。
所以,正确的上传应该是这样的:
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, texture->x, texture->y, 0, GL_RED, GL_UNSIGNED_BYTE, full_texture);
仅供参考:reinterpret_cast
是不必要的;即使在 C++ 中,指针也可以隐式转换为void*
.