多边形渲染



void polygon3d(BITMAP *bmp, int type, BITMAP *texture, int vc, V3D *vtx[]);
void polygon3d_f(BITMAP *bmp, int type, BITMAP *texture, int vc, V3D_f *vtx[]);
向指定位图画 3D 多边形, 使用指定的渲染模式. 和常规的 polygon() 函数不同, 这些例程不支持 凹多边形或自交叉多边形, 并且它们不能向 mode-X 屏幕位图上画 (如果你想写 mode-X 下的 3D 代码, 向内存位图作画然后 blit 到屏幕). 贴图的宽度和高度 必须是 2 的整数次方, 但可以不同, 比如: 可以是 64x16 的贴图, 但不能是 17x3 的. 顶点计数参数 (vc) 应当跟在一个包含有合适数量的 顶点结构指针的数组之后: polygon3d() 使用定点 V3D 结构指针, 而 polygon3d_f() 使用浮点 V3D_f 结构指针. 下面是它们的定义:

   typedef struct V3D
   {
      fixed x, y, z;       - 位置
      fixed u, v;          - 贴图坐标
      int c;               - 颜色
   } V3D;

typedef struct V3D_f { float x, y, z; - 位置 float u, v; - 贴图坐标 int c; - 颜色 } V3D_f;

顶点数据的使用方法依赖于渲染模式:

x 和 y 值指定了顶点在 2d 屏幕坐标上的位置.


z 值仅仅在用在作贴图透视纠正时, 它指定了点在 3d 世界坐标中的深度.

u 和 v 坐标仅在做贴图时使用, 它们 指定了点在贴图中的位置, 比如 0,0 映射顶点到贴图的左上角, 如果 贴图是 32x32 的, 设置 u=32 和 v=16 则映射顶点到 右边界的中点. u/v 坐标对贴图的边界是翻卷的, 因此在 32x32 的贴图里, u=v=32 和 u=v=0 相同. 这可以让贴图在一个多边形里被拼接多次.


c 值指定了顶点的颜色, 根据不同的渲染模式对此有不同的解释.


type 参数指定了多边形的渲染模式, 它只能是下列值之一:


POLYTYPE_FLAT:
简单的平展作过阴暗处理的多边形, 颜色取自第一个顶点的颜色. 这个多边形类型被 drawing_mode() 影响, 因此它可以被用来 XOR 渲染或画透明的多边形.

POLYTYPE_GCOL:
一个简单颜色过度的作过阴暗处理的多边形. 每个顶点的颜色取自 c 值, 并且添入多边形. 它非常的快, 但是你的调色板必须包含有平滑过渡的色彩. 在真彩模式下, 色彩的显示格式值就是由 makecol() 得到的那样.


POLYTYPE_GRGB:
一色彩过渡的作过阴影处理的多边形, 以 RGB 色组染色而不是 单色调, 它使用全局 reb_map 表来转换结果到 8 位调色板颜色. 必须在你设置了 RGB 映射表后才能使用! 每个顶点的颜色都取自 c 值 , 这个 c 值是 24 位 RGB 颜色形式 (0xFF0000 是红色, 0x00FF00 是绿色, 0x0000FF 是兰色).


POLYTYPE_ATEX:
仿射(affine)贴图多边形. 它用简单的 2d 线形方式拉伸贴图 添入多边形, 这很快但是 没有数学矫正. 当多边形相当小 或平面正对摄象机时看起来不错, 但是因为没有经 透视前缩处理, 它导致了奇怪的翻卷加工. 要明白我的意思, 运行 test.exe 看看 polygon3d() 测试时当你放大贴近立方体时的效果.

POLYTYPE_PTEX:
透视矫正贴图多边形. 它使用顶点结构中的 z 值用在 u/v 坐标中, 因此贴图 能在任何角度被正确显示. 因为它在贴图内循环中使用了除法, 这个模式比 POLYTYPE_ATEX 慢很多, 并且它使用了 浮点指针因此在奔腾机以下会很慢 (即使有 FPU, 486 也不能象奔腾那样将浮点指针和其它 整数运算间作除法).

