您的位置:首页 > 其它

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

2016-01-10 18:54 246 查看
终于进入最麻烦的地方了,高级纹理映射。
在这里,变换和光照计算中将使用浮点数,光栅化函数用定点数。
由于函数将会爆炸性地增加,所以一个个地进行。
不使用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_16( POLYF4DV2_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缓存的。
图示如下

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: