DirectX光影详解

本文详细介绍了如何使用DirectX9实现逐片段光照和阴影贴图。通过声明和设置着色器常量句柄,传递变换矩阵和光照参数,实现了从世界变换到光照空间的转换。在阴影贴图渲染时,使用正交矩阵和视图矩阵创建光空间投影变换。在像素着色器中应用过滤算法以消除锯齿,提供更平滑的阴影效果。参考链接提供了更多阴影过滤算法的深入探讨。
摘要由CSDN通过智能技术生成

这里我用DirectX9实现一遍逐片段光照与阴影贴图,阴影贴图的算法与OpenGL的相同,各位仔细看好了.

首先声明四个着色器并获取它们的常量句柄:

void initShaders() {
	storeVertexShader=new Shader("../shader/store_vs.fx",SHADER_TYPE_VS);
	modelMatrixStoreHand=storeVertexShader->constTable->GetConstantByName(NULL,"modelMatrix");
	viewMatrixStoreHand=storeVertexShader->constTable->GetConstantByName(NULL,"viewMatrix");
	projMatrixStoreHand=storeVertexShader->constTable->GetConstantByName(NULL,"projMatrix");

	storePixShader=new Shader("../shader/store_ps.fx",SHADER_TYPE_PS);

	texVertexShader=new Shader("../shader/tex_vs.fx",SHADER_TYPE_VS);
	modelMatrixHand=texVertexShader->constTable->GetConstantByName(NULL,"modelMatrix");
	viewMatrixHand=texVertexShader->constTable->GetConstantByName(NULL,"viewMatrix");
	projMatrixHand=texVertexShader->constTable->GetConstantByName(NULL,"projMatrix");
	normalMatrixHand=texVertexShader->constTable->GetConstantByName(NULL,"normalMatrix");
	shadowMatrixHand=texVertexShader->constTable->GetConstantByName(NULL,"shadowMatrix");

	texPixShader=new Shader("../shader/tex_ps.fx",SHADER_TYPE_PS);
	ambHand=texPixShader->constTable->GetConstantByName(NULL,"amb");
	diffHand=texPixShader->constTable->GetConstantByName(NULL,"diff");
	lightDirHand=texPixShader->constTable->GetConstantByName(NULL,"lightDir");
	ambMtlHand=texPixShader->constTable->GetConstantByName(NULL,"ambMtl");
	diffMtlHand=texPixShader->constTable->GetConstantByName(NULL,"diffMtl");
}

store开头的顶点与片段着色器在渲染阴影贴图时使用,用于保存以光源位置为视点的场景深度,接着是取得mvp变换矩阵的句柄.

tex开头的顶点与片段着色器在渲染场景时使用,用于执行深度比较以及光照运算,然后也是获得mvp变换矩阵,法线变换矩阵,光源视点投影变换矩阵和各种光照参数的句柄.

有了这些句柄我们就可以给着色器中的常量传值了.


接着设置光照参数:

float lightd[4] = {1.0f, 1.0f, -1.0f, 0.0f};
float ambientLight[4] = {0.7f, 0.7f, 0.7f, 1.0f};
float diffuseLight[4] = {1.0f, 1.0f, 1.0f, 1.0f};
float ambientLightMtl[4] = {0.7f, 0.7f, 0.7f, 1.0f};
float diffuseLightMtl[4] = {1.0f, 1.0f, 1.0f, 1.0f};

void initLight() {
	D3DXVECTOR4 amb(ambientLight);
	D3DXVECTOR4 diff(diffuseLight);
	D3DXVECTOR4 lightDir(lightd);
	D3DXVECTOR4 ambMtl(ambientLightMtl);
	D3DXVECTOR4 diffMtl(diffuseLightMtl);
	texPixShader->constTable->SetVector(d3d,ambHand,&amb);
	texPixShader->constTable->SetVector(d3d,diffHand,&diff
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值