困难接踵而至,不论是想深入研究还是快速了解全貌,对于我来说,看来不是件容易的事。继投影之后,连续看完了redbook中关于光照、位图、纹理三个章节。光照一节,看完之后虽然知道如何使用api,但始终有一种不快的感觉,不知其来龙去脉,为什么要这样定义api?出于物理实现还是另有其它?想从物理中找些答案,搜索了一下午,也没有什么头绪,只好暂时打处好奇的心。
位图一节,同样也是被其API的设定搞晕了,似乎OpenGL中显存是封闭的,只能用接口去访问,而无法使用指针读写,所以不理解为什么glReadPixel, glCopyPixel, glDrawPixel不能用一个BitBlt来搞定。同样为什么要单独搞个glBitmap?不能用glDrawPixel去统一吗?同样,像素格式搞得太灵活了,以至于使用不是太方便。由于显存是封闭的,那么像素在显存中的组织方式也就不劳我们操心了,操心也是白操心,按照redbook的说法,如果要求的内部像素格式在当前的OpenGL实现中或设备上不能支持时,OpenGL会选择一种与要求最接近的内部表示。
为了搞清楚OpenGL关于位图API的使用,尝试从本地载入一幅BMP图片来显示。OpenGL专注于图形渲染,像位图解码这些功能自然是没有的。虽然BMP解析很简单,但这里还是使用了FreeImage这个专业的开源图片解码库。
static void init()
{
FIBITMAP *dib;
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glClearColor(0, 0, 0, 0);
FreeImage_Initialise(0);
dib = FreeImage_Load(FIF_BMP, "e://1.bmp", 0);
bits = FreeImage_GetBits(dib);
bmpw = FreeImage_GetWidth(dib);
bmph = FreeImage_GetHeight(dib);
}
static void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1, 1, 0);
glRasterPos2d(0, 0);
glDrawPixels(bmpw, bmph, GL_RGB, GL_UNSIGNED_BYTE, bits);
glFlush();
}
static void reshape(int width, int height)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D (0, (GLfloat)width, 0, (GLfloat)height);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
OK, 可以显示了,但是颜色不太正常,估计就是RGB和BGR搞反了。改成GL_BGR试试,结果居然编译不过,又是版本太低的问题,真是要晕死了。可恶的微软到现在还只支持1.1,自己的DirectX却已经到10了,什么叫垄断啊。幸好还有Mesa。
位图一节,同样也是被其API的设定搞晕了,似乎OpenGL中显存是封闭的,只能用接口去访问,而无法使用指针读写,所以不理解为什么glReadPixel, glCopyPixel, glDrawPixel不能用一个BitBlt来搞定。同样为什么要单独搞个glBitmap?不能用glDrawPixel去统一吗?同样,像素格式搞得太灵活了,以至于使用不是太方便。由于显存是封闭的,那么像素在显存中的组织方式也就不劳我们操心了,操心也是白操心,按照redbook的说法,如果要求的内部像素格式在当前的OpenGL实现中或设备上不能支持时,OpenGL会选择一种与要求最接近的内部表示。
为了搞清楚OpenGL关于位图API的使用,尝试从本地载入一幅BMP图片来显示。OpenGL专注于图形渲染,像位图解码这些功能自然是没有的。虽然BMP解析很简单,但这里还是使用了FreeImage这个专业的开源图片解码库。
static void init()
{
FIBITMAP *dib;
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glClearColor(0, 0, 0, 0);
FreeImage_Initialise(0);
dib = FreeImage_Load(FIF_BMP, "e://1.bmp", 0);
bits = FreeImage_GetBits(dib);
bmpw = FreeImage_GetWidth(dib);
bmph = FreeImage_GetHeight(dib);
}
static void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1, 1, 0);
glRasterPos2d(0, 0);
glDrawPixels(bmpw, bmph, GL_RGB, GL_UNSIGNED_BYTE, bits);
glFlush();
}
static void reshape(int width, int height)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D (0, (GLfloat)width, 0, (GLfloat)height);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
OK, 可以显示了,但是颜色不太正常,估计就是RGB和BGR搞反了。改成GL_BGR试试,结果居然编译不过,又是版本太低的问题,真是要晕死了。可恶的微软到现在还只支持1.1,自己的DirectX却已经到10了,什么叫垄断啊。幸好还有Mesa。
本文探讨了OpenGL中关于位图的API使用难点,包括光照、位图和纹理等概念的理解,以及通过FreeImage库加载BMP文件的具体实现过程。
1701





