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

相关文章

PyTorch核心方法之state_dict()、parameters()参数打印与应用案例

《PyTorch核心方法之state_dict()、parameters()参数打印与应用案例》PyTorch是一个流行的开源深度学习框架,提供了灵活且高效的方式来训练和部署神经网络,这篇文章主要介绍... 目录前言模型案例A. state_dict()方法验证B. parameters()C. 模型结构冻

线程池ThreadPoolExecutor应用过程

《线程池ThreadPoolExecutor应用过程》:本文主要介绍如何使用ThreadPoolExecutor创建线程池,包括其构造方法、常用方法、参数校验以及如何选择合适的拒绝策略,文章还讨论... 目录ThreadPoolExecutor构造说明及常用方法为什么强制要求使用ThreadPoolExec

mysql_mcp_server部署及应用实践案例

《mysql_mcp_server部署及应用实践案例》文章介绍了在CentOS7.5环境下部署MySQL_mcp_server的步骤,包括服务安装、配置和启动,还提供了一个基于Dify工作流的应用案例... 目录mysql_mcp_server部署及应用案例1. 服务安装1.1. 下载源码1.2. 创建独立

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换

Nginx内置变量应用场景分析

《Nginx内置变量应用场景分析》Nginx内置变量速查表,涵盖请求URI、客户端信息、服务器信息、文件路径、响应与性能等类别,这篇文章给大家介绍Nginx内置变量应用场景分析,感兴趣的朋友跟随小编一... 目录1. Nginx 内置变量速查表2. 核心变量详解与应用场景3. 实际应用举例4. 注意事项Ng

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

Python实现Word文档自动化的操作大全(批量生成、模板填充与内容修改)

《Python实现Word文档自动化的操作大全(批量生成、模板填充与内容修改)》在职场中,Word文档是公认的好伙伴,但你有没有被它折磨过?批量生成合同、制作报告以及发放证书/通知等等,这些重复、低效... 目录重复性文档制作,手动填充模板,效率低下还易错1.python-docx入门:Word文档的“瑞士

使用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 的应用案例一、分布式系统中的挑战二