optimized voxelizer
This commit is contained in:
@@ -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,6 +1,6 @@
|
||||
#ifndef _WICKEDENGINE_SHADERINTEROP_H_
|
||||
#define _WICKEDENGINE_SHADERINTEROP_H_
|
||||
|
||||
#define SCENE_VOXELIZATION_RESOLUTION 32
|
||||
#define SCENE_VOXELIZATION_RESOLUTION 64
|
||||
|
||||
#endif
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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));
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -237,6 +237,7 @@ enum VLTYPES
|
||||
VLTYPE_LINE,
|
||||
VLTYPE_TRAIL,
|
||||
VLTYPE_STREAMOUT,
|
||||
VLTYPE_VOXELIZER,
|
||||
VLTYPE_LAST
|
||||
};
|
||||
// rasterizer states
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user