I'm currently trying to implement a ArcBall Camera which should fly around a given XMFLOAT3 position stored in a cb with a spezified distance to the position. I used the code from Allen Sherrod for this but the constant buffer that should pass the viewmatrix and the second one for the position to the shaders doesn't update. Any ideas?
This should return the view mat:
XMMATRIX ArcCamera::GetViewMatrix()
{
XMVECTOR zoom = XMVectorSet(0.0f, 0.0f, distance_, 1.0f);
XMMATRIX rotation = XMMatrixRotationRollPitchYaw(xRotation_, -yRotation_, 0.0f);
zoom = XMVector3Transform(zoom, rotation);
XMVECTOR pos = XMLoadFloat3(&position_);
XMVECTOR lookAt = XMLoadFloat3(&target_);
pos = lookAt + zoom;
XMStoreFloat3(&position_, pos);
XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 1.0f);
up = XMVector3Transform(up, rotation);
XMMATRIX viewMat = XMMatrixLookAtLH(pos, lookAt, up);
return viewMat;
}
The rotation (xRotation, yRotation) increases every frame.
The shaders:
Texture2D colorMap : register( t0 );
SamplerState colorSampler : register( s0 );
cbuffer cbChangesEveryFrame : register( b0 )
{
matrix worldMatrix;
};
cbuffer cbNeverChanges : register( b1 )
{
matrix viewMatrix;
};
cbuffer cbChangeOnResize : register( b2 )
{
matrix projMatrix;
};
cbuffer cbCameraData : register( b3 )
{
float3 cameraPos;
};
struct VS_Input
{
float4 pos : POSITION;
float2 tex0 : TEXCOORD0;
float3 norm : NORMAL;
};
struct PS_Input
{
float4 pos : SV_POSITION;
float2 tex0 : TEXCOORD0;
float3 norm : NORMAL;
float3 lightVec : TEXCOORD1;
float3 viewVec : TEXCOORD2;
};
PS_Input VS_Main( VS_Input vertex )
{
PS_Input vsOut = ( PS_Input )0;
float4 worldPos = mul( vertex.pos, worldMatrix );
vsOut.pos = mul( worldPos, viewMatrix );
vsOut.pos = mul( vsOut.pos, projMatrix );
vsOut.tex0 = vertex.tex0;
vsOut.norm = mul( vertex.norm, (float3x3)worldMatrix );
vsOut.norm = normalize( vsOut.norm );
float3 lightPos = float3( 0.0f, 500.0f, 50.0f );
vsOut.lightVec = normalize( lightPos - worldPos );
vsOut.viewVec = normalize( cameraPos - worldPos );
return vsOut;
}
float4 PS_Main( PS_Input frag ) : SV_TARGET
{
float3 ambientColor = float3( 0.2f, 0.2f, 0.2f );
float3 lightColor = float3( 0.7f, 0.7f, 0.7f );
float3 lightVec = normalize( frag.lightVec );
float3 normal = normalize( frag.norm );
float diffuseTerm = clamp( dot( normal, lightVec ), 0.0f, 1.0f );
float specularTerm = 0;
if( diffuseTerm > 0.0f )
{
float3 viewVec = normalize( frag.viewVec );
float3 halfVec = normalize( lightVec + viewVec );
specularTerm = pow( saturate( dot( normal, halfVec ) ), 25 );
}
float3 finalColor = ambientColor + lightColor * diffuseTerm + lightColor * specularTerm;
return float4( finalColor, 1.0f );
}
Must I update all subresources and stuff before every time I call the context's draw method to render every my objects by the way?