2014年3月7日星期五(DEMO8-4,实体三角形着色)

2023-11-18

这个例子比较大,任重而道远。理论草草看了下,光记住索引和RGB各项求最小距离了。

为简单起见,拷贝7-6过来,并把8-3封装到的引擎代码拷贝替换。

逐行来看,各个击破

先换成800*600视口

#define SCREEN_WIDTH                           800

#define                            SCREEN_HEIGHT                           600

更换了坦克和塔的数量

 

#define                             NUM_TOWERS             64

#define                                                          NUM_TANKS          32

缓冲区更改大小

 

char                                                             buffer[2048];  

 

重新写了个插入列表函数,加上了光照。

 

int ddraw_liushuixian::Insert_OBJECT4DV1_RENDERLIST4DV12(ddraw_mathmath, RENDERLIST4DV1_PTRrend_list, OBJECT4DV1_PTRobj, int insert_local, int lighting_on /* = 0 */ )

 

与前一个版本相比,加上光照的地方,

由于颜色被存储为32位颜色,但该整数变量中只有后16位包含颜色信息,因为现在支持的颜色模型是16/8位的,因此,可以将着色颜色存储到前16位中。然而,渲染函数使用后16位来渲染多边形,因此要修改物体函数插入函数,使其假设多边形经过了光照处理,处理后的颜色存储在前16位中,因此,将物体分解为多边形,并将其插入渲染列表中时,将前16位作为多边形的颜色。

开光照时,覆盖高16位颜色

