OpenGL 纹理位图偏移问题
OpenGL Texture Bitmap Offset Issue
我正在尝试加载位图图像,然后将其用作纹理以应用于多边形。大部分工作正常,但位图似乎有偏移:
#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, 0, GL_BGR, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, data);
glMatrixMode(GL_PROJECTION);
glOrtho(0, width, 0, height, -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, height);
glTexCoord2i(1, 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, 0, 0);
glutDisplayFunc(display);
glutMainLoop();
free(data);
return 0;
}
我正在使用以下命令编译它:
gcc squares.c -g -o squares -lglut -lGLU -lGL
然后执行:
./squares
这是我正在使用的图像:
下面是程序执行后的截图:
我似乎找不到任何原因。
我也读过位图格式,并尝试将 fread()
读取的数据偏移 54 个字节以跳过 header - 但这没有效果。
编辑 #1(作者):
我决定做一些额外的测试。似乎从原点(0,0 = 左下角)开始的图像部分被向上推了 1 个像素,并占用了图像的 right-most 18 个像素。
这似乎是不变的,无论图像的大小如何。 (目前使用 64x64 像素图像)。
因此,它偏移了 -18,-1 - 但是当它到达图像实际开始的部分时,-1 被重置为 0 ...如果这有意义...它没有'对我来说。
嗯,我觉得很傻。当我说我试图阅读 BMP 的 header 时——我做错了。或者至少在错误的参数中设置 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, sizeof(unsigned char), width * height * 3, file);
fclose(file);
}
我正在尝试加载位图图像,然后将其用作纹理以应用于多边形。大部分工作正常,但位图似乎有偏移:
#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, 0, GL_BGR, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, data);
glMatrixMode(GL_PROJECTION);
glOrtho(0, width, 0, height, -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, height);
glTexCoord2i(1, 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, 0, 0);
glutDisplayFunc(display);
glutMainLoop();
free(data);
return 0;
}
我正在使用以下命令编译它:
gcc squares.c -g -o squares -lglut -lGLU -lGL
然后执行:
./squares
这是我正在使用的图像:
下面是程序执行后的截图:
我似乎找不到任何原因。
我也读过位图格式,并尝试将 fread()
读取的数据偏移 54 个字节以跳过 header - 但这没有效果。
编辑 #1(作者):
我决定做一些额外的测试。似乎从原点(0,0 = 左下角)开始的图像部分被向上推了 1 个像素,并占用了图像的 right-most 18 个像素。
这似乎是不变的,无论图像的大小如何。 (目前使用 64x64 像素图像)。
因此,它偏移了 -18,-1 - 但是当它到达图像实际开始的部分时,-1 被重置为 0 ...如果这有意义...它没有'对我来说。
嗯,我觉得很傻。当我说我试图阅读 BMP 的 header 时——我做错了。或者至少在错误的参数中设置 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, sizeof(unsigned char), width * height * 3, file);
fclose(file);
}