Skip to content

Commit 6de5eae

Browse files
Samples: 003_RenderToCubeMapSinglePass is now bilingual (GLSL + Slang)
1 parent 001988c commit 6de5eae

File tree

2 files changed

+100
-7
lines changed

2 files changed

+100
-7
lines changed

samples/003_RenderToCubeMapSinglePass.cpp

Lines changed: 99 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,61 @@
99

1010
#include <lvk/vulkan/VulkanClasses.h>
1111

12+
// Bilingual: GLSL (default) and Slang. Define the macro LVK_DEMO_WITH_SLANG to switch to Slang.
13+
14+
const char* codeTriangleSlang = R"(
15+
struct PushConstants {
16+
float time;
17+
};
18+
19+
[[vk::push_constant]] PushConstants pc;
20+
21+
static const float2 pos[3] = {
22+
float2(-0.6, -0.6),
23+
float2( 0.6, -0.6),
24+
float2( 0.0, 0.6)
25+
};
26+
27+
struct FragmentOutput {
28+
float4 color0 : SV_Target0;
29+
float4 color1 : SV_Target1;
30+
float4 color2 : SV_Target2;
31+
float4 color3 : SV_Target3;
32+
float4 color4 : SV_Target4;
33+
float4 color5 : SV_Target5;
34+
};
35+
36+
[shader("vertex")]
37+
float4 vertexMain(uint vertexID : SV_VertexID) : SV_Position {
38+
return float4(pos[vertexID] * (1.5 + sin(pc.time)) * 0.5, 0.0, 1.0);
39+
}
40+
41+
[shader("fragment")]
42+
FragmentOutput fragmentMain() {
43+
return {
44+
float4(1.0, 0.0, 0.0, 1.0),
45+
float4(0.0, 1.0, 0.0, 1.0),
46+
float4(0.0, 0.0, 1.0, 1.0),
47+
float4(1.0, 0.0, 1.0, 1.0),
48+
float4(1.0, 1.0, 0.0, 1.0),
49+
float4(0.0, 1.0, 1.0, 1.0),
50+
};
51+
}
52+
)";
53+
1254
const char* codeTriangleVS = R"(
1355
#version 460
1456
const vec2 pos[3] = vec2[3](
15-
vec2(-0.6, -0.6),
16-
vec2( 0.6, -0.6),
17-
vec2( 0.0, 0.6)
57+
vec2(-0.6, -0.6),
58+
vec2( 0.6, -0.6),
59+
vec2( 0.0, 0.6)
1860
);
1961
layout(push_constant) uniform constants {
2062
float time;
2163
} pc;
2264
2365
void main() {
24-
gl_Position = vec4(pos[gl_VertexIndex] * (1.5 + sin(pc.time)) * 0.5, 0.0, 1.0);
66+
gl_Position = vec4(pos[gl_VertexIndex] * (1.5 + sin(pc.time)) * 0.5, 0.0, 1.0);
2567
}
2668
)";
2769

@@ -44,13 +86,55 @@ void main() {
4486
};
4587
)";
4688

89+
const char* codeSlang = R"(
90+
struct VertexStageOutput {
91+
float4 sv_Position : SV_Position;
92+
float3 dir : COLOR0;
93+
nointerpolation uint textureId : TEXTUREID;
94+
};
95+
96+
struct PushConstants {
97+
float4x4 mvp;
98+
uint texture0;
99+
};
100+
101+
[[vk::push_constant]] PushConstants pc;
102+
103+
static const float3 vertices[8] = {
104+
float3(-1.0, -1.0, 1.0), float3( 1.0, -1.0, 1.0),
105+
float3( 1.0, 1.0, 1.0), float3(-1.0, 1.0, 1.0),
106+
float3(-1.0, -1.0, -1.0), float3( 1.0, -1.0, -1.0),
107+
float3( 1.0, 1.0, -1.0), float3(-1.0, 1.0, -1.0)
108+
};
109+
110+
[shader("vertex")]
111+
VertexStageOutput vertexMain(uint vertexID : SV_VertexID) {
112+
VertexStageOutput out;
113+
float3 v = vertices[vertexID];
114+
out.sv_Position = mul(float4(v, 1.0), pc.mvp);
115+
out.dir = v;
116+
out.textureId = pc.texture0;
117+
return out;
118+
}
119+
120+
struct PSInput {
121+
float3 dir : COLOR0;
122+
nointerpolation uint textureId : TEXTUREID;
123+
};
124+
125+
[shader("fragment")]
126+
float4 fragmentMain(PSInput input) {
127+
return textureBindlessCube(input.textureId, 0, normalize(input.dir));
128+
}
129+
)";
130+
47131
const char* codeVS = R"(
48132
layout (location=0) out vec3 dir;
49133
layout (location=1) out flat uint textureId;
50134
51135
const vec3 vertices[8] = vec3[8](
52-
vec3(-1.0,-1.0, 1.0), vec3( 1.0,-1.0, 1.0), vec3( 1.0, 1.0, 1.0), vec3(-1.0, 1.0, 1.0),
53-
vec3(-1.0,-1.0,-1.0), vec3( 1.0,-1.0,-1.0), vec3( 1.0, 1.0,-1.0), vec3(-1.0, 1.0,-1.0)
136+
vec3(-1.0,-1.0, 1.0), vec3( 1.0,-1.0, 1.0), vec3( 1.0, 1.0, 1.0), vec3(-1.0, 1.0, 1.0),
137+
vec3(-1.0,-1.0,-1.0), vec3( 1.0,-1.0,-1.0), vec3( 1.0, 1.0,-1.0), vec3(-1.0, 1.0,-1.0)
54138
);
55139
56140
layout(push_constant) uniform constants {
@@ -112,12 +196,21 @@ VULKAN_APP_MAIN {
112196
.debugName = "CubeMap",
113197
});
114198

199+
#if defined(LVK_DEMO_WITH_SLANG)
200+
lvk::Holder<lvk::ShaderModuleHandle> vert_ = ctx->createShaderModule({codeSlang, lvk::Stage_Vert, "Shader Module: main (vert)"});
201+
lvk::Holder<lvk::ShaderModuleHandle> frag_ = ctx->createShaderModule({codeSlang, lvk::Stage_Frag, "Shader Module: main (frag)"});
202+
lvk::Holder<lvk::ShaderModuleHandle> vertTriangle_ =
203+
ctx->createShaderModule({codeTriangleSlang, lvk::Stage_Vert, "Shader Module: triangle (vert)"});
204+
lvk::Holder<lvk::ShaderModuleHandle> fragTriangle_ =
205+
ctx->createShaderModule({codeTriangleSlang, lvk::Stage_Frag, "Shader Module: triangle (frag)"});
206+
#else
115207
lvk::Holder<lvk::ShaderModuleHandle> vert_ = ctx->createShaderModule({codeVS, lvk::Stage_Vert, "Shader Module: main (vert)"});
116208
lvk::Holder<lvk::ShaderModuleHandle> frag_ = ctx->createShaderModule({codeFS, lvk::Stage_Frag, "Shader Module: main (frag)"});
117209
lvk::Holder<lvk::ShaderModuleHandle> vertTriangle_ =
118210
ctx->createShaderModule({codeTriangleVS, lvk::Stage_Vert, "Shader Module: triangle (vert)"});
119211
lvk::Holder<lvk::ShaderModuleHandle> fragTriangle_ =
120212
ctx->createShaderModule({codeTriangleFS, lvk::Stage_Frag, "Shader Module: triangle (frag)"});
213+
#endif // defined(LVK_DEMO_WITH_SLANG)
121214

122215
lvk::Holder<lvk::RenderPipelineHandle> renderPipelineState_Mesh_ = ctx->createRenderPipeline({
123216
.smVert = vert_,

samples/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ endmacro()
149149

150150
ADD_DEMO("001_HelloTriangle" LVK_WITH_SLANG)
151151
ADD_DEMO("002_RenderToCubeMap" LVK_WITH_SLANG)
152-
ADD_DEMO("003_RenderToCubeMapSinglePass")
152+
ADD_DEMO("003_RenderToCubeMapSinglePass" LVK_WITH_SLANG)
153153
ADD_DEMO("004_YUV")
154154
if(WIN32 OR UNIX AND NOT (APPLE))
155155
# Windows and Linux

0 commit comments

Comments
 (0)