请登陆或者注册新用户 用户名 密码 记住密码 注册新用户

回 帖 快速回帖 发 新 帖 刷新版面
主题:[原创]OpenGL入门学习——第十课

作者:eastcowboy

专家分:25080

级别:126级别:126级别:126级别:126级别:126

发表时间:2007-4-19 20:10:00    [回复] 
楼主
现在放出第十课的内容。

首先还是以前课程的连接:

第一课,编写第一个OpenGL程序
第二课,绘制几何图形
第三课,绘制几何图形的一些细节问题
第四课,颜色的选择
第五课,三维的空间变换
第六课,动画的制作
第七课,使用光照来表现立体感
第八课,使用显示列表
第九课,使用混合来实现半透明效果
第十课,BMP文件与像素操作  ——→  本次课程的内容

今天我们先简单介绍Windows中常用的BMP文件格式,然后讲OpenGL的像素操作。虽然看起来内容可能有点多,但实际只有少量几个知识点,如果读者对诸如“显示BMP图象”等内容比较感兴趣的话,可能不知不觉就看完了。
像素操作可以很复杂,这里仅涉及了简单的部分,让大家对OpenGL像素操作有初步的印象。

=====================未完,请勿跟帖=====================

 

作者:`凯猪`

专家分:190

级别:1

发表时间:2008-2-23 15:41:00    [回复]  [引用]
21楼
学完本课后自己也试着写了个,哈哈,好使
#include <stdlib.h>
#include <iostream.h>
#include <stdio.h>
#include <gl/glut.h> 
#include <gl/gl.h> 
GLvoid* pPD;
GLint ImgW,ImgH;


//函数功能:加载24bit位图(*.bmp)到内存
//      参数:文件名 || 返回的图像宽 || 返回的图像高 || 返回的错误类型
//     Err:(1:打开文件错误 | 2:文件类型错误 | 3:分配内存错误 | 4:文件长度不足或文件类型错误)
//    返回值:内存指针 || NULL
GLvoid* k_LoadBmp(const char* FileName,GLint* ImageWidth,GLint* ImageHeight,int* Err)
{
    GLint TempInt;
    GLuint PixelLength;
    GLbyte TempByte;
    GLvoid* pPixelData;
    FILE* pFile;
    pFile=fopen(FileName, "rb");
    if(!pFile)
    {
        *Err = 1;         
        return NULL;
    }
//_______________check bmp file
    fseek(pFile, 0x0000, SEEK_SET);
    fread(&TempByte, 1, 1, pFile);
    if (TempByte != 'B')
    {
        *Err = 2;
        fclose(pFile);
        return NULL;
    }
    fread(&TempByte, 1, 1, pFile);
    if (TempByte != 'M')
    {
        *Err = 2;
        fclose(pFile);
        return NULL;
    }
    fseek(pFile, 0x000a, SEEK_SET);
    fread(&TempInt, 4, 1, pFile);
    if (TempInt != 0x0036)
    {
        *Err = 2;
        fclose(pFile);
        return NULL;
    }
    fseek(pFile, 0x001c, SEEK_SET);
    fread(&TempInt, 4, 1, pFile);
    if (TempInt != 0x0018)
    {
        *Err = 2;
        fclose(pFile);
        return NULL;
    }
    fseek(pFile, 0x0002, SEEK_SET);
    fread(&TempInt, 4, 1, pFile);
    fseek(pFile, 0x0022, SEEK_SET);
    fread(&PixelLength, 4, 1, pFile);
    if (TempInt - PixelLength != 0x0036)
    {
        *Err = 2;
        fclose(pFile);
        return NULL;
    }
//_______________check bmp file
//_______________read pixeldata
    fseek(pFile, 0x0012, SEEK_SET);
    fread(ImageWidth, 4, 1, pFile);
    fread(ImageHeight, 4, 1, pFile);
    pPixelData =(GLvoid*)malloc(PixelLength);
    if(pPixelData == NULL)
    {
        *Err = 3;
        fclose(pFile);
        return NULL;
    }
    fseek(pFile, 0x0036, SEEK_SET);
     if(fread(pPixelData, 1, PixelLength, pFile) != PixelLength) 
    {
        *Err = 4;
        fclose(pFile);
        return NULL;
    }
    fclose(pFile);
//_______________read pixeldata
    *Err = 0;
    return pPixelData; 
}


void display() 

    glClear(GL_COLOR_BUFFER_BIT);
    glDrawPixels(ImgW, ImgH, GL_BGR_EXT, GL_UNSIGNED_BYTE, pPD);
    glutSwapBuffers();


int main(int argc, char **argv) 

    int err;
    pPD=k_LoadBmp("d:\\a.bmp", &ImgW, &ImgH, &err);
    if(!pPD)
    {
        cout<<err<<endl;
        return 0;
    }
    glutInit(&argc, argv); 
    glutInitDisplayMode (GLUT_DOUBLE| GLUT_RGBA);  
    glutInitWindowSize (700, 700); 
    glutInitWindowPosition(10,10);      
    glutCreateWindow ("kapig");        
    glutDisplayFunc (display);       
    glutMainLoop();       
    return 0; 
}

  最后修改于2008-2-23 16:11:00

作者:eastcowboy

专家分:25080

级别:126级别:126级别:126级别:126级别:126

发表时间:2008-2-23 21:25:00    [回复]  [引用]
22楼
谢谢`凯猪`贴出的资料和代码~

 

作者:newjunwei

专家分:0

级别:1

发表时间:2008-7-27 10:12:00    [回复]  [引用]
23楼

请问一下怎么能在mfc中用鼠标移动物体,我用了gluUnProject()但出现问题,不够稳定。
怎么才能实现,鼠标具体怎么响应啊?详细点,谢谢

 

作者:eastcowboy

专家分:25080

级别:126级别:126级别:126级别:126级别:126

发表时间:2008-7-27 18:49:00    [回复]  [引用]
24楼
gluUnProject可以根据鼠标的位置得知到底点击到了哪个物体,但如果要让物体随着鼠标的移动而在三维空间中移动,目前我也并没有一个清晰的思路。倘若有一天想到的话,或许我会把它单独的做为本教程的一课。
有一个取巧的办法。当鼠标点中一个物体后,把属于该物体的像素读取出来作为鼠标的图案(跟随鼠标移动)。这样或许可以达到一种近似的效果。

 

作者:卧龙孔明

专家分:240

级别:2

发表时间:2008-7-29 11:23:00    [回复]  [引用]
25楼
支持一下

  最后修改于2008-7-29 11:37:00

作者:longx13

专家分:0

级别:1

发表时间:2008-8-23 0:21:00    [回复]  [引用]
26
为了拜读你的大作,今天注册了.希望能继续如此好文章,已经不能称为帖子了.呵呵

 

[首页] [上页]  [下页] [尾页]     共有 26 回帖 当前第 2 页(共2页 20帖/页)     跳转至第
回 帖 快速回帖 发 新 帖 刷新版面

版主管理:  删除此帖   转贴   置顶   取消精华   强制结帖   >>>进入管理页面