DX10使用cube纹理实现天空盒

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);

    }

}

 

你可能感兴趣的:(image,filter,null,less,float,shader)