回 帖 发 新 帖 刷新版面

主题:[原创]OpenGL入门学习——第十课

现在放出第十课的内容。

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

[url=http://www.programfan.com/club/showbbs.asp?id=184355]第一课,编写第一个OpenGL程序[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=184525]第二课,绘制几何图形[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=184769]第三课,绘制几何图形的一些细节问题[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=185032]第四课,颜色的选择[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=196017]第五课,三维的空间变换[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=196231]第六课,动画的制作[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=218828]第七课,使用光照来表现立体感[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=219518]第八课,使用显示列表[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=224877]第九课,使用混合来实现半透明效果[/url]
第十课,BMP文件与像素操作  ——→  [color=0000FF]本次课程的内容[/color]

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

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

回复列表 (共26个回复)

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; 
}

22 楼

谢谢`凯猪`贴出的资料和代码~

23 楼


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

24 楼

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

25 楼

支持一下

26 楼

为了拜读你的大作,今天注册了.希望能继续如此好文章,已经不能称为帖子了.呵呵

我来回复

您尚未登录,请登录后再回复。点此登录或注册