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