POLYTYPE_ATEX_MASK:
POLYTYPE_PTEX_MASK:
与 POLYTYPE_ATEX 和 POLYTYPE_PTEX 类似, 但是贴图中的 0 点被忽略, 这样允许了贴图中的部分透明.

POLYTYPE_ATEX_LIT:
POLYTYPE_PTEX_LIT:
与 POLYTYPE_ATEX 和 POLYTYPE_PTEX 类似, 但是全局 color_map 表 (用于 256 色模式) 或混合函数 (用于非 MMX 真彩模式) 被用来混合贴图上取自顶点结构中 c 值的光线级别. 这必须在你设置了色彩映射表或混合函数后才能使用!


POLYTYPE_ATEX_MASK_LIT:
POLYTYPE_PTEX_MASK_LIT:
像 POLYTYPE_ATEX_LIT and POLYTYPE_PTEX_LIT 一样, 但是 0 贴图点被忽略, 允许贴图的部分透明.


如果 cpu_mmx 全局变量被 设置, GRGB 和真彩 *LIT 例程将使用 MMX 指令集优化. 如果 cpu_3dnow 全局变量被 设置, 真彩 PTEX*LIT 例程将从 3DNow! CPU 扩展中得到好处. 由于这个原因, 使用多边形函数前调用 check_cpu() 是个好主意.

使用 MMX 来作 *LIT 例程有些不同的地方: 通常 (没有 MMX), 这些例程使用被 set_trans_blender() 或 set_blender_mode() 设置的混合函数来作光线效果. MMX 版本仅使用传入 set_trans_blender() 的 RGB 值, 而自己去做线形运算. 这样新的一组传入 set_blender_mode() 的混合函数 被忽略了.

void triangle3d(BITMAP *bmp, int type, BITMAP *tex, V3D *v1, *v2, *v3);
void triangle3d_f(BITMAP *bmp, int type, BITMAP *tex, V3D_f *v1, *v2, *v3);
画一个 3d 三角形, 使用顶点或浮点的顶点结构. 这些相当于调用 polygon3d(bmp, type, tex, 3, v1, v2, v3); 或 polygon3d_f(bmp, type, tex, 3, v1, v2, v3);

void quad3d(BITMAP *bmp, int type, BITMAP *tex, V3D *v1, *v2, *v3, *v4);
void quad3d_f(BITMAP *bmp, int type, BITMAP *tex, V3D_f *v1, *v2, *v3, *v4);
画一个 3d 四边形, 使用顶点或浮点的顶点结构. 这些相当于调用 polygon3d(bmp, type, tex, 4, v1, v2, v3, v4); 或 polygon3d_f(bmp, type, tex, 4, v1, v2, v3, v4);

int clip3d_f(int type, float min_z, float max_z, int vc,
V3D_f *vtx[], V3D_f *vout[], V3D_f *vtmp[], int out[]);
裁剪vtx中的多边形。该多边形的顶点数是vc,裁剪结果 保存在vout中,vtmp和out则供该函数内部使用。 vtx、vout和vtmp中的指针必须指向一个有效的V3D_f结构。 vout、vtmp和out的大小至少要是vc*2 (因为裁剪过程中会可能产生新的顶点)。截头体[?棱台?](视见体)由 -z<x<z,-z<y<z,0<min_z<z<max_z定义。如果 max_z<=min_z,那么z<max_z的裁剪将不会进行。正如你所知道的, 裁剪是在照相机空间(视坐标空间)中进行的,透视要考虑在内[?这句拿不大准?]。因此 应该在应用照相机矩阵之后、透视投影之前调用这个子程序。 这个子程序能够正确的解释顶点结构中的u,v和c。然而,没有为 高彩/真彩色GCOL做好准备。





返回