OpenGL学习随笔(五)

本文探讨了OpenGL中关于位图的API使用难点,包括光照、位图和纹理等概念的理解,以及通过FreeImage库加载BMP文件的具体实现过程。
困难接踵而至,不论是想深入研究还是快速了解全貌,对于我来说,看来不是件容易的事。继投影之后,连续看完了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。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值