2015年1月16日星期五(12-1)


终于进入最麻烦的地方了,高级纹理映射。

在这里,变换和光照计算中将使用浮点数,光栅化函数用定点数。

由于函数将会爆炸性地增加,所以一个个地进行。

不使用Z缓存的新光栅化函数

将固定或恒定着色的多边形绘制到屏幕上,首先排序三角形再绘制

void ddraw_math::Draw_Triangle_2D3_16( POLYF4DV2_PTR face,UCHAR *_dest_buffer,intmem_pitch  )

 

下面是仿射纹理映射函数像素级的精度改善,左上填充规则。遗憾的是,我还没看出来哪里改善了。

void ddraw_math::Draw_Textured_Triangle2_16(POLYF4DV2_PTR face,UCHAR *_dest_buffer,intmem_pitch)

 

同样gauraud也没有感觉太大的改动,如果非得说有的话,那就是,转换为整形。

 

    face->tvlist[0].x                      = (int ) ( face->tvlist[0].x +0.0 );

    face->tvlist[0].y                      = (int ) ( face->tvlist[0].y +0.0 );

 

    face->tvlist[1].x                      = (int ) ( face->tvlist[1].x +0.0 );

    face->tvlist[1].y                      = (int ) ( face->tvlist[1].y +0.0 );

 

    face->tvlist[2].x                      = (int ) ( face->tvlist[2].x +0.0 );

    face->tvlist[2].y                      = (int ) ( face->tvlist[2].y +0.0 );

void ddraw_math::Draw_Gouraud_Triangle2_16( POLYF4DV2_PTR face, UCHAR * _dest_buffer,intmem_pitch)

 

接下来,就是支持恒定着色的仿射纹理映射函数的改进。

 

void ddraw_math::Draw_Textured_TriangleFS2_16(POLYF4DV2_PTR face,UCHAR *_dest_buffer,intmem_pitch)        //bytes per line, 320, 640 etc.

 

渲染函数将int改为float,并对gouraud着色进行分离。

void DDRAW_LIUSHUIXIAN_TEXTURE::Draw_RENDERLIST4DV2_Solid2_16(ddraw_mathmath2,RENDERLIST4DV2_PTRrend_list,UCHAR *video_buffer,intlpitch)

