DirectX11编程10 红龙书第八章练习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012632851/article/details/83480399

环境:VS2017  语言:C++

 

附上工程的链接:https://github.com/anguangzhihen/Dx11

1.这边的程序都是以win64运行的;

2.如果没有找到Common脚本,请到工程/属性/VC++目录中添加包含目录“../Common”;

3.如果没有找到libs,请到工程/属性/链接器添加附加库目录“../Common/libs”

4.所有的练习都在工程中,全局搜索“练习8”关键字就能找到,想要运行打开注释即可。

 

有任何错误,请大佬们指正。

 

1.实现书上例子采样的效果?

答:

// 8.7 8.9
sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;	// 常量过滤模式
sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;	// 线性过滤模式
sampDesc.Filter = D3D11_FILTER_ANISOTROPIC;	// 各向异性过滤模式

// 8.10
XMMATRIX scale = XMMatrixScaling(3.0f, 3.0f, 0.0f);
XMMATRIX translation = XMMatrixTranslation(-0.5f, -0.5f, 0.0f);
XMStoreFloat4x4(&mTexTransform, XMMatrixMultiply(scale, translation));

// 8.11
sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_BORDER; 	// uv不在0、1范围内的取黑色
sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_BORDER;
sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_BORDER;

// 8.12
sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; 	// uv不在0、1范围内的取0、1的颜色
sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;

// 8.13
sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_MIRROR; 	// uv不在0、1范围内的以镜像取值
sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_MIRROR;
sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_MIRROR;

3种过滤模式、4种取址模式,这边少了一种最常用的D3D11_TEXTURE_ADDRESS_WRAP,它是将uv不在0、1范围的值取余映射到0、1中。

 

2.使用DxTex工具将一个纯色的图片替换Mipmap链中的一张图片,验证Mipmap的运行?

答:

 

这边的工具直接使用了DirectX SDK(Jun3 2010)中的,使用page up、page down按键切换到想要的替换的贴图后,点击File -> Open Onto This Surface进行替换。

 

以上例子将dds文件替换为WoodCrate01Mipmap.dds即可运行。

 

3.使用两张贴图,对它们采样后的颜色进行相乘操作,验证结果?

答:

 

很简单,就是多采样的一张图片,然后在片元着色器中将两者颜色相乘。效果太白了,不过还是能很清晰的看到两张图片融合在一起了。

 

4.将纹理旋转起来?

答:

// C++
XMVECTOR axis = XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f);
XMMATRIX rot = XMMatrixRotationAxis(axis, 360.0f * sinf(mTimer.TotalTime() / 1000));	// 旋转纹理
XMMATRIX translation = XMMatrixTranslation(0.5f, 0.5f, 0.0f);	// 将旋转中心移动到0.5, 0.5位置
XMStoreFloat4x4(&mTexTransform, rot * translation);

// Shader
vout.Tex = mul(float4(vin.Tex - float2(0.5f, 0.5f), 0.0f, 1.0f), gTexTransform).xy;

在Shader中将Texture的中心移动到了0.5, 0.5的位置,保证旋转时按照中心进行旋转。

 

5.在Cube上使用帧动画实现火焰特效?

答:

// 获取火焰纹理 练习8.5
WCHAR fileName[40];
for (size_t i = 0; i < 120; i++)
{
	ID3D11ShaderResourceView* texture;
	wsprintf(fileName, L"Textures\\FireAnim\\Fire%03d.bmp", i + 1);
	CreateWICTextureFromFile(md3dDevice, fileName, nullptr, &texture);
	mFires.push_back(texture);
}

这边使用CreateWICTextureFromFile加载bmp图片,并放到了一个vector中。然后在Update中每1/30秒更换为下一张图片。

 

事实上这种方式的效率非常的低下,比较好的做法是将图片打成图集,然后再切换uv的取值范围进行图片的切换。

 

6.q0、q1、q2是贴图上的三个点,当s>=0、t>=0、s+t<=1时,满足(u, v) = q0 + s(q1 – q0) + t(q2 – q0)。给定q0、q1、q2、u、v求解s和t?

答:

 

嗯。。好吧,希望有大神能指点一下看什么书能看懂后面的推导。

 

7.为Skull Demo添加贴图?

答:

 

请参考Chapter 8_3 Excecise7 Skull Texture。

猜你喜欢

转载自blog.csdn.net/u012632851/article/details/83480399