summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2020-11-24 11:27:12 +0100
committerPaul Lemire <paul.lemire@kdab.com>2020-11-24 19:57:36 +0100
commite57682ca4f8722ceb5835a522484635af6f8ea02 (patch)
treee697e2ff80b4702d2b41460c696d72015c6a6b96 /examples
parentb03f20ef4e6f87e8c4b7290b98399ab05bdb8c9c (diff)
compute-particles examples: add RHI techniques and shaders
Pick-to: 6.0 Pick-to: 6.0.0 Change-Id: I56f1bb06479f82a10dda6dce0902a64381cd8147 Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'examples')
-rw-r--r--examples/qt3d/compute-particles/CMakeLists.txt9
-rw-r--r--examples/qt3d/compute-particles/ComputeMaterial.qml63
-rw-r--r--examples/qt3d/compute-particles/compute-particles.qrc9
-rw-r--r--examples/qt3d/compute-particles/shaders/gl43/particles.comp (renamed from examples/qt3d/compute-particles/particles.comp)0
-rw-r--r--examples/qt3d/compute-particles/shaders/gl43/particles.frag (renamed from examples/qt3d/compute-particles/particles.frag)0
-rw-r--r--examples/qt3d/compute-particles/shaders/gl43/particles.vert (renamed from examples/qt3d/compute-particles/particles.vert)0
-rw-r--r--examples/qt3d/compute-particles/shaders/gl45/particles.comp43
-rw-r--r--examples/qt3d/compute-particles/shaders/gl45/particles.frag33
-rw-r--r--examples/qt3d/compute-particles/shaders/gl45/particles.vert33
9 files changed, 171 insertions, 19 deletions
diff --git a/examples/qt3d/compute-particles/CMakeLists.txt b/examples/qt3d/compute-particles/CMakeLists.txt
index c8f861176..c221b3a25 100644
--- a/examples/qt3d/compute-particles/CMakeLists.txt
+++ b/examples/qt3d/compute-particles/CMakeLists.txt
@@ -45,9 +45,12 @@ set(compute-particles_resource_files
"ComputeMaterial.qml"
"ParticlesScene.qml"
"main.qml"
- "particles.comp"
- "particles.frag"
- "particles.vert"
+ "shaders/gl43/particles.comp"
+ "shaders/gl43/particles.frag"
+ "shaders/gl43/particles.vert"
+ "shaders/gl45/particles.comp"
+ "shaders/gl45/particles.frag"
+ "shaders/gl45/particles.vert"
)
qt6_add_resources(compute-particles "compute-particles"
diff --git a/examples/qt3d/compute-particles/ComputeMaterial.qml b/examples/qt3d/compute-particles/ComputeMaterial.qml
index 3f09fc9ef..a12756561 100644
--- a/examples/qt3d/compute-particles/ComputeMaterial.qml
+++ b/examples/qt3d/compute-particles/ComputeMaterial.qml
@@ -61,23 +61,14 @@ Material {
Parameter { name: "finalCollisionFactor"; value: finalCollisionFactor }
]
- ShaderProgram {
- id: computeShader
- computeShaderCode: loadSource("qrc:/particles.comp")
- }
-
- ShaderProgram {
- id: drawShader
- vertexShaderCode: loadSource("qrc:/particles.vert")
- fragmentShaderCode: loadSource("qrc:/particles.frag")
- }
-
effect: Effect {
techniques: [
Technique {
renderPasses: [
RenderPass {
- shaderProgram: computeShader
+ shaderProgram: ShaderProgram {
+ computeShaderCode: loadSource("qrc:/shaders/gl43/particles.comp")
+ }
// We set the buffer as the parameter data
parameters: [
Parameter { name: "Particles"; value: dataBuffer }
@@ -97,7 +88,10 @@ Material {
Technique {
renderPasses: [
RenderPass {
- shaderProgram: drawShader
+ shaderProgram: ShaderProgram {
+ vertexShaderCode: loadSource("qrc:/shaders/gl43/particles.vert")
+ fragmentShaderCode: loadSource("qrc:/shaders/gl43/particles.frag")
+ }
// We assume the mesh to be drawn will also receive
// Vertex buffers attributes that will be used to position and color
}
@@ -111,6 +105,49 @@ Material {
majorVersion: 4
minorVersion: 3
}
+ },
+ Technique {
+ renderPasses: [
+ RenderPass {
+ shaderProgram: ShaderProgram {
+ computeShaderCode: loadSource("qrc:/shaders/gl45/particles.comp")
+ }
+ // We set the buffer as the parameter data
+ parameters: [
+ Parameter { name: "Particles"; value: dataBuffer }
+ ]
+ }
+ ]
+ filterKeys: [
+ FilterKey { name: "type"; value: "compute" }
+ ]
+ graphicsApiFilter {
+ api: GraphicsApiFilter.RHI
+ profile: GraphicsApiFilter.NoProfile
+ majorVersion: 1
+ minorVersion: 0
+ }
+ },
+ Technique {
+ renderPasses: [
+ RenderPass {
+ shaderProgram: ShaderProgram {
+ vertexShaderCode: loadSource("qrc:/shaders/gl45/particles.vert")
+ fragmentShaderCode: loadSource("qrc:/shaders/gl45/particles.frag")
+ }
+ // We assume the mesh to be drawn will also receive
+ // Vertex buffers attributes that will be used to position and color
+ }
+ ]
+ filterKeys: [
+ FilterKey { name: "type"; value: "draw" }
+ ]
+ graphicsApiFilter {
+ api: GraphicsApiFilter.RHI
+ profile: GraphicsApiFilter.NoProfile
+ majorVersion: 1
+ minorVersion: 0
+ }
}
] // techniques
}
diff --git a/examples/qt3d/compute-particles/compute-particles.qrc b/examples/qt3d/compute-particles/compute-particles.qrc
index 0f94fddd5..b9d41c875 100644
--- a/examples/qt3d/compute-particles/compute-particles.qrc
+++ b/examples/qt3d/compute-particles/compute-particles.qrc
@@ -3,9 +3,12 @@
<file>main.qml</file>
<file>ComputeFrameGraph.qml</file>
<file>ComputeMaterial.qml</file>
- <file>particles.frag</file>
- <file>particles.vert</file>
<file>ParticlesScene.qml</file>
- <file>particles.comp</file>
+ <file>shaders/gl43/particles.frag</file>
+ <file>shaders/gl43/particles.vert</file>
+ <file>shaders/gl43/particles.comp</file>
+ <file>shaders/gl45/particles.frag</file>
+ <file>shaders/gl45/particles.vert</file>
+ <file>shaders/gl45/particles.comp</file>
</qresource>
</RCC>
diff --git a/examples/qt3d/compute-particles/particles.comp b/examples/qt3d/compute-particles/shaders/gl43/particles.comp
index af993bbe2..af993bbe2 100644
--- a/examples/qt3d/compute-particles/particles.comp
+++ b/examples/qt3d/compute-particles/shaders/gl43/particles.comp
diff --git a/examples/qt3d/compute-particles/particles.frag b/examples/qt3d/compute-particles/shaders/gl43/particles.frag
index 3f11b9868..3f11b9868 100644
--- a/examples/qt3d/compute-particles/particles.frag
+++ b/examples/qt3d/compute-particles/shaders/gl43/particles.frag
diff --git a/examples/qt3d/compute-particles/particles.vert b/examples/qt3d/compute-particles/shaders/gl43/particles.vert
index 5f2da2a00..5f2da2a00 100644
--- a/examples/qt3d/compute-particles/particles.vert
+++ b/examples/qt3d/compute-particles/shaders/gl43/particles.vert
diff --git a/examples/qt3d/compute-particles/shaders/gl45/particles.comp b/examples/qt3d/compute-particles/shaders/gl45/particles.comp
new file mode 100644
index 000000000..9a6f74cfc
--- /dev/null
+++ b/examples/qt3d/compute-particles/shaders/gl45/particles.comp
@@ -0,0 +1,43 @@
+#version 450 core
+
+layout(std140, binding=3) uniform particle_uniforms {
+ float particleStep;
+ float finalCollisionFactor;
+};
+
+layout (local_size_x = 1024) in;
+
+struct ParticleData
+{
+ vec4 position;
+ vec4 direction;
+ vec4 color;
+};
+
+// Particles from previouse frame
+layout (std430, binding = 5) coherent buffer Particles
+{
+ ParticleData particles[];
+} data;
+
+void main(void)
+{
+ uint globalId = gl_GlobalInvocationID.x;
+
+ // Retrieve current particle from previous frame
+ ParticleData currentParticle = data.particles[globalId];
+
+ // New position = old position + distance traveled over step duration
+ currentParticle.position = currentParticle.position + currentParticle.direction * particleStep;
+
+ // Make acceleration more or less point toward the center of the scene
+ vec4 acceleration = normalize(vec4(0.0) - currentParticle.position) * finalCollisionFactor;
+
+ // New velocity = old velocity + acceleration over step duration
+ currentParticle.direction = currentParticle.direction + acceleration * particleStep;
+
+
+
+ // Save updated particle
+ data.particles[globalId] = currentParticle;
+}
diff --git a/examples/qt3d/compute-particles/shaders/gl45/particles.frag b/examples/qt3d/compute-particles/shaders/gl45/particles.frag
new file mode 100644
index 000000000..42fb12b40
--- /dev/null
+++ b/examples/qt3d/compute-particles/shaders/gl45/particles.frag
@@ -0,0 +1,33 @@
+#version 450 core
+
+layout(location = 0) out vec4 color;
+
+layout(location = 0) in VertexBlock
+{
+ flat vec3 color;
+ vec3 pos;
+ vec3 normal;
+} frag_in;
+
+const vec4 lightPosition = vec4(0.0, 0.0, 0.0, 0.0);
+const vec3 lightIntensity = vec3(1.0, 1.0, 1.0);
+const vec3 ka = vec3(0.1, 0.1, 0.1);
+const vec3 ks = vec3(0.8, 0.8, 0.8);
+const float shininess = 50.0;
+
+vec3 ads()
+{
+ vec3 n = normalize( frag_in.normal);
+ vec3 s = normalize( vec3(lightPosition) - frag_in.pos );
+ vec3 v = normalize( -frag_in.pos );
+ vec3 h = normalize( v + s );
+ return lightIntensity * (ka +
+ frag_in.color * max( dot(s, frag_in.normal ), 0.0 ) +
+ ks * pow( max( dot( h, n ), 0.0 ), shininess ) );
+}
+
+
+void main(void)
+{
+ color = vec4(ads(), 1.0);
+}
diff --git a/examples/qt3d/compute-particles/shaders/gl45/particles.vert b/examples/qt3d/compute-particles/shaders/gl45/particles.vert
new file mode 100644
index 000000000..b5815f6fb
--- /dev/null
+++ b/examples/qt3d/compute-particles/shaders/gl45/particles.vert
@@ -0,0 +1,33 @@
+#version 450 core
+
+layout(location = 0) in vec3 vertexPosition;
+layout(location = 1) in vec3 vertexNormal;
+
+layout(location = 2) in vec3 particlePosition;
+layout(location = 3) in vec3 particleColor;
+
+layout (location = 0) out VertexBlock
+{
+ flat vec3 color;
+ vec3 pos;
+ vec3 normal;
+} v_out;
+
+layout(std140, binding = 1) uniform qt3d_command_uniforms {
+ mat4 modelMatrix;
+ mat4 inverseModelMatrix;
+ mat4 modelViewMatrix;
+ mat3 modelNormalMatrix;
+ mat4 inverseModelViewMatrix;
+ mat4 modelViewProjection;
+ mat4 inverseModelViewProjectionMatrix;
+};
+
+void main(void)
+{
+ vec4 pos = vec4(vertexPosition.xyz, 1.0) + vec4(particlePosition, 0.0);
+ gl_Position = modelViewProjection * pos;
+ v_out.pos = vec4(modelViewMatrix * pos).xyz;
+ v_out.normal = normalize(modelNormalMatrix * vertexNormal);
+ v_out.color = mix(particleColor * 0.2, particleColor, smoothstep(0.5, 0.8, abs(v_out.normal).z));
+}