{

    POLYF4DV2                 face;

 

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

    {

         //获得当前多边形

         POLYF4DV2_PTR        curr_poly                 = rend_list->poly_ptrs[poly];

 

 

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

         if(!( curr_poly->state& POLY4DV2_STATE_ACTIVE ) ||

             ( curr_poly->state&POLY4DV2_STATE_CLIPPED ) ||

             ( curr_poly->state&POLY4DV2_STATE_BACKFACE ) )

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

 

         //先测试纹理,

         if(rend_list->poly_ptrs[poly]->attr&POLY4DV2_ATTR_SHADE_MODE_TEXTURE )

         {

             face.tvlist[0].x                   = (float) rend_list->poly_ptrs[poly]->tvlist[0].x;

             face.tvlist[0].y                   = (float) rend_list->poly_ptrs[poly]->tvlist[0].y;

             face.tvlist[0].z                   = (float) rend_list->poly_ptrs[poly]->tvlist[0].z;

             face.tvlist[0].u0                  = (float) rend_list->poly_ptrs[poly]->tvlist[0].u0;

             face.tvlist[0].v0                  = (float) rend_list->poly_ptrs[poly]->tvlist[0].v0;

 

             face.tvlist[1].x                   = (float) rend_list->poly_ptrs[poly]->tvlist[1].x;

             face.tvlist[1].y                   = (float) rend_list->poly_ptrs[poly]->tvlist[1].y;

             face.tvlist[1].z                   = (float) rend_list->poly_ptrs[poly]->tvlist[1].z;

             face.tvlist[1].u0                  = (float) rend_list->poly_ptrs[poly]->tvlist[1].u0;

             face.tvlist[1].v0                  = (float) rend_list->poly_ptrs[poly]->tvlist[1].v0;

 

             face.tvlist[2].x                   = (float) rend_list->poly_ptrs[poly]->tvlist[2].x;

             face.tvlist[2].y                   = (float) rend_list->poly_ptrs[poly]->tvlist[2].y;

             face.tvlist[2].z                   = (float) rend_list->poly_ptrs[poly]->tvlist[2].z;

             face.tvlist[2].u0                  = (float) rend_list->poly_ptrs[poly]->tvlist[2].u0;

             face.tvlist[2].v0                  = (float) rend_list->poly_ptrs[poly]->tvlist[2].v0;

 

             face.texture                       =rend_list->poly_ptrs[poly]->texture;

 

             if(rend_list->poly_ptrs[poly]->attr&POLY4DV2_ATTR_SHADE_MODE_CONSTANT )

             {

                  math2.Draw_Textured_Triangle2_16(&face, video_buffer,lpitch );

             }

             else

             if(rend_list->poly_ptrs[poly]->attr&POLY4DV2_ATTR_SHADE_MODE_FLAT )

             {

                  face.lit_color[0]              =rend_list->poly_ptrs[poly]->lit_color[0];

                  math2.Draw_Textured_TriangleFS2_16(&face, video_buffer,lpitch );

             }

             else

             {

                  face.lit_color[0]                  = rend_list->poly_ptrs[poly]->lit_color[0];

                  face.lit_color[1]                  = rend_list->poly_ptrs[poly]->lit_color[1];

                  face.lit_color[2]                  = rend_list->poly_ptrs[poly]->lit_color[2];

                  math2.Draw_Textured_TriangleGS_16(&face, video_buffer,lpitch );

 

             }

         }

         else

         if(( rend_list->poly_ptrs[poly]->attr&POLY4DV2_ATTR_SHADE_MODE_FLAT )

                  || ( rend_list->poly_ptrs[poly]->attr&POLY4DV2_ATTR_SHADE_MODE_CONSTANT ) )

             {

                  face.lit_color[0]=rend_list->poly_ptrs[poly]->lit_color[0];

                      face.tvlist[0].x                   =(float ) rend_list->poly_ptrs[poly]->tvlist[0].x;

                      face.tvlist[0].y                   =(float ) rend_list->poly_ptrs[poly]->tvlist[0].y;

                      face.tvlist[0].z                   =(float ) rend_list->poly_ptrs[poly]->tvlist[0].z;

 

                      face.tvlist[1].x                   =(float ) rend_list->poly_ptrs[poly]->tvlist[1].x;

                      face.tvlist[1].y                   =(float ) rend_list->poly_ptrs[poly]->tvlist[1].y;

                      face.tvlist[1].z                   =(float ) rend_list->poly_ptrs[poly]->tvlist[1].z;

 

                      face.tvlist[2].x                   =(float ) rend_list->poly_ptrs[poly]->tvlist[2].x;

                      face.tvlist[2].y                   =(float ) rend_list->poly_ptrs[poly]->tvlist[2].y;

                      face.tvlist[2].z                   =(float ) rend_list->poly_ptrs[poly]->tvlist[2].z;

 

                  math2.Draw_Triangle_2D3_16(&face, video_buffer,lpitch );

             }

         else

         if(rend_list->poly_ptrs[poly]->attr&POLY4DV2_ATTR_SHADE_MODE_GOURAUD )

                  {

                      face.tvlist[0].x                   = (float) rend_list->poly_ptrs[poly]->tvlist[0].x;

                      face.tvlist[0].y                   =(float ) rend_list->poly_ptrs[poly]->tvlist[0].y;

                      face.tvlist[0].z                   =(float ) rend_list->poly_ptrs[poly]->tvlist[0].z;

                      face.lit_color[0]                  = rend_list->poly_ptrs[poly]->lit_color[0];

 

                      face.tvlist[1].x                   =(float ) rend_list->poly_ptrs[poly]->tvlist[1].x;

                      face.tvlist[1].y                   =(float ) rend_list->poly_ptrs[poly]->tvlist[1].y;

                      face.tvlist[1].z                   =(float ) rend_list->poly_ptrs[poly]->tvlist[1].z;

                      face.lit_color[1]                  = rend_list->poly_ptrs[poly]->lit_color[1];

 

                      face.tvlist[2].x                   =(float ) rend_list->poly_ptrs[poly]->tvlist[2].x;

                      face.tvlist[2].y                   =(float ) rend_list->poly_ptrs[poly]->tvlist[2].y;

                      face.tvlist[2].z                   =(float ) rend_list->poly_ptrs[poly]->tvlist[2].z;

                      face.lit_color[2]                  = rend_list->poly_ptrs[poly]->lit_color[2];

 

                      math2.Draw_Gouraud_Triangle2_16(&face, video_buffer,lpitch );

                  }

 

 

 

 

    }

 

 

}

