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毫秒