質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

HLSL

HLSLは、米マイクロソフト社によって開発された Direct3D APIで使われるプロプライエタリなシェーディング言語です。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

1回答

106閲覧

速度マップが想定した通りに作れない

ranaka

総合スコア10

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

HLSL

HLSLは、米マイクロソフト社によって開発された Direct3D APIで使われるプロプライエタリなシェーディング言語です。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2024/11/09 02:32

実現したいこと

モーションブラーの実装に使用する速度マップを作りたい。
速度マップが想定した通りに作れていないので、見直す部分や間違えているであろう箇所を教えてほしいです。

発生している問題・分からないこと

下の画像の左上に速度マップを表示させています。オブジェクトの動き関係なく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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

渡している前フレームのマトリックスがおかしいだけでした。
前フレームのマトリックスの保存の仕方を修正したら動いていない時は黒くなりました。

投稿2024/11/13 12:17

ranaka

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問