当前位置: 首页 > news >正文

Direct3D模板缓存

模板缓存是一个用于获得某种特效的离屏缓存,模板缓存的分辨率与后台缓存和深度缓存的分辨率完全相同,所以像素也是一一对应的,模板缓存允许我们动态的,有针对性的决定是否将某个像素写入后台缓存中。

例如实现镜面效果时,我们只需在在镜子所在平面中绘制某个特定物体的映像,但是如果想只在镜面所对应的子区域中显示物体的映像,这是就可用模板缓存来阻止物体映像在非镜面区域中的绘制,a中镜面和墙壁映像都会被绘制,b中阻止了非镜面区域的绘制

模板缓存的使用

为了使用模板缓存,在Direct3D初始化时需要查询当前设备是否支持模板缓存,如果支持还需要将其启用。

Device->SetRenderState(D3DRS_STENCILENABLE, true);
//do stencil work
Device->SetRenderState(D3DRS_STENCILENABLE, false);

我们可以使用IDirect3DDevice9::Clear方法将模板缓存清空为一个默认值,该方法也可对后台缓存和深度缓存进行清空操作

Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL, 0x00000000, 1.0f, 0);

在第三个参数中增加了标记D3DClEAR_DTENCIL表明我们要对模板缓存、目标缓存(后台缓存)和深度缓存进行清空操作,第6个参数用于指定要将模板缓存清为何值。

模板缓存格式的查询

模板缓存可与深度缓存一同创建,为深度缓存指定格式时,我们可以同时指定模板缓存的格式,模板缓存和深度缓存共享同一个离屏的表面缓存,而每个像素的内存段被划分为若干部分,分别于某种特定缓存相对应例如:

D3DFMT_D24S8:创建一个32位深度/模板缓存,其中每个像素的24位指定给深度缓存,8位指定给模板缓存
D3DFMT_D24X4S4:创建一个32位深度/模板缓存,每个像素的24位指定给深度缓存,4位指定给模板缓存,其余4位不使用
D3DFMT_D15S1:创建一个16位深度/模板缓存,每个像素的15位指定给深度缓存,1位指定给模板缓存
一些格式没有模板缓存分配任何空间,例如D3DFMT_D32格式仅创建一个32位的深度缓存

模板测试

判定是否将某个像素写入后台缓存的决策过程过程称为模板测试,假定模板已处于启用状态则每个像素都需要进行模板测试。

(ref & mask) ComparisonOperation (value & mask)
左操作数LHS:由应用程序定义的模板参考值ref和模板掩码mask通过按位与运算得到
右操作数RHS:由当前进行测试的像素的模板缓存中的数值value与模板掩码mask按位与得到
运算结果为true则将该像素写入后台缓存,如果为false将阻止该像素被写入后台缓存,当一个像素不被写入后台缓存时,也 不会被写入深度缓存。

模板测试的控制

模板参考值
模板参考值ref的默认值为0,我们可用D3DRS_STENCILREF绘制状态改变该值,我们倾向于使用16进制数,这样可使整数的位排列一目了然,方便按位逻辑运算

Device->SetRenderState(D3DRS_STENCILREF, 0x1);

模板掩码
模板掩码用于屏蔽ref和value变量中某些位,默认值为0xffffffff,表会不屏蔽任何位,可借助绘制状态D3DRS_STENCILMASK来修改

//屏蔽了高16位
Device->SetRenderState(D3DRS_STENCILMASK, 0x0000ffff);

模板值
该值是当前待测试像素在模板缓存中的对应值,不能显式地单独设置模版值,但是可对模板缓存进行清空操作,还可以用模板的绘制状态控制将要写入模板缓存的内容。

