如何解决OpenGL 纹理位图偏移问题
我正在尝试加载位图图像,然后将其用作纹理以应用于多边形。大部分工作正常,但位图似乎有偏移:
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>
int width = 64;
int height = 64;
unsigned char * data = NULL;
void load_image_data(const char * image_path)
{
FILE * file = fopen(image_path,"rb");
if (file == NULL) {
printf("Unable to open <%s>!\n",image_path);
exit(1);
}
data = calloc(width * height * 3,sizeof(unsigned char));
fread(data,width * height * 3,1,file);
fclose(file);
}
void display(void)
{
gluint texture;
glGenTextures(1,&texture);
glBindTexture(GL_TEXTURE_2D,texture);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
gluBuild2DMipmaps(GL_TEXTURE_2D,3,width,height,GL_BGR,GL_UNSIGNED_BYTE,data);
glTexImage2D(GL_TEXTURE_2D,data);
glMatrixMode(GL_PROJECTION);
glOrtho(0,-1,0);
glClear(GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D,texture);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2i(0,0);
glVertex2i(0,0);
glTexCoord2i(0,1);
glVertex2i(0,height);
glTexCoord2i(1,1);
glVertex2i(width,0);
glVertex2i(width,0);
glEnd();
gldisable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,0);
glFlush();
}
int main(int argc,char ** argv)
{
load_image_data("squares.bmp");
glutinit(&argc,argv);
glutinitdisplayMode(gluT_SINGLE | gluT_RGB);
glutinitwindowSize(width,height);
glutinitwindowPosition(0,0);
glutCreateWindow("Squares!");
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glClearColor(0,0);
glutdisplayFunc(display);
glutMainLoop();
free(data);
return 0;
}
我正在使用以下命令编译它:
gcc squares.c -g -o squares -lglut -lglu -lGL
然后执行它:
./squares
这是我正在使用的图像:
然后这是程序执行后的屏幕截图:
我似乎找不到任何原因。
我还阅读了位图格式,并尝试将 fread()
读取的数据偏移 54 个字节以跳过标题 - 但这没有任何效果。
编辑 #1(作者):
我决定进行一些额外的测试。似乎图像从原点(0,0 = 左下角)开始的部分被向上推了 1 个像素,并占据了图像最右侧的 18 个像素。
无论图像的大小如何,这似乎都是恒定的。 (目前使用的是 64x64 像素的图片)。
所以,它偏移了 -18,-1 - 但是当它到达图像实际开始的部分时,-1 被重置为 0 ...如果这是有道理的......它不会我。
解决方法
嗯,我觉得很傻。当我说我试图阅读 BMP 的标题时 - 我做错了。或者至少在错误的参数中设置了 54 字节的偏移量。
无论如何,解决方案是将 load_image_data()
函数更改为以下内容:
void load_image_data(const char * image_path)
{
FILE * file = fopen(image_path,"rb");
unsigned char info[54];
if (file == NULL) {
printf("Unable to open <%s>!\n",image_path);
exit(1);
}
fread(info,sizeof(unsigned char),54,file);
width = *(int *) &info[18];
height = *(int *) &info[22];
data = calloc(width * height * 3,sizeof(unsigned char));
fread(data,width * height * 3,file);
fclose(file);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。