支持Z缓存的新光栅化函数

基本函数:用Z缓冲将三角形绘制到屏幕上,并相应地更新Z缓存。

void ddraw_math::Draw_Triangle_2DZB2_16(                POLYF4DV2_PTR                  face,         //指向多边形面的指针

                                                             UCHAR                     *    _dest_buffer,//指向视频缓存的指针

                                                             int                           mem_pitch,  //每行占用多少字节(,640

                                                             UCHAR                     *    _zbuffer,   //指向z缓存的指针

                                                                                                                                     int                              zpitch )

 

对于纹理的。

void ddraw_math::Draw_Textured_TriangleZB2_16POLYF4DV2_PTR     face,        //指向多边形的指针

                                                                 UCHAR    *       _dest_buffer,//指向视频缓存的指针

                                                                 int               mem_pitch,//每行占据的字节数

                                                                 UCHAR        *   _zbuffer,   //指向z缓存的指针

                                                                                                                                       int               zpitch )//z缓存每行占用的字节数

对于Z缓存绘制使用固定着色和仿射纹理映射,改动也不大。

 

 

void ddraw_math::Draw_Textured_TriangleFSZB2_16(    POLYF4DV2_PTR     face,        //指向多边形的指针

                                                                 UCHAR    *       _dest_buffer,//指向视频缓存的指针

                                                                 int               mem_pitch,//每行占据的字节数

                                                                 UCHAR        *   _zbuffer,   //指向z缓存的指针

                                                                                                                                       int               zpitch )//z缓存每行占用的字节数

Z缓存绘制使用的GOURAUD改动也不大。

void ddraw_math::Draw_Gouraud_TriangleZB2_16(POLYF4DV2_PTR  face,       //指向多边形的指针

                                                                 UCHAR    *       _dest_buffer,//指向视频缓存的指针

                                                                 int               mem_pitch,//每行占据的字节数

                                                                 UCHAR                     *    _zbuffer,    //指向z缓存的指针

                                                                 int                           zpitch ) //z缓存每行占用的字节数

 

 

调用Z缓存的光栅化函数入口,改动也不大。

 

 

void DDRAW_LIUSHUIXIAN_TEXTURE::   Draw_RENDERLIST4DV2_SolidZB2_16(ddraw_mathmath2,RENDERLIST4DV2_PTRrend_list,UCHAR *video_buffer,intlpitch,

                                                                         UCHAR    *                 zbuffer,

                                                                         int                        zpitch)

