|
|
虽然dx8就加入了支持cubemap的接口,不过小弟我从学习的角度
用vs现实cubemap。我用的是dx9,hlsl写的。除于测试的需要,程序
里面我仅处理了物体正面(-z方向面)的纹理映射情况。下面是hlsl
代码。
matrix WorldMatrix;
matrix ViewMatrix;
matrix ProjMatrix;
struct VS_INPUT
{
vector position OSITION;
vector normal:NORMAL;
};
struct VS_OUTPUT
{
vector position:POSITION;
vector diffuse:COLOR;
float2 uvCoords:TEXCOORD;
};
VS_OUTPUT Shader_Cube_map( VS_INPUT input )
{
float u=0,v=0;
VS_OUTPUT output = (VS_OUTPUT)0;
matrix WorldViewMatrix = mul( WorldMatrix,ViewMatrix );
input.position = mul( input.position, WorldViewMatrix );
output.position = mul( input.position, ProjMatrix );
vector viewPoint = {0,0,0,1};
viewPoint = mul( viewPoint, ViewMatrix );
vector d = input.position-viewPoint;
d = normalize(d);
input.normal = mul( input.normal, WorldViewMatrix );
input.normal = normalize( input.normal );
vector r = 2*(dot(d,input.normal))*input.normal-d;
int max;
float x=abs(r.x);
float y=abs(r.y);
float z=abs(r.z);
if( x>y )
{
if( x>z )
max = 0;
else
max = 2;
}
else
{
if( y>z )
max = 1;
else
max = 2;
}
if( max==2 )
{
if( r.z<0 )
{
u = (r.x+1)/2;
v = (r.y+1)/2;
}
}
output.uvCoords.x = u;
output.uvCoords.y = v;
output.diffuse = 1;
return output;
}
我将程序上传,希望各位大虾看看,指教指教小弟,谢谢了! |
|