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做好准备。