tessellation fix when using provoking index buffer
This commit is contained in:
@@ -80,6 +80,7 @@ PUSHCONSTANT(push, ObjectPushConstants);
|
||||
//#define OBJECTSHADER_USE_INSTANCEINDEX - shader will use instance ID
|
||||
//#define OBJECTSHADER_USE_CAMERAINDEX - shader will use camera ID
|
||||
//#define OBJECTSHADER_USE_COMMON - shader will use atlas, ambient occlusion, wetmap
|
||||
//#define OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER - shader will load vertex ID through provoking index buffer reordering
|
||||
|
||||
|
||||
#ifdef OBJECTSHADER_LAYOUT_SHADOW
|
||||
@@ -121,25 +122,23 @@ struct VertexInput
|
||||
{
|
||||
uint vertexID : SV_VertexID;
|
||||
uint instanceID : SV_InstanceID;
|
||||
|
||||
|
||||
#ifdef OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER
|
||||
uint GetPrimitiveID()
|
||||
{
|
||||
#if defined(PREPASS) && !defined(OBJECTSHADER_COMPILE_MS)
|
||||
// For prepass the meshopt_generateProvokingIndexBuffer is used to emulate SV_PrimitiveID via provoking vertex
|
||||
return vertexID;
|
||||
#else
|
||||
return 0;
|
||||
#endif // defined(PREPASS) && !defined(OBJECTSHADER_COMPILE_MS)
|
||||
}
|
||||
#endif // OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER
|
||||
|
||||
uint GetVertexID()
|
||||
{
|
||||
#if defined(PREPASS) && !defined(OBJECTSHADER_COMPILE_MS)
|
||||
#ifdef OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER
|
||||
// For prepass the meshopt_generateProvokingIndexBuffer is used to emulate SV_PrimitiveID via provoking vertex
|
||||
return bindless_buffers_uint[descriptor_index(GetMesh().ib_reorder)][vertexID];
|
||||
#else
|
||||
return vertexID;
|
||||
#endif // defined(PREPASS) && !defined(OBJECTSHADER_COMPILE_MS)
|
||||
#endif // OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER
|
||||
}
|
||||
|
||||
float4 GetPositionWind()
|
||||
@@ -410,9 +409,9 @@ PixelInput vertex_to_pixel_export(VertexInput input)
|
||||
ShaderCamera camera = GetCamera();
|
||||
#endif // OBJECTSHADER_USE_CAMERAINDEX
|
||||
|
||||
#if defined(PREPASS) && !defined(OBJECTSHADER_COMPILE_MS)
|
||||
#if defined(PREPASS) && defined(OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER)
|
||||
Out.primitiveID = input.GetPrimitiveID();
|
||||
#endif // defined(PREPASS) && !defined(OBJECTSHADER_COMPILE_MS)
|
||||
#endif // defined(PREPASS) && defined(OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER)
|
||||
|
||||
#ifndef OBJECTSHADER_USE_NOCAMERA
|
||||
Out.pos = mul(camera.view_projection, Out.pos);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#define OBJECTSHADER_COMPILE_VS
|
||||
#define OBJECTSHADER_LAYOUT_COMMON
|
||||
#define OBJECTSHADER_USE_NOCAMERA
|
||||
#define OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER
|
||||
#include "objectHF.hlsli"
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#define OBJECTSHADER_COMPILE_VS
|
||||
#define OBJECTSHADER_LAYOUT_PREPASS
|
||||
#define OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER
|
||||
#include "objectHF.hlsli"
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#define OBJECTSHADER_COMPILE_VS
|
||||
#define OBJECTSHADER_LAYOUT_PREPASS_TEX
|
||||
#define OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER
|
||||
#include "objectHF.hlsli"
|
||||
|
||||
@@ -2,5 +2,6 @@
|
||||
#define OBJECTSHADER_LAYOUT_PREPASS_TEX
|
||||
#define OBJECTSHADER_USE_NOCAMERA
|
||||
#define OBJECTSHADER_USE_NORMAL
|
||||
#define OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER
|
||||
#include "objectHF.hlsli"
|
||||
|
||||
|
||||
@@ -2,4 +2,5 @@
|
||||
#define OBJECTSHADER_LAYOUT_PREPASS_TEX
|
||||
#define OBJECTSHADER_USE_NOCAMERA
|
||||
#define OBJECTSHADER_USE_NORMAL
|
||||
#define OBJECTSHADER_USE_PROVOKING_INDEX_BUFFER
|
||||
#include "objectHF.hlsli"
|
||||
|
||||
@@ -3169,7 +3169,12 @@ void RenderMeshes(
|
||||
const float tessF = mesh.GetTessellationFactor();
|
||||
const bool tessellatorRequested = tessF > 0 && tessellation;
|
||||
const bool meshShaderRequested = !tessellatorRequested && mesh_shader && mesh.vb_clu.IsValid();
|
||||
const bool provokingIBRequired = renderPass == RENDERPASS_PREPASS || renderPass == RENDERPASS_PREPASS_DEPTHONLY; // Note: depthonly doesn't need primitiveID, but for now I don't created specialized shader for it without primitiveID (TODO measure perf, additional shaders overhead)
|
||||
|
||||
// Notes on provoking index buffer:
|
||||
// Normally it's used for primitiveID generation, so it would be only used in PREPASS
|
||||
// PREPASS_DEPTHONLY doesn't use separate shader variants, so it will also use provoking index buffer
|
||||
// tessellation requires it to match same primitive order between prepass and color pass to have exact same tessellation
|
||||
const bool provokingIBRequired = renderPass == RENDERPASS_PREPASS || renderPass == RENDERPASS_PREPASS_DEPTHONLY || tessellatorRequested;
|
||||
|
||||
if (forwardLightmaskRequest)
|
||||
{
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace wi::version
|
||||
// minor features, major updates, breaking compatibility changes
|
||||
const int minor = 71;
|
||||
// minor bug fixes, alterations, refactors, updates
|
||||
const int revision = 835;
|
||||
const int revision = 836;
|
||||
|
||||
const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user