d3d12龙书学习之MiniEngine的最小化实现(七) 龙书第11章 模板缓冲

本文介绍了如何使用Direct3D 12的模板缓冲技术在MiniEngine中实现镜像世界。通过修改相机坐标系、深度和模板缓冲设置,以及创建不同的PSO,实现了镜面反射、透明混合和阴影效果。在实施过程中,作者遇到了MiniEngine模板缓冲无效的问题,通过调整深度缓冲区格式得以解决。
摘要由CSDN通过智能技术生成

前言

本章的主要内容是通过模板缓冲来实现镜中世界。
对于镜中世界的实现来说,还可以采用一个额外的摄像机来做,当然我也没有实际操作过。
先按照本章内容来通过模板缓冲做一个实现。

模板缓冲的意义

模板缓冲和深度缓冲是一套东西,他们的缓冲区是合在一起处理的。
我们知道深度缓冲可以通过深度检测,来绘制物体的遮挡关系。而模板缓冲呢?就是按照程序设定的规则,额外进行模板检测,只有通过深度+模板检测的像素才会进行下一步的处理。也就是本身是深度缓冲的一个补充,用于用户自定义的检测。

当然也可以单独使用模板检测。

修改camera坐标系

从做第八章光照的时候,就感觉这个坐标系是有问题的。因为调整的结果不符合预期,我原本以为是自己数学水平不够导致的。
后来修改过这个shader中mul的入参顺序(在C++写常量缓冲区时对矩阵做一次转置)。
直到前几天学这个模板缓冲,发现生成的镜子在墙体的右边(d3d12龙书是在左边),然后终于发现MiniEngine采用的居然是右手坐标系。

dx默认的实际是左手坐标系,opengl才是右手坐标系,我挺讨厌这种“靠拢”的行为(甚至于mul入参顺序也是向opengl靠)

那么第一步,我这里就要把这个坐标系改成左手的(否则学习龙书,直接拿到龙书中的顶点集绘制图形,会z轴翻转)
有3个修改点

camera生成的矩阵修改

BaseCamera类只保留3个矩阵

	// 0 矩阵变换
	// 1. 渲染目标从模型坐标系转到世界坐标系--->世界变换矩阵
	// 2. 再从世界坐标系转到视角坐标系--->视角变换矩阵 m_ViewMatrix
	// 3. 从视角坐标系转换到投影坐标系--->投影变换矩阵 m_ProjMatrix
	
	// 世界坐标系转换到视角坐标系
	Matrix4 m_ViewMatrix;        // i.e. "World-to-View" matrix
	
	// 视角坐标系转到投影坐标系
	Matrix4 m_ProjMatrix;        // i.e. "View-to-Projection" matrix
	
	// 从世界坐标系直接转换到投影坐标系
	Matrix4 m_ViewProjMatrix;    // i.e.  "World-To-Projection" matrix.

Camera.cpp修改如下

void BaseCamera::SetLookDirection( Vector3 forward, Vector3 up )
{
    // 计算前方
    Scalar forwardLenSq = LengthSquare(forward);
    forward = Select(forward * RecipSqrt(forwardLenSq), Vector3(kZUnitVector), forwardLenSq < Scalar(0.000001f));

    // 根据提供的上和前方,计算右方
    Vector3 right = Cross(up,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值