2014年3月7日星期五(DEMO8-4,实体三角形着色)

这个例子比较大,任重而道远。理论草草看了下,光记住索引和RGB各项求最小距离了。

为简单起见,拷贝7-6过来,并把8-3封装到的引擎代码拷贝替换。

逐行来看,各个击破

先换成800*600视口

#define SCREEN_WIDTH                           800

#define                            SCREEN_HEIGHT                           600

更换了坦克和塔的数量

 

#define                             NUM_TOWERS             64

#define                                                          NUM_TANKS          32

缓冲区更改大小

 

char                                                             buffer[2048];  

 

重新写了个插入列表函数,加上了光照。

 

int ddraw_liushuixian::Insert_OBJECT4DV1_RENDERLIST4DV12(ddraw_mathmath, RENDERLIST4DV1_PTRrend_list, OBJECT4DV1_PTRobj, int insert_local, int lighting_on /* = 0 */ )

 

与前一个版本相比,加上光照的地方,

由于颜色被存储为32位颜色,但该整数变量中只有后16位包含颜色信息,因为现在支持的颜色模型是16/8位的,因此,可以将着色颜色存储到前16位中。然而,渲染函数使用后16位来渲染多边形,因此要修改物体函数插入函数,使其假设多边形经过了光照处理,处理后的颜色存储在前16位中,因此,将物体分解为多边形,并将其插入渲染列表中时,将前16位作为多边形的颜色。

开光照时,覆盖高16位颜色

if( lighting_on == 1 )

         {

              base_color                                     = (unsigned int ) ( curr_poly->color );

              curr_poly->color                          = (int ) ( base_color >> 16 );

 

插入列表后,测试一下,是否高16位需要覆盖

 

         if( lighting_on == 1 )

         {

              curr_poly->color                          = (int ) ( base_color & 0xffff );

         }

 

在GAME_MAIN()中,对玩家坦克使用之。

     liushuixian.Insert_OBJECT4DV1_RENDERLIST4DV12( *math, & render_list, &obj_player, 0, 0 );

 

对每个坦克也类似使用之

                   liushuixian.Insert_OBJECT4DV1_RENDERLIST4DV12( *math, & render_list, &obj_tank, 0, 0 );

 

同样,对每个塔也类似使用之

              liushuixian.Insert_OBJECT4DV1_RENDERLIST4DV12( *math, & render_list, &obj_tower,0,0 );

同样,对每个地板砖也如此

                   liushuixian.Insert_OBJECT4DV1_RENDERLIST4DV12( *math, & render_list, &obj_marker, 0, 0 );

 

下面进行核心的部分,就是绘制实体,这里注意的是要绘制实心物体,因此需要消除背面多边形,避免渲染它们,以前画线框,现在绘制的是三角形,

 

void ddraw_liushuixian::Draw_RENDERLIST4DV1_Solid16(ddraw_mathmath2, RENDERLIST4DV1_PTRrend_list, UCHAR *video_buffer,int lpitch)

{

     for( int poly = 0; poly < rend_list->num_polys;poly++ )

     {

         //获得当前多边形

         POLYF4DV1_PTR      curr_poly              = rend_list->poly_ptrs[poly];

 

 

         //当且仅当多边形没有被剔除或者裁剪掉,同时处于活动状态且可见时,才对其进行变换)

         if( ( curr_poly == NULL ) ||

              !( curr_poly->state &POLY4DV1_STATE_ACTIVE ) ||

              ( curr_poly->state &POLY4DV1_STATE_CLIPPED ) ||

              ( curr_poly->state &POLY4DV1_STATE_BACKFACE ) )

              continue; //进入下一个多边形

 

         //绘制三角形的边

         //2d初始化过程中已经设置好裁剪,位于D屏幕/窗口外的多边形都将被裁剪掉

         math2.Draw_Triangle_2D16(  rend_list->poly_ptrs[poly]->tvlist[0].x,

              rend_list->poly_ptrs[poly]->tvlist[0].y,

              rend_list->poly_ptrs[poly]->tvlist[1].x,

              rend_list->poly_ptrs[poly]->tvlist[1].y,

              rend_list->poly_ptrs[poly]->tvlist[2].x,

              rend_list->poly_ptrs[poly]->tvlist[2].y,

              rend_list->poly_ptrs[poly]->color,

              video_buffer, lpitch );

 

     }

 

 

}

 

每帧中,调用之

     liushuixian.Draw_RENDERLIST4DV1_Solid16( *math, &render_list, ddraw->getbackbuffer(),ddraw->getbacklpitch() );

 

 

如图所示,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值