比较运算
可通过绘制状态D3DRS_STENCILFUNC来设置比较运算符函数,参数可用D3DCMPFUNC类型枚举
D3DCMP_NEVER:模板测试总是失败,即比较函数总是返回false
D3DCMP_LESS:LHS<RHS,则模板测试成功
D3DCMP_EQUAL:LHS=RHS,则模板测试成功
D3DCMP_LESSEQUAL:LHS<=RHS
D3DCMP_GREATER:LHS>RHS
D3DCMP_NOTEQUAL:LHS!=RHS
D3DCMP_GREATEREQUAL:LHS>=RHS
D3DCMP_ALWAYS:模板测试总是成功,返回true

模板缓存的更新

除了决定一个具体像素是否应被写入后台缓存,我们还可以基于以下3种可能的情形定义模板缓存中的值如何进行更新

第i行、第j列的像素模板测试失败,可借助绘制状态D3DRS_STENCILFAIL将模板缓存中处于同样位置的项的更新方式定义如下

Device->SetRenderState(D3DRS_STENCILFAIL, StencilOperation);

第i行、第j列的像素深度测试失败,可借助绘制状态D3DRS_STENCILZFAIL将模板缓存中处于同样位置的项的更新方式定义如下

Device->SetRenderState(D3DRS_STENCILZFAIL, StencilOperation);

第i行、第j列的像素深度测试、模板测试均成功,可借助绘制状态D3DRS_STENCILPASS将模板缓存中处于同样位置的项的更新方式定义如下

Device->SetRenderState(D3DRS_STENCILPASS, StencilOperation);

StencilOperation可取以下预定义常量
D3DSTENCILOP_KEEP:不更新模板缓存中的值(保留当前值)
D3DSTENCILOP_ZERO:将模板缓存中的值设为0
D3DSTENCILOP_REPLACE:用模板参考值替代模板缓存中的对应值
D3DSTENCILOP_INCRSAT:增加模板缓存中的对应数值,如果超过最大值,则取最大值
D3DSTENCILOP_DECRSAT:减少模板缓存中的对应数值,如果小于最小值,则取最小值
D3DSTENCILOP_INVERT:模板缓存中的对应值按位取反
D3DSTENCILOP_INCR:增加模板缓存中的对应数值,如果超过最大值,则取0
D3DSTENCILOP_DECR:减少模板缓存中的对应数值,如果小于0,则取最大值

模板写掩码

除了模板绘制状态,还可设置写掩码,该值可屏蔽我们将写入模板缓存的任何值的某些位,可用绘制状态D3DRS_STENCILWRITEMASK来设定写掩码的值,默认值为0xffffffff

Device->SetRenderState(D3DRS_STENCILWRITEMASK, 0x0000ffff);

镜面效果例程

程序中实现镜面效果需要解决俩个问题
1.了解对于任意平面物体如何成像 
2.必须将某一表面区域"标记"为镜面

D3DX库提供了用于创建对于任意平面的镜像变换矩阵

D3DXMATRIX* D3DXMatrixReflect(D3DXMATRIX *pOut,		CONST D3DXPLANE *pPlane
);

3种其他类型的镜像变换矩阵,分别为相对于3个标准坐标平面(yz平面、xz平面及xy平面)所做的镜像变换

R_{yz}=\begin{bmatrix} -1 & 0 & 0 &0 \\ 0&1 & 0 &0 \\ 0& 0& 1 &0 \\ 0& 0 &0 &1 \end{bmatrix}  R_{xz}=\begin{bmatrix} 1 & 0 & 0 &0 \\ 0&-1 & 0 &0 \\ 0& 0& 1 &0 \\ 0& 0 &0 &1 \end{bmatrix}  R_{xy}=\begin{bmatrix} 1 & 0 & 0 &0 \\ 0&1 & 0 &0 \\ 0& 0& -1 &0 \\ 0& 0 &0 &1 \end{bmatrix}

为求得一个点相对于yz平面所成的像,只需将该点的x分量取反,类似xz平面将y分量取反,xy平面将z分量取反

效果实现

实现镜面效果时,一个物体仅当位于镜面之前时才对其进行成像计算,然而我们不想进行空间测试以判断某物体是否位于镜面之前,因为这样会使问题变得更加复杂,为了简化简化这个问题,无论物体在何处,都计算其成像并进行绘制,然后借助模板缓存区阻止部分区域的绘制

