gpt4 book ai didi

c - 使用 Glut 和 C 时纹理扭曲

转载 作者:行者123 更新时间:2023-11-30 16:40:09 25 4
gpt4 key购买 nike

我正在尝试让自己熟悉 XCode 9 中的 GLUT 框架,以用于我将来想要从事的项目,但现在我坚持让纹理正确显示。

所以我的目标是将这个 bmp 图像显示为纹理:

bmp image

到这个红色方 block 所在的位置:

display window

结果是这样的:

error

什么时候应该是这样:

goal

这是我用于初始化纹理的代码。

GLuint loadAndBufferImage(const char * filename){

GLuint texture;
unsigned char header[54];
unsigned int dataPos;
unsigned int width, height;
unsigned int imageSize;

unsigned char * data;

FILE * file = fopen(filename, "rb");
if(!file){printf("Image could not load\n"); exit(2);}

if(fread(header, 1, 54, file) != 54){
printf("Not a correct BMP file.\n");
return -1;
}

if(header[0] != 'B' || header[1] != 'M'){
printf("Not a correct BMP file.\n");
return -1;
}

dataPos = *(int*)&(header[0x0A]);
imageSize = *(int*)&(header[0x22]);
width = *(int*)&(header[0x12]);
height = *(int*)&(header[0x16]);

if(imageSize == 0) imageSize = width * height * 4;
if(dataPos==0) dataPos=54;

data = malloc(imageSize);
if(!data){printf("No more memory\n"); exit(1);}

fread(data, 1, imageSize, file);
fclose(file);

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, data);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

free(data);
return texture;
}

这就是调用该函数的地方。

GameWindow *initializeGameWindow(){


GameWindow *gw = malloc(sizeof(*gw));
if(gw == NULL){
printf("Error: no more memory");
exit(1);
}

gw->render = render;
gw->update = update;
gw->isRunning = isRunning;
gw->setRunning = setRunning;
glClearColor(1.0, 1.0, 1.0, 1.0);

glEnable(GL_TEXTURE_2D);

glViewport(0.0f, 0.0f, _width, _height);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0, _width, 0, _height);
glMatrixMode(GL_MODELVIEW);

glGenBuffers(1, &_vertexBufferID);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferID);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(VertexData), (GLvoid *)offsetof(VertexData, pos));


glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(VertexData), (GLvoid *)offsetof(VertexData, tex));

_textureBufferID = loadAndBufferImage("test.bmp");

return gw;
}

我将猜测并说这与我如何从图像获取数据以及可能的纹理参数有关。如果是这样那么我该如何解决这个问题?否则我还需要做些什么来设置纹理吗?

编辑:因此,我按照建议在纹理初始化代码中的 fread(data, 1, imageSize, file); 上方添加了 fseek(file, (long)dataPos, SEEK_SET);与最初的结果相比,图像似乎发生了一些变化。

new results

我还尝试将 GL_RGBA 和 GL_BGRA 分别更改为 GL_RGB 和 GL_BGR,就像在 glTexImage2D 函数中一样,这发生了。

change to GL_RGB and GL_BRG

编辑 2:因此,经过一些研究和实验,发现另一个问题是因为当我将图像保存为位图时,图像被设置为索引颜色模式而不是RGB颜色模式文件。 (我正在使用 Gimp 编辑器。)它一定会影响数据的存储方式,因为当我比较文件的像素数据部分中的十六进制值和总文件大小时,它们是不同的。但在编辑器中将其切换为RBG颜色模式是解决这个问题的最终关键。

https://image.ibb.co/fC99Lm/Screen_Shot_2017_10_18_at_4_15_36_AM.png

感谢您的帮助。

资源:

https://en.wikipedia.org/wiki/BMP_file_format

http://fac.ksu.edu.sa/sites/default/files/lab08_6.pdf

最佳答案

您已阅读但忽略了dataPos,即图像数据的偏移量。使用

fseek(file, (long)dataPos, SEEK_SET);
fread(data, 1, imageSize, file);

将文件指针定位到数据。原因是标题和图像数据之间可以存在调色板数据。

关于c - 使用 Glut 和 C 时纹理扭曲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46785294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com