Direct X 12实现投影纹理贴图

阴影贴图是游戏软件开发中常用的动态阴影实现的方法,想要使用这种方法就必须知道投影纹理特土这种技术,通过这种技术可以实现一些特殊的效果,可以将图片投影到某个物体上,制造一种光影变换。

投影

投影

投影纹理贴图,字面上的意思是通过投影将纹理附加在游戏物体上,但是在渲染流水线中纹理没办法主动去寻找附加的对象,纹理不能直接在场景中渲染必须附加在游戏物体上,所以投影纹理贴图实际上就和普通的贴图比较类似。

普通的纹理贴图是在游戏物体上设置纹理坐标,然后通过纹理坐标去寻找对应贴图上对应位置的纹素,而投影纹理贴图则不需要设置纹理坐标,也不用绑定纹理,它只需要在像素着色器中在与投影纹理相同的坐标系下进行采样然后附加就可以了。

  1. 先要设定投影机的位置朝向(就是摄像机中的视图矩阵),将世界坐标中的位置转换到投影机的坐标系中。
  2. 设置投影机的投影方式(即计算投影矩阵),将投影机中的坐标转换到投影矩阵中。
  3. 将经过投影后点的位置转换到纹理坐标中去,便于从投影纹理中采样。
  4. 将投影机的视图、投影举证、纹理矩阵结合存储在常量缓存区中,然后传递到像素着色器中计算世界坐标系中像素点对应的投影纹理的位置。
  5. 通过上面计算出来的位置,对投影纹理进行采样叠加该点的其他因素。
//1.先计算视图矩阵V、投影矩阵P、纹理矩阵T
//2.将V*P*T保存在常量缓存区
//3.在像素着色器中将世界坐标系中的点经过VPT转换到纹理坐标空间中
//4.再用得到的纹理坐标对想要投影的图片进行采样
	
	//投影机位置
	XMVECTOR pos = XMVectorSet(10.0f, 10.0f, 10.0f, 1.0f);
	投影机指向的位置
	XMVECTOR target = XMVectorZero();
	//世界空间中的Y轴
	XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
	//通过以上三个向量求视图矩阵
	XMMATRIX V = XMMatrixLookAtLH(pos, target, up);
	//通过平截头体计算投影矩阵
	XMMATRIX P = XMMatrixPerspectiveFovLH(0.25f*MathHelper::Pi, AspectRatio(), 1.0f, 200.0f);
	
	//纹理矩阵,手动计算从NDC到纹理
	XMMATRIX T = { 0.5f,0.0f,0.0f,0.0f,
				0.0f,-0.5f,0.0f,0.0f,
				0.0f,0.0f,1.0f,0.0f,
				0.5f,0.5f,0.0f,1.0f };
	//将三个的乘积保存在常量缓存区
	XMStoreFloat4x4(&mMainPassCB.LightViewProj, XMMatrixTranspose(V*P*T));

 

未经允许不得转载:他日重逢 » Direct X 12实现投影纹理贴图

赞 (1) 打赏

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

隐藏
变装