1.往常绘制整个场景(地板、墙壁、镜面、茶壶)但先不绘制茶壶的映像
2.将模板缓存清0
3.将构成镜面的图元绘制到模板缓存中,将模板测试设置为总是true,并指定如果测试通过,模板缓存值被替换为1,所以镜面外的区域像素值则为0
4.将茶壶的映像绘制到后台缓存和模板缓存中,如果通过了模板测试,将茶壶的映像仅绘制到后台缓存中,模板测试成功条件为模板缓存值为1,这样茶壶仅被绘制到镜面区域中
 

相关文章:

Direct3D模板缓存

模板缓存是一个用于获得某种特效的离屏缓存&#xff0c;模板缓存的分辨率与后台缓存和深度缓存的分辨率完全相同&#xff0c;所以像素也是一一对应的&#xff0c;模板缓存允许我们动态的&#xff0c;有针对性的决定是否将某个像素写入后台缓存中。 例如实现镜面效果时&#xf…...

在windows上执行ssh-keygen报错Bad permissions

在windows上执行ssh-keygen报错Bad permissions&#xff1a;如下 C:\Users\xiaoming>ssh-keygen -p -m PEM -f C:\mywork\id_rsa Bad permissions. Try removing permissions for user: BUILTIN\\Users (S-1-6-92-143) on file C:/mywork/id_rsa.WARNING: UNPROTECTED PRIV…...

给Proxmox VE 虚拟机分配巨大分区惹麻烦

由于缺乏良好的规划&#xff0c;有开发人员直接在公有云采购一个容量超过100TB的NAS存储&#xff0c;使用过程中&#xff0c;数据的存储也没有规划&#xff0c;业务数据一股脑的写入到同一个目录&#xff0c;下边的子目录没有规律&#xff0c;用用户的图片、视频、访问日志、甚…...

数学建模——统计回归模型

一、基本知识 1、基本统计量 总体&#xff1a;研究对象的某个感兴趣的指标。样本&#xff1a;从总体中随机抽取的独立个体X1,X2,…,Xn&#xff0c;一般称(X1,…,Xn)为一个样本&#xff0c;可以看成一个n维随机向量&#xff0c;它的每一取组值(x1,…,xn)称为样本的观测值。统计…...

C++【个人笔记1】

1.C的初识 1.1 简单入门 #include<iostream> using namespace std; int main() {cout << "hello world" << endl;return 0; } #include<iostream>; 预编译指令&#xff0c;引入头文件iostream.using namespace std; 使用标准命名空间cout …...

博通强迫三星签不平等长约,被韩处罚1亿元 | 百能云芯

近日&#xff0c;博通&#xff08;Broadcom&#xff09;这家国际知名的半导体公司因其市场主导地位的滥用&#xff0c;遭到了韩国公平贸易委员会&#xff08;FTC&#xff09;的严厉制裁&#xff0c;罚款高达191亿韩元&#xff0c;约合人民币1.04亿元。这一惩罚背后的故事揭示了…...

版本控制 Sourcetree

Sourcetree软件做版本控制&#xff0c;小程序的代码和springboot项目的代码放到同一个文件夹下&#xff0c; 无脑安装就行 命名就用项目名bkd表示springboot项目名 项目命名xcx表示小程序 每次上传代码&#xff0c;一定要先拉下代码不然代码冲突处理起来比较麻烦...

题目 1059: 二级C语言-等差数列

题目描述 sum2581114…&#xff0c;输入正整数n&#xff0c;求sum的前n项和。样例输入 2样例输出 7 根据题目我们得知&#xff0c;求一个等差数列的和。 等差数列的下一项前一项d。d是等差。 根据这个直接求每一项&#xff0c;再加进sum的和&#xff0c;最后输出即可。 在本题中…...

HarmonyOS 如何使用异步并发能力进行开发

