C++ 旋转对象但保持照明固定DirectX?

C++ 旋转对象但保持照明固定DirectX?,c++,directx,C++,Directx,我使用的是directx11,我创建了光源平行光源和从obj文件加载的场景,每个东西看起来都是正确的,但是当我旋转场景中的某个对象时,我的灯光也随着对象旋转,我不习惯旋转灯光并保持固定 我试图通过这样做来解决问题,但失败了: XMMATRIX light_rotat = XMMatrixIdentity() /*render the light*/ XMMATRIX light_rotat = XMMatrixRotationY(timeGetTime()/3500.0f); /* r

我使用的是directx11,我创建了光源平行光源和从obj文件加载的场景,每个东西看起来都是正确的,但是当我旋转场景中的某个对象时,我的灯光也随着对象旋转,我不习惯旋转灯光并保持固定

我试图通过这样做来解决问题,但失败了:

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

有什么帮助吗?

好的,“localworld”矩阵应该是这里的关键,在将localworld变量写入渲染循环中的HLSL之前,您需要创建一个旋转矩阵Y,并将localworld变量与该旋转矩阵相乘。这应该只旋转顶点,灯光应该保持静止。

此外,posw变量还必须与世界矩阵相乘,因为这应该是世界中的顶点位置,并且您还可以在像素着色器中规格化法线,但我认为这不会影响此结果。抱歉!但是什么也没发生,我的光还是旋转的!,在我看来没问题,有一件事我注意到可能会影响光线从曲面反射的方式,在顶点着色器中,将输入法线与局部矩阵以及世界矩阵相乘,此时法线仅与世界矩阵相乘,这可能是身份,也在着色器中,计算反射时,再次使用灯光方向的倒数,即float3 rf=normalizereflect-direction,Normal;对不起,没有变化,我仍然有问题,我会通过完整的代码