diff --git a/WickedEngine/PixelShader.hlsl b/WickedEngine/PixelShader.hlsl new file mode 100644 index 000000000..bc7c28978 --- /dev/null +++ b/WickedEngine/PixelShader.hlsl @@ -0,0 +1,11 @@ +struct asd +{ + row_major float4x4 mat; +}; + +StructuredBuffer buf; + +float4 main(float4 vPos : SV_POSITION) : SV_TARGET +{ + return mul( buf[12].mat, vPos ); +} \ No newline at end of file diff --git a/WickedEngine/ShaderInterop.h b/WickedEngine/ShaderInterop.h index f7914e01a..88104631f 100644 --- a/WickedEngine/ShaderInterop.h +++ b/WickedEngine/ShaderInterop.h @@ -1,6 +1,6 @@ #ifndef _WICKEDENGINE_SHADERINTEROP_H_ #define _WICKEDENGINE_SHADERINTEROP_H_ -#define SCENE_VOXELIZATION_RESOLUTION 32 +#define SCENE_VOXELIZATION_RESOLUTION 64 #endif diff --git a/WickedEngine/VertexShader.hlsl b/WickedEngine/VertexShader.hlsl new file mode 100644 index 000000000..4c5c1fc24 --- /dev/null +++ b/WickedEngine/VertexShader.hlsl @@ -0,0 +1,15 @@ +struct VS_OUTPUT +{ + float4 Position : SV_Position; + float2 TexCoord : TEXCOORD0; +}; + +VS_OUTPUT main( in float4 vPosition : POSITION, in float2 vTC0 : TEXCOORD0 ) +{ + VS_OUTPUT Output; + + Output.Position = float4( vPosition.x, vPosition.y, 0.01f, 1.0f ); + Output.TexCoord = vTC0; + + return Output; +} \ No newline at end of file diff --git a/WickedEngine/objectGS_voxelizer.hlsl b/WickedEngine/objectGS_voxelizer.hlsl index e8245f88c..dc2317082 100644 --- a/WickedEngine/objectGS_voxelizer.hlsl +++ b/WickedEngine/objectGS_voxelizer.hlsl @@ -10,6 +10,7 @@ struct GSInput float4 pos : SV_POSITION; float3 nor : NORMAL; float2 tex : TEXCOORD; + uint RTIndex : TEXCOORD1; }; struct GSOutput @@ -17,29 +18,27 @@ struct GSOutput float4 pos : SV_POSITION; float3 nor : NORMAL; float2 tex : TEXCOORD; - uint RTIndex : SV_RenderTargetArrayIndex; + //float3 pos3D : POSITION3D; + uint RTIndex : SV_RenderTargetArrayIndex; }; -[maxvertexcount(3 * SCENE_VOXELIZATION_RESOLUTION)] +[maxvertexcount(3)] void main( triangle GSInput input[3], inout TriangleStream< GSOutput > output ) { - [unroll] - for (uint i = 0; i < SCENE_VOXELIZATION_RESOLUTION; i++) - { - GSOutput element; - element.RTIndex = i; + GSOutput element; + element.RTIndex = input[0].RTIndex; - [unroll] - for (uint j = 0; j < 3; ++j) - { - element.pos = mul(float4(input[j].pos.xyz, 1), xVoxelCam[i]); - element.nor = input[j].nor; - element.tex = input[j].tex; - output.Append(element); - } - output.RestartStrip(); + [unroll] + for (uint i = 0; i < 3; ++i) + { + element.pos = mul(float4(input[i].pos.xyz, 1), xVoxelCam[ element.RTIndex ]); + element.nor = input[i].nor; + element.tex = input[i].tex; + //element.pos3D = input[ i ].pos.xyz; + output.Append(element); } + output.RestartStrip(); } \ No newline at end of file diff --git a/WickedEngine/objectPS_voxelizer.hlsl b/WickedEngine/objectPS_voxelizer.hlsl index 52d588667..305b95832 100644 --- a/WickedEngine/objectPS_voxelizer.hlsl +++ b/WickedEngine/objectPS_voxelizer.hlsl @@ -6,7 +6,7 @@ struct VoxelOut float4 normal : SV_TARGET1; }; -VoxelOut main(float4 pos : SV_POSITION, float3 nor : NORMAL, float2 tex : TEXCOORD, uint RTIndex : SV_RenderTargetArrayIndex) +VoxelOut main(float4 pos : SV_POSITION, float3 nor : NORMAL, float2 tex : TEXCOORD/*, float3 pos3D : POSITION3D*/, uint RTIndex : SV_RenderTargetArrayIndex) { float4 color = DEGAMMA(xBaseColorMap.Sample(sampler_linear_clamp, tex)); diff --git a/WickedEngine/objectVS_voxelizer.hlsl b/WickedEngine/objectVS_voxelizer.hlsl index a1b470478..3c56087c8 100644 --- a/WickedEngine/objectVS_voxelizer.hlsl +++ b/WickedEngine/objectVS_voxelizer.hlsl @@ -5,9 +5,10 @@ struct VSOut float4 pos : SV_POSITION; float3 nor : NORMAL; float2 tex : TEXCOORD; + uint RTIndex : TEXCOORD1; }; -VSOut main(Input input) +VSOut main(Input input, uint instanceID : SV_INSTANCEID) { VSOut Out = (VSOut)0; @@ -16,6 +17,7 @@ VSOut main(Input input) Out.pos = mul(input.pos, WORLD); Out.nor = input.nor.xyz; Out.tex = input.tex.xy; + Out.RTIndex = instanceID % SCENE_VOXELIZATION_RESOLUTION; return Out; } \ No newline at end of file diff --git a/WickedEngine/wiEnums.h b/WickedEngine/wiEnums.h index 4f58641c2..b96b091f9 100644 --- a/WickedEngine/wiEnums.h +++ b/WickedEngine/wiEnums.h @@ -237,6 +237,7 @@ enum VLTYPES VLTYPE_LINE, VLTYPE_TRAIL, VLTYPE_STREAMOUT, + VLTYPE_VOXELIZER, VLTYPE_LAST }; // rasterizer states diff --git a/WickedEngine/wiGraphicsDevice_DX11.cpp b/WickedEngine/wiGraphicsDevice_DX11.cpp index 44fd0f4c6..773ebbd4c 100644 --- a/WickedEngine/wiGraphicsDevice_DX11.cpp +++ b/WickedEngine/wiGraphicsDevice_DX11.cpp @@ -1394,7 +1394,7 @@ GraphicsDevice_DX11::GraphicsDevice_DX11(wiWindowRegistration::window_type windo } UINT createDeviceFlags = 0; - //createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; + createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; D3D_DRIVER_TYPE driverTypes[] = { diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index 1c0252644..2788b3a83 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -619,6 +619,29 @@ void wiRenderer::LoadShaders() } } + { + // Sync with the upper declaration, NOTE: InstanceDataSteprate is SCENE_VOXELIZATION_RESOLUTION! + VertexLayoutDesc layout[] = + { + { "POSITION", 0, FORMAT_R32G32B32A32_FLOAT, 0, APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "NORMAL", 0, FORMAT_R32G32B32A32_FLOAT, 0, APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, FORMAT_R32G32B32A32_FLOAT, 0, APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 1, FORMAT_R32G32B32A32_FLOAT, 0, APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + + { "MATI", 0, FORMAT_R32G32B32A32_FLOAT, 1, APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, SCENE_VOXELIZATION_RESOLUTION }, + { "MATI", 1, FORMAT_R32G32B32A32_FLOAT, 1, APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, SCENE_VOXELIZATION_RESOLUTION }, + { "MATI", 2, FORMAT_R32G32B32A32_FLOAT, 1, APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, SCENE_VOXELIZATION_RESOLUTION }, + { "COLOR_DITHER", 0, FORMAT_R32G32B32A32_FLOAT, 1, APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, SCENE_VOXELIZATION_RESOLUTION }, + }; + UINT numElements = ARRAYSIZE( layout ); + VertexShaderInfo* vsinfo = static_cast< VertexShaderInfo* >( wiResourceManager::GetShaderManager()->add( SHADERPATH + "objectVS_voxelizer.cso", wiResourceManager::VERTEXSHADER, layout, numElements ) ); + if( vsinfo != nullptr ) + { + vertexShaders[ VSTYPE_VOXELIZER ] = vsinfo->vertexShader; + vertexLayouts[ VLTYPE_VOXELIZER ] = vsinfo->vertexLayout; + } + } + { VertexLayoutDesc oslayout[] = @@ -704,7 +727,6 @@ void wiRenderer::LoadShaders() vertexShaders[VSTYPE_SHADOW] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "shadowVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; vertexShaders[VSTYPE_SHADOWCUBEMAPRENDER] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "cubeShadowVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; vertexShaders[VSTYPE_WATER] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "waterVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; - vertexShaders[VSTYPE_VOXELIZER] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectVS_voxelizer.cso", wiResourceManager::VERTEXSHADER))->vertexShader; vertexShaders[VSTYPE_VOXEL] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "voxelVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; @@ -3348,37 +3370,44 @@ void wiRenderer::RenderMeshes(const XMFLOAT3& eye, const CulledCollection& culle GetDevice()->BindPrimitiveTopology(PATCHLIST, threadID); else GetDevice()->BindPrimitiveTopology(TRIANGLELIST, threadID); - GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_EFFECT], threadID); + + int instanceDataStepRate = 1; // The number of instances to draw using the same per-instance data before advancing in the instance buffer by one element if (shaderType == SHADERTYPE_VOXELIZE) { GetDevice()->BindVS(vertexShaders[VSTYPE_VOXELIZER], threadID); - GetDevice()->BindGS(geometryShaders[GSTYPE_VOXELIZER], threadID); - } - else if (shaderType == SHADERTYPE_SHADOW) - { - GetDevice()->BindVS(vertexShaders[VSTYPE_SHADOW], threadID); - } - else if (shaderType == SHADERTYPE_SHADOWCUBE) - { - GetDevice()->BindVS(vertexShaders[VSTYPE_SHADOWCUBEMAPRENDER], threadID); - GetDevice()->BindGS(geometryShaders[GSTYPE_SHADOWCUBEMAPRENDER], threadID); - } - else if (shaderType == SHADERTYPE_ENVMAPCAPTURE) - { - GetDevice()->BindVS(vertexShaders[VSTYPE_ENVMAP], threadID); - GetDevice()->BindGS(geometryShaders[GSTYPE_ENVMAP], threadID); + GetDevice()->BindGS( geometryShaders[ GSTYPE_VOXELIZER ], threadID ); + GetDevice()->BindVertexLayout( vertexLayouts[ VLTYPE_VOXELIZER ], threadID ); + instanceDataStepRate = SCENE_VOXELIZATION_RESOLUTION; } else { - if (tessellation && tessF) + if( shaderType == SHADERTYPE_SHADOW ) { - GetDevice()->BindVS(vertexShaders[VSTYPE_OBJECT], threadID); + GetDevice()->BindVS( vertexShaders[ VSTYPE_SHADOW ], threadID ); + } + else if( shaderType == SHADERTYPE_SHADOWCUBE ) + { + GetDevice()->BindVS( vertexShaders[ VSTYPE_SHADOWCUBEMAPRENDER ], threadID ); + GetDevice()->BindGS( geometryShaders[ GSTYPE_SHADOWCUBEMAPRENDER ], threadID ); + } + else if( shaderType == SHADERTYPE_ENVMAPCAPTURE ) + { + GetDevice()->BindVS( vertexShaders[ VSTYPE_ENVMAP ], threadID ); + GetDevice()->BindGS( geometryShaders[ GSTYPE_ENVMAP ], threadID ); } else { - GetDevice()->BindVS(vertexShaders[VSTYPE_OBJECT10], threadID); + if( tessellation && tessF ) + { + GetDevice()->BindVS( vertexShaders[ VSTYPE_OBJECT ], threadID ); + } + else + { + GetDevice()->BindVS( vertexShaders[ VSTYPE_OBJECT10 ], threadID ); + } } + GetDevice()->BindVertexLayout( vertexLayouts[ VLTYPE_EFFECT ], threadID ); } if (tessellation && tessF) @@ -3631,7 +3660,7 @@ void wiRenderer::RenderMeshes(const XMFLOAT3& eye, const CulledCollection& culle SetAlphaRef(material->alphaRef, threadID); - GetDevice()->DrawIndexedInstanced((int)subset.subsetIndices.size(), k, threadID); + GetDevice()->DrawIndexedInstanced((int)subset.subsetIndices.size(), k * instanceDataStepRate, threadID); } } @@ -4013,7 +4042,7 @@ void wiRenderer::VoxelizeScene(GRAPHICSTHREAD threadID) voxelizerCams[i] = XMMatrixTranspose(view*projection); } GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_VOXELIZER], voxelizerCams, threadID, sizeof(voxelizerCams)); - GetDevice()->BindConstantBufferGS(constantBuffers[CBTYPE_VOXELIZER], 0, threadID); + GetDevice()->BindConstantBufferGS( constantBuffers[ CBTYPE_VOXELIZER ], 0, threadID ); Texture* RTs[] = { textures[TEXTYPE_3D_VOXELSCENE_EMITTANCE], textures[TEXTYPE_3D_VOXELSCENE_NORMAL] }; GetDevice()->BindRenderTargets(2, RTs, nullptr, threadID);