diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2020-11-24 11:27:12 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2020-11-24 20:21:13 +0000 |
commit | 0c4e42bed74598164c78211f1bf97b5ff4cee0a0 (patch) | |
tree | 611a10624989876de9b256dd2377d376351b6745 /examples | |
parent | c9ddee20bc6f82b171cc9346d7afa3562b7e41ca (diff) |
compute-particles examples: add RHI techniques and shaders
Change-Id: I56f1bb06479f82a10dda6dce0902a64381cd8147
Reviewed-by: Mike Krus <mike.krus@kdab.com>
(cherry picked from commit e57682ca4f8722ceb5835a522484635af6f8ea02)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'examples')
-rw-r--r-- | examples/qt3d/compute-particles/CMakeLists.txt | 9 | ||||
-rw-r--r-- | examples/qt3d/compute-particles/ComputeMaterial.qml | 63 | ||||
-rw-r--r-- | examples/qt3d/compute-particles/compute-particles.qrc | 9 | ||||
-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.comp | 43 | ||||
-rw-r--r-- | examples/qt3d/compute-particles/shaders/gl45/particles.frag | 33 | ||||
-rw-r--r-- | examples/qt3d/compute-particles/shaders/gl45/particles.vert | 33 |
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)); +} |