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

时间:2018-10-29 17:44:27

标签: c opengl

问题图片:

foreground service

我发现有一些偏离图片的地方。我认为纹理位置有问题,但我无法解决此问题

我的代码:

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();

这是我的第一个问题 我不知道这是正确的,但谢谢你。

2 个答案:

答案 0 :(得分:1)

Windows Bitmap文件的文件头为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。

这意味着GL_UNPACK_ALIGNMENT参数必须设置为1,然后才能将紧密打包的纹理加载到GPU(glTexImage2D)。
否则,在纹理查找时,每行的偏移量为0-3字节。这将导致连续扭曲或倾斜的纹理。

glPixelStore(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data+54);

答案 1 :(得分:0)

一个人需要一张裸露的GL_UNSIGNED_BYTE GL_RGB图像,而那可能不是该图像。 OpenGL完全不提供任何文件格式支持。您可以使用GIMP这样保存文件,但这将是一个大文件,(经过BMP标头后,未压缩的位图24BPP是一种这样的格式。)一种更可持续的解决方案是以已知格式保存文件并使用库对其进行解压缩。我最喜欢的一些是