CUDA by Example 4.2.2 一个有趣的例子之 CPU_bitmap.h解析

19 篇文章 0 订阅
8 篇文章 0 订阅

         在《CUDA by Example》4.2.2中有一个很有趣的例子,里面用到了两个头文件,由于我里面的代码实在看不懂,咱就先来研究一下这段代码的头文件吧.

       这篇主要讲的是 CPU_bitmap.h 这个头文件,在这个头文件里还包含了一个头文件,欲知详情,请参看:http://blog.csdn.net/fulva/article/details/8208229,gl_helper.h 是用来针对不同编译环境来选择不同编译头文件的,不看不是很要紧。下面这个程序一度让我很混乱 。

       下面我们来解析这个程序:


/*源代码载入地址: http://code.google.com/p/snp-gpgpu/source/browse/trunk/f/common/cpu_bitmap.h?r=4 */

/*看不懂头两行和最后一行是做什么事情的时候,参考 http://blog.csdn.net/fulva/article/details/8208312  */


#ifndef __CPU_BITMAP_H__
#define __CPU_BITMAP_H__

#include "gl_helper.h"

/*创建了一个叫做 CPUBitmap的结构体 */

/*对struct 和 class 有困惑的人可以看:http://blog.csdn.net/tigernana/article/details/7606773 */

struct CPUBitmap

{
        unsigned char    *pixels;       /*像素点的总个数*/
        int     x, y;                              /*图像的长宽*/
        void    *dataBlock;                /*  */

       /*对void指针不太熟悉的人,可以参看 http://pcedu.pconline.com.cn/empolder/gj/c/0509/702366_all.html  */
        void (*bitmapExit)(void*);     /*这是一个函数 */


        /*受C语言影响,对struct有疑惑的,请参看: http://leeing.org/2010/01/31/struct-vs-class-in-cpp/  */
        CPUBitmap( int width, int height, void *d = NULL )

        {
                pixels = new unsigned char[width * height * 4];   /*计算总的像素点数,并分配新的空间*/
                x = width;                                                                      /*图像的宽*/
                y = height;                                                                     /*图像的高*/
               dataBlock = d;                                                                /* */                                           
        }

        /*析构函数*/
        ~CPUBitmap()

        {

              /*删除像素点*/

              delete [] pixels;       
         }

        /*取得所有像素点*/       

        unsigned char* get_ptr( void ) const   { return pixels; }

        /*取得图片总大小*/

        long image_size( void ) const { return x * y * 4; }
 

       

        void display_and_exit( void(*e)(void*) = NULL )

        {
                      CPUBitmap**   bitmap = get_bitmap_ptr();
                      *bitmap = this;
                      bitmapExit = e;


                      // a bug in the Windows GLUT implementation prevents us from
                      // passing zero arguments to glutInit()
                      int c=1;
                      char* dummy = "";

                      /*glutInit,对 GLUT (OpenGl 里面的一个工具包,包含很多函数)进行初始化,这个函数必须在其它的 GLUT使用之前调用一次。其格式比较死板,一般照抄这句glutInit(&argc, argv)就可以了*/

                      glutInit( &c, &dummy );        

                      /*设置显示方式,其中 GLUT_RGBA 表示使用 RGBA 颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色) ;GLUT_SINGLE 表示使用单缓冲,。与之对应的还有 GLUT_DOUBLE(使用双缓冲)。*/    
                      glutInitDisplayMode( GLUT_SINGLE | GLUT_RGBA );

                      /*这个也简单,设置窗口的大小*/

                      glutInitWindowSize( x, y );

                      /*根据前面设置的信息创建窗口。参数将被作为窗口的标题。注意:窗口被创建后,并不立即显示到屏幕上。需要调用 glutMainLoop 才能看到窗口。*/

                      glutCreateWindow( "bitmap" );

                     /* http://tieba.baidu.com/p/296729172  当有普通按键被按,调用Key函数*/   
                      glutKeyboardFunc(Key);

                      /* 设置一个函数,当需要进行画图时,这个函数就会被调用。*/
                      glutDisplayFunc(Draw);

                      /*显示窗口*/

                      glutMainLoop();

          }

         // static method used for glut callbacks
         static CPUBitmap** get_bitmap_ptr( void )

        {
                 static CPUBitmap   *gBitmap;
                 return &gBitmap;
         }

         // static method used for glut callbacks
        static void Key(unsigned char key, int x, int y)

        {

                    /* 如果按键按的是Esc按键,则退出程序。*/


                        switch (key)

                        {
                                      case 27:
                                      CPUBitmap*   bitmap = *(get_bitmap_ptr());
                                      if (bitmap->dataBlock != NULL && bitmap->bitmapExit != NULL)
                                                                    bitmap->bitmapExit( bitmap->dataBlock );
                                      exit(0);
                          }
           }

       // static method used for glut callbacks

        /* 画图 */
        static void Draw( void )

        {
                 CPUBitmap*   bitmap = *(get_bitmap_ptr());

                 /*设置背景颜色*/
                 glClearColor( 0.0, 0.0, 0.0, 1.0 );

                 /*清除。GL_COLOR_BUFFER_BIT 表示清除颜色*/
                 glClear( GL_COLOR_BUFFER_BIT );

                 /* http://blog.csdn.net/ghost129/article/details/4409565 绘制像素点 */

                 glDrawPixels( bitmap->x, bitmap->y, GL_RGBA, GL_UNSIGNED_BYTE, bitmap->pixels );

                 /*保证前面的 OpenGL 命令立即执行(而不是让它们在缓冲区中等待)。其作用跟 fflush(stdout)类似。*/
                 glFlush();
        }
};

#endif  // __CPU_BITMAP_H__

参考书籍:《Cuda by Exampe》

参考链接:



  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值