DX10中引入了cube纹理,这种纹理可以记录纹理的方向坐标轴。
其使用方式如下:
一.使用Texture tool 制作一个cube纹理。
二.将纹理作为一个资源载入,并将其赋值给TextureCube类型的hlsl渲染资源
三.使用Sample(SamplerState,float3)进行映射
四.绘制天空盒,我们这里可以绘制一个半圆
五.进行背后拣选,因为我们是处于天空盒内部的,所以必须要对天空盒内部进行绘制。
改变深度缓存的比较方式。
六.由LESS变成LESS_EQUAL
具体代码:
1.使用工具texture tool即可
2.使用以下代码载入资源
D3DX10_IMAGE_LOAD_INFO loadInfo;
loadInfo.MiscFlags = D3D10_RESOURCE_MISC_TEXTURECUBE;
ID3D10Texture2D* tex = 0;
HR(D3DX10CreateTextureFromFile(md3dDevice, filename.c_str(),
&loadInfo, 0, (ID3D10Resource**)&tex, 0) );
D3D10_TEXTURE2D_DESC texDesc;
tex->GetDesc(&texDesc);
D3D10_SHADER_RESOURCE_VIEW_DESC viewDesc;
viewDesc.Format = texDesc.Format;
viewDesc.ViewDimension = D3D10_SRV_DIMENSION_TEXTURECUBE;
viewDesc.TextureCube.MipLevels = texDesc.MipLevels;
viewDesc.TextureCube.MostDetailedMip = 0;
ID3D10ShaderResourceView* rv = 0;
HR(md3dDevice->CreateShaderResourceView(tex, &viewDesc, &rv));
上面代码最后的rv即为纹理资源
mfxCubeMapVar = fx::SkyFX->GetVariableByName("gCubeMap")->AsShaderResource();
这里将着色器程序中的gCubeMap变量与mfxCubeMapVar变量进行交互。
HR(mfxCubeMapVar->SetResource(rv));//将纹理资源赋值给着色器变量
3.在着色器程序中
gCubeMap.Sample(gTriLinearSam, pIn.texC);
其中gTriLinearSam为
SamplerState gTriLinearSam
{
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Wrap;
AddressV = Wrap;
};
主要描述了纹理的状态
4.绘制半圆,同时保持圆心与摄像头出于同一位置。
5.设置背部消隐和深度缓存的处理
//定义了一个不进行背部消隐的状态
RasterizerState NoCull
{
CullMode = None;
};
DepthStencilState LessEqualDSS
{
// 默认状态为LESS,但是这样的话,那些处于深度缓存z=1的位置点将不能显示
//所以改成LESS_EQUAL
DepthFunc = LESS_EQUAL;
};
technique10 SkyTech
{
pass P0
{
SetVertexShader( CompileShader( vs_4_0, VS() ) );
SetGeometryShader( NULL );
SetPixelShader( CompileShader( ps_4_0, PS() ) );
SetRasterizerState(NoCull);
SetDepthStencilState(LessEqualDSS, 0);
}
}