[英]OpenGL Texture Loading issue with images that Crossed each other
问题图片:
我发现有些人偏离了形象。 我认为纹理位置是问题,但我无法解决这个问题
我的代码:
GLuint LoadTexture(const char * filename, int width, int height)
GLuint texture;
unsigned char * data;
FILE * file;
file = fopen(filename, "r");
if (file == NULL) return 0;
data = (unsigned char *)malloc(width * height * 3);
fread(data, width * height * 3, 1, file);
fclose(file);
// RGB
for (int i = 0; i < width * height; ++i)
{
int index = i * 3;
unsigned char B, R;
B = data[index];
R = data[index + 2];
data[index] = R;
data[index + 2] = B;
}
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND); // GL_REPLACE에서 교체했음
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); // GL_CLAMP
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
return texture;
和
glBindTexture(GL_TEXTURE_2D, texture_image[2]);
glBlendFunc(GL_ONE, GL_ONE);
glBegin(GL_QUADS);
glTexCoord2i(0, 0); glVertex3f(-32, -32, 0);
glTexCoord2i(0, 1); glVertex3f(-32, 32, 0);
glTexCoord2i(1, 1); glVertex3f(32, 32, 0);
glTexCoord2i(1, 0); glVertex3f(32, -32, 0);
glEnd();
这是我的第一个问题,我不知道这是对的,但谢谢。
Windows位图文件的文件头为54个字节。 我这个标题是编码文件的格式。
如果你知道,文件格式是24位RGB,那么你可以简单地跳过标题。
data = (unsigned char *)malloc(width * height * 3 + 54);
fread(data, width * height * 3 + 54, 1, file);
fclose(file);
.....
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data+54);
进一步注意,默认情况下,假设纹理的每一行与4个字节对齐。
在24位RGB BMP图像中,每个纹素都需要24位或3字节,并且像素紧密堆积,尤其是纹理行。 这意味着忽略了纹理线开始的4个字节的对齐(除了纹理宽度的3倍可被4整除而没有剩余)。
在你的情况下这没有任何问题,因为你的纹理具有64像素和64 * 3可以被4分割。但是如果每行的字节数不能被4分割,则必须将对齐更改为1。
这意味着在将紧密压缩的纹理加载到GPU( glTexImage2D
)之前,必须将GL_UNPACK_ALIGNMENT
参数设置为1。
否则,在纹理查找时获得每行0-3字节的偏移。 这将导致连续扭曲或倾斜的纹理。
glPixelStore(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data+54);
一个人需要一个裸GL_UNSIGNED_BYTE GL_RGB图像,这可能不是那个图像。 OpenGL
根本不提供任何文件格式支持。 您可以使用例如GIMP
保存文件,但这将是一个大文件,(编辑:未压缩的位图24BPP,一旦超过BMP标头,就是一种这样的格式。)更可持续的解决方案是保存文件以已知格式并使用库来解压缩它。 我最喜欢的是,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.