Programming 版 (精华区)
发信人: lansh (沧海一粟), 信区: Programming
标 题: Allegro 游戏程序库(多边形渲染)
发信站: 哈工大紫丁香 (2002年09月11日20:12:03 星期三), 站内信件
发信人: cloudwu (云风), 信区: GAME_Designer
标 题: Allegro 游戏程序库(多边形渲染)
发信站: BBS 水木清华站 (Mon Jul 6 12:16:39 1998)
______ ___ ___
/\ _ \ /\_ \ /\_ \
\ \ \L\ \\//\ \ \//\ \ __ __ _ __ ___
\ \ __ \ \ \ \ \ \ \ /'__`\ /'_ `\/\`'__\/ __`\
\ \ \/\ \ \_\ \_ \_\ \_/\ __//\ \L\ \ \ \//\ \L\ \
\ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/
\/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/
/\____/
\_/__/ 3.0 版
一个游戏程序库
By Shawn Hargreaves, 1994/97
云风 译
http://www.nease.net/~cloudwu
E-mail:cloudwu@nease.net
===========================================
=============== 多边形渲染 ==============
===========================================
注意: 这些函数不支持真彩显示模式!
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:
简单的平展作过阴暗处理的多边形, 颜色取自第一个顶点的颜色.
POLYTYPE_GCOL:
一个简单颜色过度的作过阴暗处理的多边形. 每个顶点的颜色取
自 c 值, 并且添入多边形. 它非常的快, 但是你的调色板必须包
含有平滑过渡的色彩.
POLYTYPE_GRGB:
一色彩过渡的作过阴影处理的多边形, 以 RGB 色组染色而不是单
色调, 它使用全局 reb_map 表来转换结果到 8 位调色板颜色.
必须在你设置了 RGB 映射表后才能使用! 这个模式比 POLYTYPE_GCOL
要慢的多, 但是不需要调色板包含所有你将使用的过渡色彩. 每
个顶点的颜色都取自 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
表被用来混合贴图上取自顶点结构中 c 值的光线级别.这必须在你
设置了色彩映射表后才能使用! 这些模式不能被用在大于 256x256
的贴图.
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);
--
http://www.cfido.net/cloud
http://computer.igd.edu.cn/~cloud(没更新)
E-mail: cloudwu@263.net
--
人生得意需尽欢,莫使金樽空对月。
天生我才必有用,千金散尽还复来。
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: hitsat.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.329毫秒