Direct9学习之--------------------------模板缓冲的应用

本文主要是介绍Direct9学习之--------------------------模板缓冲的应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.模板缓冲区:


板缓冲区(Stencil Buffer)与后台缓冲区大小相同,类似于深度缓冲区可以控制相似是否写入。

模板可以通过设置简单的参数及测试方法允许或者拒绝像素的写入。

利用模板缓冲技术可以实现阴影体 镜面反射 渐入渐出等效果。

这里只介绍阴影体和镜面的实现方式。


二.镜面反射:


 镜面反射实现思路比较简单利用模板测试的方式分三次绘制即可实现:

1. 绘制除镜面成像以外的所有场景对象.

2. 绘制镜面区域设置通过设置模板掩码及模板值标记出镜面区域例如:

设置模板比较函数为总是通过,通过之后将模板值设置为0xffffffff

(Device->SetRenderState( D3DRS_STENCILREF, 0x1 );

Device->SetRenderState( D3DRS_STENCILMASK, 0xffffffff );

Device->SetRenderState( D3DRS_STENCILFUNC, D3DCMP_ALWAYS); 

Device->SetRenderState( D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE );

然后绘制镜面)此时就将镜面区域的模板值设置为了0xffffffff。

3. 计算场景对象在镜面中的位置 开启模板测试 设置可以在模板

值为0xffffffff的区域内绘制,即可保证在镜面区域内绘制出镜面中的场景.

( Device->SetRenderState( D3DRS_STENCILFUNC, D3DCMP_EQUAL); 

Device->SetRenderState( D3DRS_STENCILMASK, 0xffffffff ); 

然后绘制镜面中场景物件即可。 )



三.动态阴影:

相比镜面反射,动态阴影的实现则更为复杂些。其具体步骤可以简单归纳为:

1. 计算轮廓边:

a. 将光线方向转化到模型空间

b. 遍历模型所有面,由面法线与光线方向计算夹角,取得所有夹角小

于90度的面及边

c. 判断所有边中只出现过一次的边则为轮廓边


2. 由轮廓边及光线方向可将轮廓边的每个顶点沿光线方向

延伸出一条射线形成阴影体。

3. 通过设置模板缓冲绘制阴影区域:(也是动态阴影绘制最复杂部分)

a. 设置背面裁剪绘制阴影体,在绘制阴影体时设置模板缓冲区总是通过,

且通过之后模板值自增1.

b. 设置证明裁剪绘制阴影体,在绘制阴影体是设置模板缓冲总是通过,

且通过之后模板值自减1.

4. 绘制阴影,开启模板测试,将模板掩码设置为1,测试函数设置为小于等于,

在测试通过区域绘制阴影。


注:

基本原理如下:


如图: 上面三角形区域是轮廓边 整个三棱柱为阴影体, 而所需绘制

的阴影部分则为红色圈区域 - 绿色圈区域。因此先绘制红色边区域(也

就是背面剔除 绘制)将此部分区域也就是红色圈模板自增1, 然后正面剔

除绘制背面区域也就是绿色区域将模板值自减1,此时剩下的模板值为1的

区域就是阴影区域。


三.其他:


除镜面和阴影外模板还可以用于实现渐入渐出等效果,另外关于模板掩码

模板值 模板比较函数 三个值得关系是用模板值与上模板掩码 在用比较

函数进行比较 比较结果为通过时可以绘制。

设模板掩码为 MASK 模板值为 VALUE 比较函数为 FUC 则模板测试的过程为 FUC( MASK & VALUE )

这篇关于Direct9学习之--------------------------模板缓冲的应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1099297

相关文章

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

Python进行word模板内容替换的实现示例

《Python进行word模板内容替换的实现示例》本文介绍了使用Python自动化处理Word模板文档的常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录技术背景与需求场景核心工具库介绍1.获取你的word模板内容2.正常文本内容的替换3.表格内容的

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程