{

    POLYF4DV2                 face;

 

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

    {

         //获得当前多边形

         POLYF4DV2_PTR        curr_poly                 = rend_list->poly_ptrs[poly];

 

 

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

         if(!( curr_poly->state& POLY4DV2_STATE_ACTIVE ) ||

             ( curr_poly->state&POLY4DV2_STATE_CLIPPED ) ||

             ( curr_poly->state&POLY4DV2_STATE_BACKFACE ) )

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

 

         //先测试纹理,

         if(rend_list->poly_ptrs[poly]->attr&POLY4DV2_ATTR_SHADE_MODE_TEXTURE )

         {

             face.tvlist[0].x                   = (float) rend_list->poly_ptrs[poly]->tvlist[0].x;

             face.tvlist[0].y                   = (float) rend_list->poly_ptrs[poly]->tvlist[0].y;

             face.tvlist[0].z                   = (float) rend_list->poly_ptrs[poly]->tvlist[0].z;

             face.tvlist[0].u0                  = (float) rend_list->poly_ptrs[poly]->tvlist[0].u0;

             face.tvlist[0].v0                  = (float) rend_list->poly_ptrs[poly]->tvlist[0].v0;

 

             face.tvlist[1].x                   = (float) rend_list->poly_ptrs[poly]->tvlist[1].x;

             face.tvlist[1].y                   = (float) rend_list->poly_ptrs[poly]->tvlist[1].y;

             face.tvlist[1].z                   = (float) rend_list->poly_ptrs[poly]->tvlist[1].z;

             face.tvlist[1].u0                  = (float) rend_list->poly_ptrs[poly]->tvlist[1].u0;

             face.tvlist[1].v0                  = (float) rend_list->poly_ptrs[poly]->tvlist[1].v0;

 

             face.tvlist[2].x                   = (float) rend_list->poly_ptrs[poly]->tvlist[2].x;

             face.tvlist[2].y                   = (float) rend_list->poly_ptrs[poly]->tvlist[2].y;

             face.tvlist[2].z                   = (float) rend_list->poly_ptrs[poly]->tvlist[2].z;

             face.tvlist[2].u0                  = (float) rend_list->poly_ptrs[poly]->tvlist[2].u0;

             face.tvlist[2].v0                  = (float) rend_list->poly_ptrs[poly]->tvlist[2].v0;

 

             face.texture                       =rend_list->poly_ptrs[poly]->texture;

 

             if(rend_list->poly_ptrs[poly]->attr&POLY4DV2_ATTR_SHADE_MODE_CONSTANT )

             {

                  math2.Draw_Textured_TriangleZB2_16(&face, video_buffer,lpitch,zbuffer,zpitch );

             }

             else

             if(rend_list->poly_ptrs[poly]->attr&POLY4DV2_ATTR_SHADE_MODE_FLAT )

             {

                  face.lit_color[0]              =rend_list->poly_ptrs[poly]->lit_color[0];

                  math2.Draw_Textured_TriangleFSZB2_16(&face, video_buffer,lpitch,zbuffer,zpitch );

             }

             else

             {

                  face.lit_color[0]              =rend_list->poly_ptrs[poly]->lit_color[0];

                  face.lit_color[1]              =rend_list->poly_ptrs[poly]->lit_color[1];

                  face.lit_color[2]              =rend_list->poly_ptrs[poly]->lit_color[2];

                  math2.Draw_Textured_TriangleGSZB2_16(&face, video_buffer,lpitch,zbuffer,zpitch );

             }

 

         }

         else

             if(( rend_list->poly_ptrs[poly]->attr&POLY4DV2_ATTR_SHADE_MODE_FLAT )

                  || ( rend_list->poly_ptrs[poly]->attr&POLY4DV2_ATTR_SHADE_MODE_CONSTANT ) )

             {

                  //使用固定着色

                  face.lit_color[0]              =rend_list->poly_ptrs[poly]->lit_color[0];

 

                  //设置顶点坐标

                  face.tvlist[0].x               =(float ) rend_list->poly_ptrs[poly]->tvlist[0].x;

                  face.tvlist[0].y               =(float ) rend_list->poly_ptrs[poly]->tvlist[0].y;

                  face.tvlist[0].z               =(float ) rend_list->poly_ptrs[poly]->tvlist[0].z;

 

                  face.tvlist[1].x               =(float ) rend_list->poly_ptrs[poly]->tvlist[1].x;

                  face.tvlist[1].y               =(float ) rend_list->poly_ptrs[poly]->tvlist[1].y;

                  face.tvlist[1].z               =(float ) rend_list->poly_ptrs[poly]->tvlist[1].z;

 

                  face.tvlist[2].x               =(float ) rend_list->poly_ptrs[poly]->tvlist[2].x;

                  face.tvlist[2].y               =(float ) rend_list->poly_ptrs[poly]->tvlist[2].y;

                  face.tvlist[2].z               =(float ) rend_list->poly_ptrs[poly]->tvlist[2].z;

 

                  math2.Draw_Triangle_2DZB_16(&face, video_buffer,lpitch,zbuffer,zpitch );

 

 

                 

             }

             else

                  if( rend_list->poly_ptrs[poly]->attr &POLY4DV2_ATTR_SHADE_MODE_GOURAUD)

                  {

                      face.tvlist[0].x                   =(float ) rend_list->poly_ptrs[poly]->tvlist[0].x;

                      face.tvlist[0].y                   =(float ) rend_list->poly_ptrs[poly]->tvlist[0].y;

                      face.tvlist[0].z                   =(float ) rend_list->poly_ptrs[poly]->tvlist[0].z;

                      face.lit_color[0]                  = rend_list->poly_ptrs[poly]->lit_color[0];

 

                      face.tvlist[1].x                   =(float ) rend_list->poly_ptrs[poly]->tvlist[1].x;

                      face.tvlist[1].y                   =(float ) rend_list->poly_ptrs[poly]->tvlist[1].y;

                      face.tvlist[1].z                   =(float ) rend_list->poly_ptrs[poly]->tvlist[1].z;

                      face.lit_color[1]                  = rend_list->poly_ptrs[poly]->lit_color[1];

 

                      face.tvlist[2].x                   =(float ) rend_list->poly_ptrs[poly]->tvlist[2].x;

                      face.tvlist[2].y                   =(float ) rend_list->poly_ptrs[poly]->tvlist[2].y;

                      face.tvlist[2].z                   =(float ) rend_list->poly_ptrs[poly]->tvlist[2].z;

                      face.lit_color[2]                  = rend_list->poly_ptrs[poly]->lit_color[2];

 

                      math2.Draw_Gouraud_TriangleZB2_16(&face, video_buffer,lpitch,zbuffer,zpitch );

                  }

 

 

 

 

    }

 

 

}

    下面进行GOURUAD着色的纹理映射,只是将使用固定着色的仿射纹理映射和单色GOURAUD着色合二为一而已。先分别插值RGB和UV,再进行相乘调制,有Z缓冲时,则加上Z分量,仅此而已。改动如下:

