実現したいこと
モーションブラーの実装に使用する速度マップを作りたい。
速度マップが想定した通りに作れていないので、見直す部分や間違えているであろう箇所を教えてほしいです。
発生している問題・分からないこと
下の画像の左上に速度マップを表示させています。オブジェクトの動き関係なくRGで色がついてしまっています。動いていないなら黒になると思うのですが...
該当のソースコード
HLSL
1//各オブジェクトの頂点シェーダーです 2void main(in VS_IN In, out PS_IN Out) { 3 matrix wvp; 4 wvp = mul(World, View); 5 wvp = mul(wvp, Projection); 6 7 Out.Position = mul(In.Position, wvp); 8 Out.TexCoord = In.TexCoord; 9 Out.Diffuse = In.Diffuse * Material.Diffuse; 10 11 matrix prevmvp; 12 prevmvp = mul(PrevWorld, PrevView); 13 prevmvp = mul(prevmvp, PrevProjection); 14 Out.PrevPosition = mul(In.Position, prevmvp); 15}
HLSL
1//各オブジェクトのピクセルシェーダーです 2//Out.Out2が速度マップのレンダーターゲットです 3void main(in PS_IN In, out PS_OUT Out) { 4 if(Material.TextureEnable) { 5 Out.Out0 = g_Texture.Sample(g_SamplerState, In.TexCoord); 6 Out.Out0 *= In.Diffuse; 7 } 8 else { 9 Out.Out0 = In.Diffuse; 10 } 11 Out.Out0.a = In.Diffuse.a; 12 13 Out.Out1 = In.Position.z; 14 15 float2 velocity = (In.Position.xy / In.Position.w) - (In.PrevPosition.xy / In.PrevPosition.w); 16 float2 velocityNormalized = clamp(velocity * 0.5f + 0.5f, 0.0f, 1.0f); 17 Out.Out2 = velocityNormalized; 18}
CPP
1//オブジェクトの描画です 2//例としてPlayerを記載します 3void Player::Draw(){ 4 //入力レイアウト設定 5 Renderer::GetDeviceContext()->IASetInputLayout(_vertexlayout); 6 7 //シェーダ設定 8 Renderer::GetDeviceContext()->VSSetShader(_vertexshader, NULL, 0); 9 Renderer::GetDeviceContext()->PSSetShader(_pixelshader, NULL, 0); 10 11 //ワールドマトリクス設定 12 XMMATRIX world, scale, rot, trans; 13 scale = XMMatrixScaling(GetScale().x, GetScale().y, GetScale().z); 14 //クォータニオンで回転 15 rot = XMMatrixRotationQuaternion(XMLoadFloat4(&GetQuaternion())); 16 trans = XMMatrixTranslation(GetPosition().x, GetPosition().y, GetPosition().z); 17 world = scale * rot * trans; 18 Renderer::SetWorldMatrix(world, _prevworld); 19 20 for (auto c : _components) { 21 c->Draw(); 22 } 23} 24 25void Camera::Draw(){ 26 //ビューマトリクス設定 27 XMFLOAT3 up{ 0.0f, 1.0f, 0.0f }; 28 XMMATRIX viewmatrix = XMMatrixLookAtLH(XMLoadFloat3(&GetPosition()), XMLoadFloat3(&_target), XMLoadFloat3(&up)); 29 30 Renderer::SetViewMatrix(viewmatrix); 31 32 XMStoreFloat4x4(&_viewmatrix, viewmatrix); 33 34 //プロジェクションマトリクス設定 35 XMMATRIX projectionMatrix; 36 projectionMatrix = XMMatrixPerspectiveFovLH(1.0f, (float)SCREEN_WIDTH / SCREEN_HEIGHT, 1.0f, 1000.0f); 37 38 Renderer::SetProjectionMatrix(projectionMatrix); 39 40 Renderer::SetCameraPosition(GetPosition()); 41}
CPP
1void Renderer::SetWorldMatrix(XMMATRIX WorldMatrix, XMMATRIX& PrevWorld) { 2 XMFLOAT4X4 worldf; 3 4 XMStoreFloat4x4(&worldf, XMMatrixTranspose(PrevWorld)); 5 _devicecontext->UpdateSubresource(_prevworldbuffer, 0, NULL, &worldf, 0, 0); 6 7 XMStoreFloat4x4(&worldf, XMMatrixTranspose(WorldMatrix)); 8 _devicecontext->UpdateSubresource(_worldbuffer, 0, NULL, &worldf, 0, 0); 9 10 //前フレーム保存 11 PrevWorld = WorldMatrix; 12} 13 14void Renderer::SetViewMatrix(XMMATRIX ViewMatrix) { 15 XMFLOAT4X4 viewf; 16 17 XMStoreFloat4x4(&viewf, XMMatrixTranspose(_prevview)); 18 _devicecontext->UpdateSubresource(_prevviewbuffer, 0, NULL, &viewf, 0, 0); 19 20 XMStoreFloat4x4(&viewf, XMMatrixTranspose(ViewMatrix)); 21 _devicecontext->UpdateSubresource(_viewbuffer, 0, NULL, &viewf, 0, 0); 22 23 //前フレーム保存 24 _prevview = ViewMatrix; 25} 26 27void Renderer::SetProjectionMatrix(XMMATRIX ProjectionMatrix) { 28 XMFLOAT4X4 projectionf; 29 30 XMStoreFloat4x4(&projectionf, XMMatrixTranspose(_prevprojection)); 31 _devicecontext->UpdateSubresource(_prevprojectionbuffer, 0, NULL, &projectionf, 0, 0); 32 33 XMStoreFloat4x4(&projectionf, XMMatrixTranspose(ProjectionMatrix)); 34 _devicecontext->UpdateSubresource(_projectionbuffer, 0, NULL, &projectionf, 0, 0); 35 36 //前フレーム保存 37 _prevprojection = ProjectionMatrix; 38}
HLSL
1cbuffer WorldBuffer : register(b0) { 2 matrix World; 3} 4cbuffer ViewBuffer : register(b1) { 5 matrix View; 6} 7cbuffer ProjectionBuffer : register(b2) { 8 matrix Projection; 9} 10cbuffer WorldBuffer : register(b9) { 11 matrix PrevWorld; 12} 13cbuffer ViewBuffer : register(b10) { 14 matrix PrevView; 15} 16cbuffer ProjectionBuffer : register(b11) { 17 matrix PrevProjection; 18} 19struct VS_IN { 20 float4 Position : POSITION0; //ポジションゼロ 21 float4 Normal : NORMAL0; //ノーマルゼロ 22 float4 Diffuse : COLOR0; //カラーゼロ 23 float2 TexCoord : TEXCOORD0; //テクスコードゼロ 24 float4 Tangent : TANGENT0; //タンジェントゼロ 25}; 26 27 28struct PS_IN { 29 float4 Position : SV_POSITION; //ピクセルの座標 30 float4 PrevPosition : TEXCOORD1; //ピクセルの座標 31 float4 WorldPosition : POSITION0; //ピクセルの空間での座標 32 float4 Normal : NORMAL0; //ピクセルの法線 33 float4 Diffuse : COLOR0; //ピクセルの色 34 float2 TexCoord : TEXCOORD0; //ピクセルのテクスチャ座標 35 float4 Tangent : TANGENT0; //タンジェント 36 float4 Binormal : BINORMAL0; //バイノーマル 37}; 38struct PS_OUT { 39 float4 Out0 : SV_Target0; //デフォルトのびょうが 40 float Out1 : SV_Target1; //深度マップ 41 float2 Out2 : SV_Target2; //速度マップ 42};
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
モーションブラー実装の記事を見ながら作りました。
ChatGPTを使いました。
補足
Sharder Model 5.0
DirectX11
C++20
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。