环境: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。