optimized voxelizer

This commit is contained in:
turanszkij
2017-02-28 13:34:57 +01:00
parent a49eecbd9d
commit 496b8d8f1c
9 changed files with 99 additions and 42 deletions
+11
View File
@@ -0,0 +1,11 @@
struct asd
{
row_major float4x4 mat;
};
StructuredBuffer<asd> buf;
float4 main(float4 vPos : SV_POSITION) : SV_TARGET
{
return mul( buf[12].mat, vPos );
}
+1 -1
View File
@@ -1,6 +1,6 @@
#ifndef _WICKEDENGINE_SHADERINTEROP_H_
#define _WICKEDENGINE_SHADERINTEROP_H_
#define SCENE_VOXELIZATION_RESOLUTION 32
#define SCENE_VOXELIZATION_RESOLUTION 64
#endif
+15
View File
@@ -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;
}
+15 -16
View File
@@ -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();
}
+1 -1
View File
@@ -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));
+3 -1
View File
@@ -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;
}
+1
View File
@@ -237,6 +237,7 @@ enum VLTYPES
VLTYPE_LINE,
VLTYPE_TRAIL,
VLTYPE_STREAMOUT,
VLTYPE_VOXELIZER,
VLTYPE_LAST
};
// rasterizer states
+1 -1
View File
@@ -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[] =
{
+51 -22
View File
@@ -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<VertexShaderInfo*>(wiResourceManager::GetShaderManager()->add(SHADERPATH + "shadowVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader;
vertexShaders[VSTYPE_SHADOWCUBEMAPRENDER] = static_cast<VertexShaderInfo*>(wiResourceManager::GetShaderManager()->add(SHADERPATH + "cubeShadowVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader;
vertexShaders[VSTYPE_WATER] = static_cast<VertexShaderInfo*>(wiResourceManager::GetShaderManager()->add(SHADERPATH + "waterVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader;
vertexShaders[VSTYPE_VOXELIZER] = static_cast<VertexShaderInfo*>(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectVS_voxelizer.cso", wiResourceManager::VERTEXSHADER))->vertexShader;
vertexShaders[VSTYPE_VOXEL] = static_cast<VertexShaderInfo*>(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);