diff --git a/Res/Shader/volume.hlsl b/Res/Shader/volume.hlsl index 51c92d40..9c156d50 100644 --- a/Res/Shader/volume.hlsl +++ b/Res/Shader/volume.hlsl @@ -11,6 +11,7 @@ cbuffer CB0 : register(b1) float _StepSize; float3 _BBoxMax; uint _MaxSteps; + float _RotationY; }; StructuredBuffer buf : register(t1); @@ -113,7 +114,7 @@ float4 MainPS(PSInput input) : SV_TARGET float3 rayDir = normalize(input.worldPos - _CameraPos); float tmin = 0.01; - float tmax = 1000.0; + float tmax = 5000.0; NanoVolume volume; initVolume(volume); @@ -121,8 +122,19 @@ float4 MainPS(PSInput input) : SV_TARGET float3 color = float3(0, 0, 0); float transmittance = 1.0; + float cosR = cos(_RotationY); + float sinR = sin(_RotationY); + float3x3 invRotY = float3x3( + cosR, 0, sinR, + 0, 1, 0, + -sinR, 0, cosR + ); + + float3 localCameraPos = mul(invRotY, _CameraPos); + float3 localRayDir = mul(invRotY, rayDir); + float not_used; - bool hit = get_hdda_hit(volume.acc, tmin, _CameraPos, rayDir, tmax, not_used); + bool hit = get_hdda_hit(volume.acc, tmin, localCameraPos, localRayDir, tmax, not_used); if (!hit) { return float4(0, 0, 0, 0); } float skip = 0; @@ -130,9 +142,9 @@ float4 MainPS(PSInput input) : SV_TARGET for (uint i = 0; i < _MaxSteps; i++) { if (tmin >= tmax || transmittance < 0.01) break; - float3 worldPos = _CameraPos + rayDir * tmin; + float3 localPos = localCameraPos + localRayDir * tmin; - uint dim = get_dim_coord(volume.acc, worldPos); + uint dim = get_dim_coord(volume.acc, localPos); if (dim > 1) { float skip_step = 15.0; tmin += skip_step; @@ -140,7 +152,7 @@ float4 MainPS(PSInput input) : SV_TARGET continue; } - float density = get_value_coord(volume.acc, worldPos) * _DensityScale; + float density = get_value_coord(volume.acc, localPos) * _DensityScale; if (density < 0.001) { float skip_step = 5.0; diff --git a/main.cpp b/main.cpp index 31aab440..0ba02ae6 100644 --- a/main.cpp +++ b/main.cpp @@ -176,7 +176,7 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi DirectX::XMMATRIX projectionMatrix=DirectX::XMMatrixPerspectiveFovLH( (45.0f*3.141592f)/180.0f,1280.0f/720.0f,0.1f,1000.0f); DirectX::XMMATRIX viewMatrix = DirectX::XMMatrixLookAtLH( - DirectX::XMVectorSet(-10.0f, 73.0f, -800.0f, 1.0f), + DirectX::XMVectorSet(-10.0f, 73.0f, -1200.0f, 1.0f), DirectX::XMVectorSet(-10.0f, 73.0f, 0.0f, 1.0f), DirectX::XMVectorSet(0.0f, 1.0f, 0.0f, 1.0f)); DirectX::XMMATRIX modelMatrix = DirectX::XMMatrixTranslation(0.0f,0.0f,5.0f); @@ -294,17 +294,18 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi memcpy(volumeCBData, &invViewProjMat, sizeof(float) * 16); volumeCBData[16] = -10.0f; volumeCBData[17] = 73.0f; - volumeCBData[18] = -800.0f; - volumeCBData[19] = 0.05f; // DensityScale + volumeCBData[18] = -1200.0f; + volumeCBData[19] = 0.1f; // DensityScale volumeCBData[20] = (float)nanoVDBData.worldBBox[0]; volumeCBData[21] = (float)nanoVDBData.worldBBox[1]; volumeCBData[22] = (float)nanoVDBData.worldBBox[2]; - volumeCBData[23] = 0.5f; // StepSize + volumeCBData[23] = 2.0f; // StepSize volumeCBData[24] = (float)nanoVDBData.worldBBox[3]; volumeCBData[25] = (float)nanoVDBData.worldBBox[4]; volumeCBData[26] = (float)nanoVDBData.worldBBox[5]; - volumeCBData[27] = 500; - UpdateConstantBuffer(volumeCB, volumeCBData, sizeof(float) * 28); + volumeCBData[27] = 2000; + volumeCBData[28] = timeSinceAppStartInSecond * 0.3f; // RotationY + UpdateConstantBuffer(volumeCB, volumeCBData, sizeof(float) * 29); if (frameCount == 1) { printf("Volume BBox: [%.2f, %.2f, %.2f] - [%.2f, %.2f, %.2f]\n", volumeCBData[20], volumeCBData[21], volumeCBData[22],