if( lighting_on == 1 )

         {

              base_color                                     = (unsigned int ) ( curr_poly->color );

              curr_poly->color                          = (int ) ( base_color >> 16 );

 

插入列表后,测试一下,是否高16位需要覆盖

 

         if( lighting_on == 1 )

         {

              curr_poly->color                          = (int ) ( base_color & 0xffff );

         }

 

在GAME_MAIN()中,对玩家坦克使用之。

     liushuixian.Insert_OBJECT4DV1_RENDERLIST4DV12( *math, & render_list, &obj_player, 0, 0 );

 

对每个坦克也类似使用之

                   liushuixian.Insert_OBJECT4DV1_RENDERLIST4DV12( *math, & render_list, &obj_tank, 0, 0 );

 

同样,对每个塔也类似使用之

              liushuixian.Insert_OBJECT4DV1_RENDERLIST4DV12( *math, & render_list, &obj_tower,0,0 );

同样,对每个地板砖也如此

                   liushuixian.Insert_OBJECT4DV1_RENDERLIST4DV12( *math, & render_list, &obj_marker, 0, 0 );

 

下面进行核心的部分,就是绘制实体,这里注意的是要绘制实心物体,因此需要消除背面多边形,避免渲染它们,以前画线框,现在绘制的是三角形,

 

void ddraw_liushuixian::Draw_RENDERLIST4DV1_Solid16(ddraw_mathmath2, RENDERLIST4DV1_PTRrend_list, UCHAR *video_buffer,int lpitch)

{

     for( int poly = 0; poly < rend_list->num_polys;poly++ )

     {

         //获得当前多边形

         POLYF4DV1_PTR      curr_poly              = rend_list->poly_ptrs[poly];

 

 

         //当且仅当多边形没有被剔除或者裁剪掉,同时处于活动状态且可见时,才对其进行变换)

         if( ( curr_poly == NULL ) ||

              !( curr_poly->state &POLY4DV1_STATE_ACTIVE ) ||

              ( curr_poly->state &POLY4DV1_STATE_CLIPPED ) ||

              ( curr_poly->state &POLY4DV1_STATE_BACKFACE ) )

              continue; //进入下一个多边形

 

         //绘制三角形的边

         //2d初始化过程中已经设置好裁剪,位于D屏幕/窗口外的多边形都将被裁剪掉

         math2.Draw_Triangle_2D16(  rend_list->poly_ptrs[poly]->tvlist[0].x,

              rend_list->poly_ptrs[poly]->tvlist[0].y,

              rend_list->poly_ptrs[poly]->tvlist[1].x,

              rend_list->poly_ptrs[poly]->tvlist[1].y,

              rend_list->poly_ptrs[poly]->tvlist[2].x,

              rend_list->poly_ptrs[poly]->tvlist[2].y,

              rend_list->poly_ptrs[poly]->color,

              video_buffer, lpitch );

 

     }

 

 

}

 

每帧中,调用之

     liushuixian.Draw_RENDERLIST4DV1_Solid16( *math, &render_list, ddraw->getbackbuffer(),ddraw->getbacklpitch() );

 

 

如图所示,

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2014年3月7日星期五(DEMO8-4,实体三角形着色) 的相关文章

  • (二叉树)二叉搜索树的查找、插入和删除

    1 二叉搜索树简介 二叉搜索树或者是一棵空树 或者是具有下列性质的二叉树 若它的左子树不空 则左子树上所有结点的值均小于它的根结点的值 若它的右子树不空 则右子树上所有结点的值均大于它的根结点的值 它的左 右子树也分别为二叉搜索树 二叉搜索
  • 孙燕姿谈“AI孙燕姿”:她的反应让人意外,深入体验揭示其背后的真相与潜力!

    目录 前言 AI歌手简介 AI歌手的技术原理 孙燕姿对 AI孙燕姿 的看法 结论 个人感受 一 你听过AI歌手的音乐呈现吗 作为听众你的感受如何 二 你认为这种新型演艺模式能否获得广泛的市场认可 原因是什么 三 你认为AI歌手会取代流行歌手
  • 第十三届蓝桥杯省赛 JAVA A组 - 矩形拼接

    个人博客 https blog csdn net Newin2020 spm 1011 2415 3001 5343 专栏地址 蓝桥杯题解集合 专栏定位 为想参加蓝桥杯的小伙伴整理常考算法题解 祝大家都能取得理想成绩 如果有收获的话 欢迎点
  • 【ChatGPT炒菜攻略】如何做韭菜

    ChatGPT可以化身为一名厨师 不仅有着扎实的厨艺基础和丰富的经验 而且也对食材的选取十分讲究 时常会寻找新鲜和有潜力的材料进行尝试和创新 从而创造出更加优秀和惊艳的佳肴 同时 我注重菜品的色 香 味 形均衡 追求将自然与文化相融合 以满

随机推荐

  • ip最长匹配mysql实现

    ip最长匹配计算 mysql使用inet aton函数实现 mask是ip的 select from select inet aton 10 181 88 1 inet aton mask inet aton prefix as match
  • Java程序跨平台原理

    平台 指的是操作系统 Windows Linux Mac 跨平台 Java程序可以在任一操作系统上运行 一次编写到处运行 原理 实现跨平台需要依赖Java的虚拟机JVM Java Virtual Machine Java程序 可以在Wind
  • win10 的图标丢失了怎么办?

    情况说明 几分钟前 自己手贱 居然一不小心把那D盘的分区表给删了 虽然说是借助DiskGenius即使找了回来 但是一个尴尬的情况出现了 原来装在D盘的程序虽然可以用 但是图标却没了 这对于有强迫症的我来说 让我浑身不舒服 解决方案 首先
  • java读取Excel —— XSSFWorkbook 找不到该类

    做一个Excel表格的读取时导入 org apache poi 包后居然提示 XSSFWorkbook 找不到 原来是还需要下载一个jar包 poi ooxml 包 之后在引入相关类即可 import org apache poi xssf
  • Window XP驱动开发(二十四) 电源管理

    转载自 http blog csdn net xxxluozhen article details 5023703 一 电源管理 1 WDM电源管理模型 在Windows 2000和Windows 98中 操作系统接管了大部分电源管理工作
  • (数据结构)1.实现图的邻接矩阵和邻接表的存储 2.实现图的遍历算法

    实验内容 1 编写一个程序graph cpp 设计带权图的邻接矩阵与邻接表的创建和输出运算 并在此基础上设计一个主程序exp8 1 cpp完成以下功能 1 建立如图8 54所示的有向图G的邻接矩阵 并输出之 2 建立如图8 54所示的有向图
  • 力扣:70. 爬楼梯

    假设你正在爬楼梯 需要 n 阶你才能到达楼顶 每次你可以爬 1 或 2 个台阶 你有多少种不同的方法可以爬到楼顶呢 示例 1 输入 n 2 输出 2 解释 有两种方法可以爬到楼顶 1 1 阶 1 阶 2 2 阶 示例 2 输入 n 3 输出
  • Boot与APP的Hex合并

    软件准备 使用的软件是srec cat软件 下载地址 合并脚本编写 ECHO OFF 如果存在上一次的hex文件就删除 if exist BootJoinAPP CCP APP hex del BootJoinAPP CCP APP hex
  • C# 远程唤醒(远程开机)

    C 远程唤醒 远程开机 近日 小白要用到远程开机的功能 网上大多介绍的是Magic Packet的工具 实际上 此Magic Packet是AMD公司开发的 请在google cn中搜索Magic Packet Technology 原理上
  • Mysql递归查询

    SELECT IFNULL CONCAT GROUP CONCAT CONCAT catId t id catName t name ch catLevel t level AS companyCategories FROM SELECT
  • 微服务实践--微服务方法论00

    思想 在接收到一个新的新项目时 架构师的职责是建立项目的业务与技术实现之间的桥梁 在翻译业务到技术实现的过程中需要进行业务建模 技术设计等方面的工作 业务建模和技术设计过程中都有各自领域的知识体系 基本上每个知识体系都是由上层的理论 概念和
  • python判断素数的函数_python判断是否为素数

    质数 prime number 又称素数 指在一个大于1的自然数中 除了1和此整数自身外 不能被其他自然数整除的数 素数在数论中有着很重要的地位 比1大但不是素数的数称为合数 1和0既非素数也非合数 素数是与合数相对立的两个概念 二者构成了
  • C++实现栈的顺序存储与链式存储

    栈是一种特殊的数据结构 栈中数据先进后出 且栈中数据只能从头部出栈 能直接访问的数据也仅为栈的头部数据 要想访问下面的数据则需要将前面的数据逐个出栈后才可访问 下面通过一个word撤销的案例来解释 我们用word写paper时 首先需要创建
  • 国内首部

    当前 税务和发票等财税数据作为财务关联性强 欺诈难度大 覆盖率最高的优质数据 正成为数字普惠金融不可或缺的 硬核 力量 全面提升相关数据理论与实战能力正逢其时 8月8日 在金蝶2023年全球创见者大会 企业数字信用平行论坛 现场 金蝶征信
  • java使用MD5生成摘要

    对value进行hash处理 return hash处理结果 public static String digest String input int length 32 try MessageDigest md MessageDigest
  • openGL之API学习(六十八)core profile、compatibility profile、forward compatibility

    在OpenGL的发展历程中 总是兼顾向下兼容的特性 但是到了一定的程度之后 这些旧有的OpenGL API不再适应时代的需要 还有一些扩展并不是驱动一定要实现的扩展 这些被统一划入可选的Compatibility Profile 而由Ope
  • 信号的时域相位、频域相位

    文章目录 傅里叶变换的时移性质 matlab代码 单点频信号 线调信号 时域相位 频域相位 傅里叶变换的时移性质 信号增加线性相位时 是所有的频率分量对应的相位都有变化 matlab代码 清空一切 clc clear all close a
  • 翻译:《实用的Python编程》01_07_Functions

    目录 上一节 1 6 文件 下一节 2 0 处理数据 1 7 函数 随着程序开始变大 我们会想要有条理地组织这些程序 本节简要介绍函数 库模块以及带有异常的错误处理 自定义函数 对你要重用的代码使用函数 下面是函数的定义方式 def sum
  • 数据结构--图的学习(基础概念)

    目录 图的定义 图的逻辑结构应用 无向图 有向图 编辑 简单图 多重图 顶点的度 入读 出度 顶点 顶点的关系描述 连通图和强连通图 子图 1 无向图的子图 编辑 2 有向图的子图 连通分量 强连通分量 生成树 生成森林 边的权 带权图 网
  • 2014年3月7日星期五(DEMO8-4,实体三角形着色)

    这个例子比较大 任重而道远 理论草草看了下 光记住索引和RGB各项求最小距离了 为简单起见 拷贝7 6过来 并把8 3封装到的引擎代码拷贝替换 逐行来看 各个击破 先换成800 600视口 define SCREEN WIDTH 800 d