繁体   English   中英

OpenGL纹理加载相互交叉的图像的问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM