Skip to content

Commit f96dfcc

Browse files
author
kevyuu
committed
Use nbl::hlsl::_static_cast for converting MaterialPacked to Material and vice versa
1 parent 38d8285 commit f96dfcc

File tree

5 files changed

+47
-27
lines changed

5 files changed

+47
-27
lines changed

71_RayTracingPipeline/app_resources/common.hlsl

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define RQG_COMMON_HLSL
33

44
#include "nbl/builtin/hlsl/cpp_compat.hlsl"
5+
#include "nbl/builtin/hlsl/cpp_compat/basic.h"
56

67
NBL_CONSTEXPR uint32_t WorkgroupSize = 16;
78
NBL_CONSTEXPR uint32_t MAX_UNORM_10 = 1023;
@@ -67,28 +68,6 @@ struct MaterialPacked
6768
}
6869
};
6970

70-
inline MaterialPacked packMaterial(Material material)
71-
{
72-
MaterialPacked packed;
73-
packed.ambient = packUnorm3x10(material.ambient);
74-
packed.diffuse = packUnorm3x10(material.diffuse);
75-
packed.specular = packUnorm3x10(material.specular);
76-
packed.shininess = packUnorm22(material.shininess);
77-
packed.alpha = packUnorm10(material.alpha);
78-
return packed;
79-
}
80-
81-
inline Material unpackMaterial(MaterialPacked packed)
82-
{
83-
Material material;
84-
material.ambient = unpackUnorm3x10(packed.ambient);
85-
material.diffuse = unpackUnorm3x10(packed.diffuse);
86-
material.specular = unpackUnorm3x10(packed.specular);
87-
material.shininess = unpackUnorm22(packed.shininess);
88-
material.alpha = unpackUnorm10(packed.alpha);
89-
return material;
90-
}
91-
9271
struct SProceduralGeomInfo
9372
{
9473
MaterialPacked material;
@@ -236,4 +215,45 @@ float32_t3 computeSpecular(Material mat, float32_t3 view_dir,
236215
}
237216
#endif
238217

218+
namespace nbl
219+
{
220+
namespace hlsl
221+
{
222+
namespace impl
223+
{
224+
225+
template<>
226+
struct static_cast_helper<Material, MaterialPacked>
227+
{
228+
static inline Material cast(MaterialPacked packed)
229+
{
230+
Material material;
231+
material.ambient = unpackUnorm3x10(packed.ambient);
232+
material.diffuse = unpackUnorm3x10(packed.diffuse);
233+
material.specular = unpackUnorm3x10(packed.specular);
234+
material.shininess = unpackUnorm22(packed.shininess);
235+
material.alpha = unpackUnorm10(packed.alpha);
236+
return material;
237+
}
238+
};
239+
240+
template<>
241+
struct static_cast_helper<MaterialPacked, Material>
242+
{
243+
static inline MaterialPacked cast(Material material)
244+
{
245+
MaterialPacked packed;
246+
packed.ambient = packUnorm3x10(material.ambient);
247+
packed.diffuse = packUnorm3x10(material.diffuse);
248+
packed.specular = packUnorm3x10(material.specular);
249+
packed.shininess = packUnorm22(material.shininess);
250+
packed.alpha = packUnorm10(material.alpha);
251+
return packed;
252+
}
253+
};
254+
255+
}
256+
}
257+
}
258+
239259
#endif // RQG_COMMON_HLSL

71_RayTracingPipeline/app_resources/raytrace.rahit.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ void main(inout PrimaryPayload payload, in BuiltInTriangleIntersectionAttributes
77
{
88
const int instID = InstanceID();
99
const STriangleGeomInfo geom = vk::RawBufferLoad < STriangleGeomInfo > (pc.triangleGeomInfoBuffer + instID * sizeof(STriangleGeomInfo));
10-
const Material material = unpackMaterial(geom.material);
10+
const Material material = nbl::hlsl::_static_cast<Material>(geom.material);
1111

1212
if (material.alpha > payload.alphaThreshold)
1313
{

71_RayTracingPipeline/app_resources/raytrace.rgen.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ void main()
7272

7373
const float32_t3 worldPosition = pc.camPos + (camDirection * payload.rayDistance);
7474
const float32_t3 worldNormal = payload.worldNormal;
75-
const Material material = unpackMaterial(payload.material);
75+
const Material material = nbl::hlsl::_static_cast<Material>(payload.material);
7676
RayLight cLight;
7777
cLight.inHitPosition = worldPosition;
7878
CallShader(pc.light.type, cLight);

71_RayTracingPipeline/app_resources/raytrace_shadow.rahit.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ void main(inout OcclusionPayload payload, in BuiltInTriangleIntersectionAttribut
77
{
88
const int instID = InstanceID();
99
const STriangleGeomInfo geom = vk::RawBufferLoad < STriangleGeomInfo > (pc.triangleGeomInfoBuffer + instID * sizeof(STriangleGeomInfo));
10-
const Material material = unpackMaterial(geom.material);
10+
const Material material = nbl::hlsl::_static_cast<Material>(geom.material);
1111

1212
payload.attenuation = material.alpha * payload.attenuation;
1313
IgnoreHit();

71_RayTracingPipeline/main.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1253,7 +1253,7 @@ class RaytracingPipelineApp final : public examples::SimpleWindowedApplication,
12531253
.vertexStride = cpuObject.data.inputParams.bindings[0].stride,
12541254
.indexType = cpuObject.data.indexType,
12551255
.indexCount = cpuObject.data.indexCount,
1256-
.material = packMaterial(cpuObject.material),
1256+
.material = hlsl::_static_cast<MaterialPacked>(cpuObject.material),
12571257
.transform = cpuObject.transform,
12581258
});
12591259
}
@@ -1292,7 +1292,7 @@ class RaytracingPipelineApp final : public examples::SimpleWindowedApplication,
12921292
{
12931293
const auto middle_i = NumberOfProceduralGeometries / 2.0;
12941294
SProceduralGeomInfo sphere = {
1295-
.material = packMaterial({
1295+
.material = hlsl::_static_cast<MaterialPacked>(Material{
12961296
.ambient = {0.1, 0.05 * i, 0.1},
12971297
.diffuse = {0.3, 0.2 * i, 0.3},
12981298
.specular = {0.8, 0.8, 0.8},

0 commit comments

Comments
 (0)