一、并发概述 并发是指在同一时间段内&#xff0c;能够处理多个任务的能力。为了提升应用的响应速度与帧率&#xff0c;以及防止耗时任务对主线程的干扰&#xff0c;HarmonyOS 系统提供了异步并发和多线程并发两种处理策略。 ● 异步并发是指异步代码在执行到一定程度后会被暂…...

时间格式化时候HH和hh的区别

SimpleDateFormat simpleDateFormatnew SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); simpleDateFormat.format(new Date()) HH&#xff08;大写&#xff09;&#xff1a;表示使用24小时制&#xff08;也称为军用时间制&#xff09;来表示小时。它的范围是从00到23。例…...

aliyunoss上传图片

依赖 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.8.1</version></dependency>配置文件 config:alioss:endpoint: oss-cn-shanghai.aliyuncs.com&#xff08;节点名 我…...

动手吧,vue数字动画

数字动画&#xff0c;有数字的地方都能用上&#xff0c;拿去吧&#xff01; 效果&#xff1a; 1、template部分 <template><div class"v-count-up">{{ dispVlaue }}</div> </template> 2、js部分 export default {data() {return {timer…...

Android12之仿Codec2.0实现传递编解码器组件本质(四十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…...

MongoDB【部署 04】Windows系统实现MongoDB多磁盘存储

Windows系统实现多磁盘存储 1.为什么2.多磁盘存储2.1 数据库配置2.2 文件夹磁盘映射2.3 创建新的数据集 3.总结 1.为什么 这里仅针对只有一台Windows系统服务器的情景&#xff1a; 当服务器存储不足时&#xff0c;或者要接入更多的数据&#xff0c;就会挂载新磁盘&#xff0c…...

ruoyi框架使用自定义用户表登录

背景 有的时候我们做框架升级或改造的时候&#xff0c;需要用到原来的部分表&#xff0c;比如只是用ruoyi的框架&#xff0c;然后登录的用户逻辑还是想用自己的表&#xff0c;那么接下来这边文章将介绍修改逻辑。 修改教程 1、SysLoginController.java 大家找到这个login方…...

计算机视觉与深度学习-卷积神经网络-卷积图像去噪边缘提取-卷积-[北邮鲁鹏]

目录标题 参考学习链接卷积的定义卷积的性质叠加性平移不变性交换律结合律分配律标量 边界填充边界填充方法 - 常数填充最常用常数填充零填充&#xff08;zero padding&#xff09;拉伸镜像 卷积示例单位脉冲核无变化平移平滑锐化 卷积核平均卷积核高斯卷积核高斯卷积核定义高斯…...

JS手动实现发布者-订阅者模式

发布-订阅模式是一种对象间一对多的依赖关系&#xff0c;当一个对象的状态发送改变时&#xff0c;所有依赖于它的对象都将得到状态改变的通知。具体过程是&#xff1a;订阅者把自己想订阅的事件注册到调度中心&#xff0c;当发布者更新该事件时通知调度中心&#xff0c;由调度中…...

【含面试题】MySQL死锁日志分析与解决的Java代码实现

AI绘画关于SD,MJ,GPT,SDXL百科全书 面试题分享点我直达 2023Python面试题 2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java、python面试题 项目实战:AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI…...

解决方案:TSINGSEE青犀+智能分析网关助力智慧仓储智能化监管

为全面保障物流仓储的安全性与完整性&#xff0c;解决仓库管理难题&#xff0c;优化物流仓储方式&#xff0c;提升仓储效率&#xff0c;降低人工成本&#xff0c;旭帆科技推出智慧仓储AI视频智能分析方案&#xff0c;利用物联网、大数据、云计算等技术&#xff0c;对仓储管理进…...

进程间通信

#include <unistd.h> int pipe(int pipefd[2]); 功能&#xff1a;创建一个匿名管道&#xff0c;用于进程间通信 参数&#xff1a; -int pipefd[2]:传出参数 pipefd[0]对应的是管道的读端 pipefd[0]对应的是管道的写端 返回值&#xff1a; 成功返回0&#xff0c;失败返回-…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...