void ddraw_math::Draw_Textured_TriangleGS_16(POLYF4DV2_PTR face,UCHAR *_dest_buffer,intmem_pitch)

扫描线绘制

             //绘制扫描线

                      for( xi = xstart; xi <xend; xi++ )

                      {

                          textel                =textmap[(si>>FIXP16_SHIFT ) + ( ( ti >> FIXP16_SHIFT) << texture_shift2 )];

                          r_textel          =( (textel >> 11 ) );

                          g_textel          =(textel >> 5 ) & 0x3f );

                          b_textel          =(textel & 0x1f );

 

                          r_textel *        =ui;

                          g_textel *        =vi;

                          b_textel *        =wi;

 

 

                          //绘制像素,假设格式为.6.5

                          screen_ptr[xi]        = ( (b_textel>> ( FIXP16_SHIFT + 8 )) +

                                   (( g_textel >> ( FIXP16_SHIFT + 8)) << 5 ) +

                               (( r_textel >> (FIXP16_SHIFT+ 8)) << 11 ) );

                         

                                ;

 

                          //计算下一个像素的RGB

                          ui                    +=du;

                          vi                    +=dv;

                          wi                    +=dw;

                          si                    +=ds;

                          ti                    +=dt;

                      }

         //计算下一条扫描线起点和终点的x坐标和RGB值

                      xl                        +=dxdyl;

                      ul                        +=dudyl;

                      vl                        +=dvdyl;

                      wl                        +=dwdyl;

                      sl                        +=dsdyl;

                      tl                        +=dtdyl;

 

                      xr                        +=dxdyr;

                      ur                        +=dudyr;

                      vr                        +=dvdyr;

                      wr                        +=dwdyr;

                      sr                        +=dsdyr;

                      tr                        +=dtdyr;

 

                      //让指针screen_ptr指向视频缓存的下一行

                      screen_ptr                +=mem_pitch;

 

对于支持Z缓存的。

图示如下


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值