Skip to content

Commit 0dd567b

Browse files
PBR Renderer and Hydrogent: added option to pack vertex normals into 32-bit uint
1 parent 40dba30 commit 0dd567b

File tree

10 files changed

+149
-24
lines changed

10 files changed

+149
-24
lines changed

Hydrogent/include/HnMeshUtils.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,10 @@ class HnMeshUtils final
162162
///
163163
pxr::VtValue ConvertVertexPrimvarToFaceVarying(const pxr::VtValue& VertexData, size_t ValuesPerVertex = 1) const;
164164

165+
166+
/// Pack vertex normals into 32-bit unsigned integers.
167+
pxr::VtValue PackVertexNormals(const pxr::VtValue& Normals) const;
168+
165169
private:
166170
template <typename HandleFaceType>
167171
void ProcessFaces(HandleFaceType&& HandleFace) const;

Hydrogent/interface/HnMesh.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,8 @@ class HnMesh final : public pxr::HdMesh
197197
pxr::HdDirtyBits& DirtyBits,
198198
const pxr::TfToken& ReprToken);
199199

200-
bool AddStagingBufferSourceForPrimvar(StagingVertexData& StagingVerts,
200+
bool AddStagingBufferSourceForPrimvar(HnRenderDelegate* RenderDelegate,
201+
StagingVertexData& StagingVerts,
201202
const pxr::TfToken& Name,
202203
pxr::VtValue Primvar,
203204
pxr::HdInterpolation Interpolation,
@@ -214,7 +215,7 @@ class HnMesh final : public pxr::HdMesh
214215
const pxr::HdExtComputationPrimvarDescriptor& SkinningCompPrimDesc,
215216
StagingVertexData& StagingVerts);
216217

217-
void GenerateSmoothNormals(StagingVertexData& StagingVerts);
218+
void GenerateSmoothNormals(HnRenderDelegate& RenderDelegate, StagingVertexData& StagingVerts);
218219

219220
struct GeometrySubsetRange
220221
{

Hydrogent/interface/HnRenderDelegate.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,9 @@ class HnRenderDelegate final : public pxr::HdRenderDelegate
181181
/// has no effect and texture loading will be synchronous.
182182
bool AsyncTextureLoading = false;
183183

184+
/// Whether to pack vertex normals into a 32-bit uint.
185+
bool PackVertexNormals = false;
186+
184187
/// When shadows are enabled, the size of the PCF kernel.
185188
/// Allowed values are 2, 3, 5, 7.
186189
Uint32 PCFKernelSize = 3;

Hydrogent/src/HnGeometryPool.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,13 +187,22 @@ class HnGeometryPool::VertexData final : public GeometryPoolData
187187
const pxr::HdTupleType ElementType = Source->GetTupleType();
188188
const size_t ElementSize = HdDataSizeOfType(ElementType.type) * ElementType.count;
189189
if (SourceName == pxr::HdTokens->points)
190+
{
190191
VERIFY(ElementType.type == pxr::HdTypeFloatVec3 && ElementType.count == 1, "Unexpected vertex element type");
192+
}
191193
else if (SourceName == pxr::HdTokens->normals)
192-
VERIFY(ElementType.type == pxr::HdTypeFloatVec3 && ElementType.count == 1, "Unexpected normal element type");
194+
{
195+
VERIFY((ElementType.type == pxr::HdTypeFloatVec3 || ElementType.type == pxr::HdTypeInt32) && ElementType.count == 1,
196+
"Unexpected normal element type");
197+
}
193198
else if (SourceName == pxr::HdTokens->displayColor)
199+
{
194200
VERIFY(ElementType.type == pxr::HdTypeFloatVec3 && ElementType.count == 1, "Unexpected vertex color element type");
201+
}
195202
else if (SourceName == HnTokens->joints)
203+
{
196204
VERIFY(ElementType.type == pxr::HdTypeFloatVec4 && ElementType.count == 2, "Unexpected joints element type");
205+
}
197206

198207
AddStream(SourceName, ElementSize, Source, nullptr);
199208
}

Hydrogent/src/HnMesh.cpp

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ void HnMesh::UpdateRepr(pxr::HdSceneDelegate& SceneDelegate,
386386
GetVertexBuffer(pxr::HdTokens->normals) == nullptr &&
387387
!StagingVerts.Points.IsEmpty())
388388
{
389-
GenerateSmoothNormals(StagingVerts);
389+
GenerateSmoothNormals(*RenderDelegate, StagingVerts);
390390
}
391391

392392
UpdateConstantPrimvars(SceneDelegate, RenderParam, DirtyBits, ReprToken);
@@ -528,7 +528,8 @@ void HnMesh::UpdateTopology(pxr::HdSceneDelegate& SceneDelegate,
528528
DirtyBits &= ~pxr::HdChangeTracker::DirtyTopology;
529529
}
530530

531-
bool HnMesh::AddStagingBufferSourceForPrimvar(StagingVertexData& StagingVerts,
531+
bool HnMesh::AddStagingBufferSourceForPrimvar(HnRenderDelegate* RenderDelegate,
532+
StagingVertexData& StagingVerts,
532533
const pxr::TfToken& Name,
533534
pxr::VtValue Primvar,
534535
pxr::HdInterpolation Interpolation,
@@ -537,6 +538,16 @@ bool HnMesh::AddStagingBufferSourceForPrimvar(StagingVertexData& StagingVerts,
537538
if (Primvar.IsEmpty())
538539
return false;
539540

541+
if (Name == pxr::HdTokens->normals)
542+
{
543+
VERIFY_EXPR(RenderDelegate != nullptr);
544+
if (RenderDelegate != nullptr && RenderDelegate->GetUSDRenderer()->GetSettings().PackVertexNormals)
545+
{
546+
HnMeshUtils MeshUtils{m_Topology, GetId()};
547+
Primvar = MeshUtils.PackVertexNormals(Primvar);
548+
}
549+
}
550+
540551
pxr::VtValue FaceVaryingPrimvar;
541552
pxr::VtValue* pSrcPrimvar = &Primvar;
542553
if ((Interpolation == pxr::HdInterpolationVertex || Interpolation == pxr::HdInterpolationVarying) && m_HasFaceVaryingPrimvars)
@@ -677,7 +688,7 @@ bool HnMesh::AddJointInfluencesStagingBufferSource(const pxr::VtValue& NumInflue
677688
}
678689
}
679690

680-
return AddStagingBufferSourceForPrimvar(StagingVerts, HnTokens->joints, pxr::VtValue::Take(Joints), pxr::HdInterpolationVertex, 2);
691+
return AddStagingBufferSourceForPrimvar(nullptr, StagingVerts, HnTokens->joints, pxr::VtValue::Take(Joints), pxr::HdInterpolationVertex, 2);
681692
}
682693

683694
void HnMesh::PrimvarsInfo::AddDirtyPrimvar(pxr::HdDirtyBits& DirtyBits,
@@ -781,9 +792,10 @@ void HnMesh::UpdateSkinningPrimvars(pxr::HdSceneDelegate&
781792
const pxr::HdExtComputationPrimvarDescriptor& SkinningCompPrimDesc,
782793
StagingVertexData& StagingVerts)
783794
{
784-
const pxr::HdRenderIndex& RenderIndex = SceneDelegate.GetRenderIndex();
785-
const pxr::SdfPath& SkinnigCompId = SkinningCompPrimDesc.sourceComputationId;
786-
const HnExtComputation* SkinningComp = static_cast<const HnExtComputation*>(RenderIndex.GetSprim(pxr::HdPrimTypeTokens->extComputation, SkinnigCompId));
795+
const pxr::HdRenderIndex& RenderIndex = SceneDelegate.GetRenderIndex();
796+
HnRenderDelegate* RenderDelegate = static_cast<HnRenderDelegate*>(RenderIndex.GetRenderDelegate());
797+
const pxr::SdfPath& SkinnigCompId = SkinningCompPrimDesc.sourceComputationId;
798+
const HnExtComputation* SkinningComp = static_cast<const HnExtComputation*>(RenderIndex.GetSprim(pxr::HdPrimTypeTokens->extComputation, SkinnigCompId));
787799
if (SkinningComp == nullptr)
788800
{
789801
LOG_ERROR_MESSAGE("Unable to find skinning computation ", SkinnigCompId);
@@ -807,7 +819,7 @@ void HnMesh::UpdateSkinningPrimvars(pxr::HdSceneDelegate&
807819
SkinningPrimvarsVersion += InputAggregatorComp->GetSceneInputsVersion();
808820
}
809821

810-
entt::registry& Registry = static_cast<HnRenderDelegate*>(SceneDelegate.GetRenderIndex().GetRenderDelegate())->GetEcsRegistry();
822+
entt::registry& Registry = RenderDelegate->GetEcsRegistry();
811823
Components::Skinning& SkinningData = Registry.get<Components::Skinning>(m_Entity);
812824

813825
if (SkinningPrimvarsVersion != m_SkinningPrimvarsVersion)
@@ -857,7 +869,7 @@ void HnMesh::UpdateSkinningPrimvars(pxr::HdSceneDelegate&
857869

858870
StagingVerts.Points = RestPointsVal;
859871

860-
AddStagingBufferSourceForPrimvar(StagingVerts, SkinningCompPrimDesc.name, std::move(RestPointsVal), SkinningCompPrimDesc.interpolation);
872+
AddStagingBufferSourceForPrimvar(RenderDelegate, StagingVerts, SkinningCompPrimDesc.name, std::move(RestPointsVal), SkinningCompPrimDesc.interpolation);
861873
AddJointInfluencesStagingBufferSource(NumInfluencesPerComponentVal, InfluencesVal, StagingVerts);
862874

863875
// Skeleton adapter hides normals, so try to get them directly from the scene delegate
@@ -867,9 +879,9 @@ void HnMesh::UpdateSkinningPrimvars(pxr::HdSceneDelegate&
867879
// There is no way to get the interpolation of the normals primvar from the scene delegate,
868880
// so rely on the number of elements.
869881
if (NormalsPrimvar.GetArraySize() == m_Topology.GetNumPoints())
870-
AddStagingBufferSourceForPrimvar(StagingVerts, pxr::HdTokens->normals, std::move(NormalsPrimvar), pxr::HdInterpolationVertex);
882+
AddStagingBufferSourceForPrimvar(RenderDelegate, StagingVerts, pxr::HdTokens->normals, std::move(NormalsPrimvar), pxr::HdInterpolationVertex);
871883
else if (NormalsPrimvar.GetArraySize() == m_Topology.GetNumFaceVaryings())
872-
AddStagingBufferSourceForPrimvar(StagingVerts, pxr::HdTokens->normals, std::move(NormalsPrimvar), pxr::HdInterpolationFaceVarying);
884+
AddStagingBufferSourceForPrimvar(RenderDelegate, StagingVerts, pxr::HdTokens->normals, std::move(NormalsPrimvar), pxr::HdInterpolationFaceVarying);
873885
}
874886

875887
m_SkinningPrimvarsVersion = SkinningPrimvarsVersion;
@@ -900,6 +912,8 @@ void HnMesh::UpdateVertexAndVaryingPrimvars(pxr::HdSceneDelegate& SceneDelegate,
900912
const PrimvarsInfo& VertexPrimvarsInfo,
901913
StagingVertexData& StagingVerts)
902914
{
915+
HnRenderDelegate* RenderDelegate = static_cast<HnRenderDelegate*>(SceneDelegate.GetRenderIndex().GetRenderDelegate());
916+
903917
for (const auto& it : VertexPrimvarsInfo.Dirty)
904918
{
905919
const pxr::TfToken& Name = it.first;
@@ -912,7 +926,7 @@ void HnMesh::UpdateVertexAndVaryingPrimvars(pxr::HdSceneDelegate& SceneDelegate,
912926
if (PrimDesc.name == pxr::HdTokens->points)
913927
StagingVerts.Points = PrimValue;
914928

915-
AddStagingBufferSourceForPrimvar(StagingVerts, Name, std::move(PrimValue), PrimDesc.interpolation);
929+
AddStagingBufferSourceForPrimvar(RenderDelegate, StagingVerts, Name, std::move(PrimValue), PrimDesc.interpolation);
916930
}
917931

918932
for (const pxr::HdExtComputationPrimvarDescriptor& ExtCompPrimDesc : VertexPrimvarsInfo.ExtComp)
@@ -932,13 +946,15 @@ void HnMesh::UpdateFaceVaryingPrimvars(pxr::HdSceneDelegate& SceneDelegate,
932946
const PrimvarsInfo& FacePrimvarsInfo,
933947
StagingVertexData& StagingVerts)
934948
{
949+
HnRenderDelegate* RenderDelegate = static_cast<HnRenderDelegate*>(SceneDelegate.GetRenderIndex().GetRenderDelegate());
950+
935951
for (const auto& it : FacePrimvarsInfo.Dirty)
936952
{
937953
const pxr::TfToken& Name = it.first;
938954
const pxr::HdPrimvarDescriptor& PrimDesc = it.second;
939955

940956
pxr::VtValue PrimValue = GetPrimvar(&SceneDelegate, PrimDesc.name);
941-
AddStagingBufferSourceForPrimvar(StagingVerts, Name, std::move(PrimValue), PrimDesc.interpolation);
957+
AddStagingBufferSourceForPrimvar(RenderDelegate, StagingVerts, Name, std::move(PrimValue), PrimDesc.interpolation);
942958
}
943959
}
944960

@@ -1000,7 +1016,7 @@ void HnMesh::UpdateConstantPrimvars(pxr::HdSceneDelegate& SceneDelegate,
10001016
}
10011017
}
10021018

1003-
void HnMesh::GenerateSmoothNormals(StagingVertexData& StagingVerts)
1019+
void HnMesh::GenerateSmoothNormals(HnRenderDelegate& RenderDelegate, StagingVertexData& StagingVerts)
10041020
{
10051021
pxr::Hd_VertexAdjacency Adjacency;
10061022
Adjacency.BuildAdjacencyTable(&m_Topology);
@@ -1025,7 +1041,7 @@ void HnMesh::GenerateSmoothNormals(StagingVertexData& StagingVerts)
10251041
return;
10261042
}
10271043

1028-
AddStagingBufferSourceForPrimvar(StagingVerts, pxr::HdTokens->normals, pxr::VtValue::Take(Normals), pxr::HdInterpolationVertex);
1044+
AddStagingBufferSourceForPrimvar(&RenderDelegate, StagingVerts, pxr::HdTokens->normals, pxr::VtValue::Take(Normals), pxr::HdInterpolationVertex);
10291045
}
10301046

10311047
void HnMesh::UpdateIndexData(StagingIndexData& StagingInds, const pxr::VtValue& Points)

Hydrogent/src/HnMeshUtils.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "DebugUtilities.hpp"
2929
#include "AdvancedMath.hpp"
3030
#include "GfTypeConversions.hpp"
31+
#include "PBR_Renderer.hpp"
3132

3233
#include "pxr/base/gf/vec2i.h"
3334
#include "pxr/base/gf/vec3i.h"
@@ -375,6 +376,26 @@ pxr::VtValue HnMeshUtils::ConvertVertexPrimvarToFaceVarying(const pxr::VtValue&
375376
}
376377
}
377378

379+
pxr::VtValue HnMeshUtils::PackVertexNormals(const pxr::VtValue& Normals) const
380+
{
381+
if (Normals.IsHolding<pxr::VtVec3fArray>())
382+
{
383+
const pxr::VtVec3fArray& NormalsArray = Normals.UncheckedGet<pxr::VtVec3fArray>();
384+
pxr::VtIntArray PackedNormals(NormalsArray.size());
385+
Uint32* pPackedNormals = reinterpret_cast<Uint32*>(PackedNormals.data());
386+
for (size_t i = 0; i < NormalsArray.size(); ++i)
387+
{
388+
pPackedNormals[i] = PBR_Renderer::PackVertexNormal(ToFloat3(NormalsArray[i]));
389+
}
390+
return pxr::VtValue::Take(PackedNormals);
391+
}
392+
else
393+
{
394+
LOG_ERROR_MESSAGE("Failed to pack vertex normals for mesh '", m_MeshId.GetString(), "': ", Normals.GetTypeName(), " is not supported");
395+
return {};
396+
}
397+
}
398+
378399
} // namespace USD
379400

380401
} // namespace Diligent

Hydrogent/src/HnRenderDelegate.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ static std::shared_ptr<USD_Renderer> CreateUSDRenderer(const HnRenderDelegate::C
174174
USDRendererCI.EnableClearCoat = true;
175175

176176
USDRendererCI.AllowHotShaderReload = RenderDelegateCI.AllowHotShaderReload;
177+
USDRendererCI.PackVertexNormals = RenderDelegateCI.PackVertexNormals;
177178

178179
const RenderDeviceInfo& DeviceInfo = RenderDelegateCI.pDevice->GetDeviceInfo();
179180
// There is a major performance degradation when using row-major matrices
@@ -252,11 +253,21 @@ static std::shared_ptr<USD_Renderer> CreateUSDRenderer(const HnRenderDelegate::C
252253
USDRendererCI.ShaderTexturesArrayMode = USD_Renderer::SHADER_TEXTURE_ARRAY_MODE_NONE;
253254
}
254255

255-
static constexpr LayoutElement Inputs[] =
256+
// float3 Normal : ATTRIB1;
257+
// or
258+
// uint Normal : ATTRIB1;
259+
const LayoutElement NormalInput{
260+
USD_Renderer::VERTEX_ATTRIB_ID_NORMAL,
261+
HnRenderPass::VERTEX_BUFFER_SLOT_NORMALS,
262+
USDRendererCI.PackVertexNormals ? 1u : 3u,
263+
USDRendererCI.PackVertexNormals ? VT_UINT32 : VT_FLOAT32,
264+
false, // IsNormalized
265+
};
266+
const LayoutElement Inputs[] =
256267
{
257268
// clang-format off
258269
{USD_Renderer::VERTEX_ATTRIB_ID_POSITION, HnRenderPass::VERTEX_BUFFER_SLOT_POSITIONS, 3, VT_FLOAT32}, // float3 Pos : ATTRIB0;
259-
{USD_Renderer::VERTEX_ATTRIB_ID_NORMAL, HnRenderPass::VERTEX_BUFFER_SLOT_NORMALS, 3, VT_FLOAT32}, // float3 Normal : ATTRIB1;
270+
NormalInput,
260271
{USD_Renderer::VERTEX_ATTRIB_ID_TEXCOORD0, HnRenderPass::VERTEX_BUFFER_SLOT_TEX_COORDS0, 2, VT_FLOAT32}, // float2 UV0 : ATTRIB2;
261272
{USD_Renderer::VERTEX_ATTRIB_ID_TEXCOORD1, HnRenderPass::VERTEX_BUFFER_SLOT_TEX_COORDS1, 2, VT_FLOAT32}, // float2 UV1 : ATTRIB3;
262273
{USD_Renderer::VERTEX_ATTRIB_ID_COLOR, HnRenderPass::VERTEX_BUFFER_SLOT_VERTEX_COLORS, 3, VT_FLOAT32}, // float3 Color : ATTRIB6;

PBR/interface/PBR_Renderer.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,9 @@ class PBR_Renderer
202202
/// Whether to use skin pre-transform before applying joint transformations.
203203
bool UseSkinPreTransform = false;
204204

205+
/// Whether vertex normals are packed into a single 32-bit uint, see PackVertexNormal().
206+
bool PackVertexNormals = false;
207+
205208
/// PCF shadow kernel size.
206209
/// Allowed values are 2, 3, 5, 7.
207210
Uint32 PCFKernelSize = 3;
@@ -721,6 +724,11 @@ class PBR_Renderer
721724
Uint32 GetJointsBufferSize() const;
722725
const char* GetJointTransformsVarName() const;
723726

727+
/// Packs normal into a single 32-bit uint.
728+
///
729+
/// \remarks The function assumes that the input vector is normalized.
730+
static Uint32 PackVertexNormal(const float3& Normal);
731+
724732
protected:
725733
ShaderMacroHelper DefineMacros(const PSOKey& Key) const;
726734

PBR/src/PBR_Renderer.cpp

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1175,6 +1175,7 @@ ShaderMacroHelper PBR_Renderer::DefineMacros(const PSOKey& Key) const
11751175
Macros.Add("JOINTS_BUFFER_MODE", static_cast<int>(m_Settings.JointsBufferMode));
11761176

11771177
Macros.Add("USE_SKIN_PRE_TRANSFORM", m_Settings.UseSkinPreTransform);
1178+
Macros.Add("PACK_VERTEX_NORMALS", m_Settings.PackVertexNormals);
11781179
Macros.Add("TONE_MAPPING_MODE", "TONE_MAPPING_MODE_UNCHARTED2");
11791180

11801181
Macros.Add("PRIMITIVE_ARRAY_SIZE", static_cast<int>(m_Settings.PrimitiveArraySize));
@@ -1447,11 +1448,19 @@ void PBR_Renderer::GetVSInputStructAndLayout(PSO_FLAGS PSOFlags,
14471448
}
14481449
}
14491450

1451+
const VSAttribInfo VSNormalAttrib{
1452+
VERTEX_ATTRIB_ID_NORMAL,
1453+
"Normal",
1454+
m_Settings.PackVertexNormals ? VT_UINT32 : VT_FLOAT32,
1455+
m_Settings.PackVertexNormals ? 1u : 3u,
1456+
PSO_FLAG_USE_VERTEX_NORMALS,
1457+
};
1458+
14501459
const std::array<VSAttribInfo, 8> VSAttribs = //
14511460
{
14521461
// clang-format off
14531462
VSAttribInfo{VERTEX_ATTRIB_ID_POSITION, "Pos", VT_FLOAT32, 3, PSO_FLAG_NONE},
1454-
VSAttribInfo{VERTEX_ATTRIB_ID_NORMAL, "Normal", VT_FLOAT32, 3, PSO_FLAG_USE_VERTEX_NORMALS},
1463+
VSNormalAttrib,
14551464
VSAttribInfo{VERTEX_ATTRIB_ID_TEXCOORD0, "UV0", VT_FLOAT32, 2, PSO_FLAG_USE_TEXCOORD0},
14561465
VSAttribInfo{VERTEX_ATTRIB_ID_TEXCOORD1, "UV1", VT_FLOAT32, 2, PSO_FLAG_USE_TEXCOORD1},
14571466
VSAttribInfo{VERTEX_ATTRIB_ID_JOINTS, "Joint0", VT_FLOAT32, 4, PSO_FLAG_USE_JOINTS},
@@ -1486,8 +1495,26 @@ void PBR_Renderer::GetVSInputStructAndLayout(PSO_FLAGS PSOFlags,
14861495
DEV_CHECK_ERR(AttribFound, "Input layout does not contain attribute '", Attrib.Name, "' (index ", Attrib.Index, ")");
14871496
}
14881497
#endif
1489-
VERIFY_EXPR(Attrib.Type == VT_FLOAT32);
1490-
ss << " float" << Attrib.NumComponents << std::setw(9) << Attrib.Name << " : ATTRIB" << Attrib.Index << ";" << std::endl;
1498+
switch (Attrib.Type)
1499+
{
1500+
case VT_FLOAT32:
1501+
ss << " float";
1502+
break;
1503+
case VT_UINT32:
1504+
ss << " uint";
1505+
break;
1506+
default:
1507+
UNEXPECTED("Unexpected attribute type");
1508+
}
1509+
if (Attrib.NumComponents > 1)
1510+
{
1511+
ss << Attrib.NumComponents;
1512+
}
1513+
else
1514+
{
1515+
ss << ' ';
1516+
}
1517+
ss << std::setw(9) << Attrib.Name << " : ATTRIB" << Attrib.Index << ";" << std::endl;
14911518
}
14921519
else
14931520
{
@@ -1652,7 +1679,7 @@ void PBR_Renderer::CreatePSO(PsoHashMapType& PsoHashMap,
16521679
GraphicsDesc.PrimitiveTopology == PRIMITIVE_TOPOLOGY_POINT_LIST &&
16531680
m_Device.GetDeviceInfo().IsVulkanDevice() &&
16541681
m_Settings.PrimitiveArraySize == 0; // When PrimitiveArraySize > 0, we convert HLSL to GLSL
1655-
const auto VSOutputStruct = GetVSOutputStruct(PSOFlags, UseVkPointSize, m_Settings.PrimitiveArraySize > 0);
1682+
const std::string VSOutputStruct = GetVSOutputStruct(PSOFlags, UseVkPointSize, m_Settings.PrimitiveArraySize > 0);
16561683

16571684
CreateInfo::PSMainSourceInfo PSMainSource;
16581685
if (m_Settings.GetPSMainSource)
@@ -2089,4 +2116,12 @@ void* PBR_Renderer::WriteSkinningData(void* pDst, const WriteSkinningDataAttribs
20892116
return WriteSkinningData(pDst, Attribs, PackMatrixRowMajor, m_Settings.MaxJointCount, m_Settings.UseSkinPreTransform);
20902117
}
20912118

2119+
Uint32 PBR_Renderer::PackVertexNormal(const float3& Normal)
2120+
{
2121+
Uint32 x = static_cast<Uint32>(clamp((Normal.x + 1.f) * 32767.f, 0.f, 65535.f));
2122+
Uint32 y = static_cast<Uint32>(clamp((Normal.y + 1.f) * 16383.f, 0.f, 32767.f));
2123+
Uint32 z = Normal.z >= 0 ? 0 : 1;
2124+
return x | (y << 16) | (z << 31);
2125+
}
2126+
20922127
} // namespace Diligent

0 commit comments

Comments
 (0)