您的位置:首页 > 服装鞋帽 > 男装 > DX10使用cube纹理实现天空盒

DX10使用cube纹理实现天空盒

luyued 发布于 2011-01-06 22:33   浏览 N 次  

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

}

}


MSN空间完美搬家到新浪博客!

广告赞助商