2011-12-01 67 views
0

我使用的是directx11,並且我創建了光源(平行光源)和場景(從obj文件加載),並且每件東西看起來都正確,但是當我旋轉場景中的某個對象時,我的光線也隨對象一起旋轉,我不會旋轉燈並保持固定。旋轉對象但保持照明固定DirectX?

我嘗試做這樣的事情來解決這個問題,但我失敗:

XMMATRIX light_rotat = XMMatrixIdentity() 

/*render the light*/ 



XMMATRIX light_rotat = XMMatrixRotationY(timeGetTime()/3500.0f); 

/* render scene */ 

/*的HLSL代碼*/

cbuffer LIGHT 
{ 
    float4 light_color ; 
    float3 Direction ; 
    float3 Position ; 
    float3 attribute ; 
    float Power ; 
    float range ; 
    float spotpower ; 


}; 

cbuffer CAMERA 
{ 
float4x4 view ; 
float4x4 world ; 
float4x4 proj ; 
}; 

cbuffer local 
{ 
float3 eye; 
float4x4 localworld ; 

}; 
Texture2D texture_obj ; 
SamplerState Texture_sampler ; 
/* diffuse texture */ 
float4 Get_Texture (float2 uv ) 

{ 
return texture_obj.Sample (Texture_sampler , uv ); 

} 

/* light calc */ 
float4 Parrallel (float3 eye ,float3 Position ,float3 Normal , MTRL mtrl ) 
{ 

float3 lightvec = normalize(-Direction) ; 

float4 LitColor = float4(0.0f , 0.0f ,0.0f ,0.0f); 

float diff_factor = dot(lightvec , Normal); 
float4 diff = light_color * mtrl.Diffuse_Mtrl ; 

if (diff_factor > 0.0f) 
    { 
     float4 amb = light_color * mtrl.Ambient_Mtrl ; 

     float3 view = normalize(eye - Position) ; 


     float3 rf = normalize(reflect (Direction , Normal)) ; 



     float4 Spec_Fac = pow (max (dot (rf , view) , 0.0f) , max (1.0f ,Power)); 
     float4 Spec = light_color * mtrl.Specular_Mtrl ; 

     LitColor += (diff *diff_factor) + (Spec_Fac*Spec) + (amb*diff_factor) ; 
    } 
return LitColor ; 

} 

struct VS_INPUT 
{ 
float4 Pos :POSITION ; 
float3 Normal : NORMAL0 ; 
float2 UV : TEXCOORD0 ; 
}; 


struct VS_OUT 
{ 
float4 Pos :SV_Position ; 
float4 Posw : POSITION ; 
float4 Normal : TEXCOORD1 ; 
float2 UV : TEXCOORD0 ; 


}; 



VS_OUT VS (VS_INPUT input) 
{ 
VS_OUT v ; 





    v.Pos = mul (input.Pos , localworld); 
    v.Pos = mul (v.Pos , world); 
    v.Pos = mul (v.Pos , view); 
    v.Pos = mul (v.Pos , proj); 


    v.Posw = mul (input.Pos, localworld); 

    v.UV = input.UV ; 

    v.Normal = mul (float4(input.Normal , 0.0f) ,world); 

return v ; 
} 


float4 PS (VS_OUT ps):SV_Target 
{ 

    MTRL y ; 
    y.Diffuse_Mtrl = Get_Texture (ps.UV); 
    y.Ambient_Mtrl = y.Diffuse_Mtrl /8 ; 
    y.Specular_Mtrl = float4 (0.5f , 0.5f , 0.5f , 0.0f); 
    float4 licolor = Parrallel (eye , (float3)ps.Posw , (float3)ps.Normal ,y) ; 


    return licolor ; 
} 



technique11 tech2 
{ 
pass P0 
{ 
    SetVertexShader(CompileShader(vs_5_0, VS())); 
    SetPixelShader(CompileShader(ps_5_0, PS())); 
} 

}

這是渲染迴圈

Device->Draw(Color); 

t.localworld = ::XMMatrixTranspose (XMMatrixRotationY (timeGetTime() /3000.0f)); 
t.eye = XMFLOAT3(0.0f, 10.0f, -30.0f); 

local->UpdateSubresource (My_Buffer , 0 , NULL ,0, 0 , &t ); 

ID3DX11EffectConstantBuffer *cm = effect->Get_Effect()->GetConstantBufferByName ("local"); 
cm->SetConstantBuffer (Local->Get_Buffer()); 


effect->Apply(Flags , Context); 
mesh->draw(); 


Device->EndDraw(); 

有什麼幫助?

回答

0

好的,'localworld'矩陣應該是這裏的關鍵,你需要做的是創建一個旋轉矩陣Y,然後乘以localworld變量和這個旋轉矩陣,然後在你的localLocal變量中寫入HLSL渲染循環。這應該只會旋轉你的頂點,而你的燈光應該保持靜止。

+0

她是新代碼請閱讀 – user943998

+0

此外,posw變量也必須與世界矩陣相乘,因爲這應該是世界頂點位置,並且您還可以在像素着色器中規範法線,但我不認爲這會影響結果。 – alwynd

+0

對不起!但沒有任何事情發生,但仍然是我的燈光正在旋轉 – user943998