From e57682ca4f8722ceb5835a522484635af6f8ea02 Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Tue, 24 Nov 2020 11:27:12 +0100 Subject: compute-particles examples: add RHI techniques and shaders Pick-to: 6.0 Pick-to: 6.0.0 Change-Id: I56f1bb06479f82a10dda6dce0902a64381cd8147 Reviewed-by: Mike Krus --- examples/qt3d/compute-particles/CMakeLists.txt | 9 ++-- .../qt3d/compute-particles/ComputeMaterial.qml | 63 +++++++++++++++++----- .../qt3d/compute-particles/compute-particles.qrc | 9 ++-- examples/qt3d/compute-particles/particles.comp | 41 -------------- examples/qt3d/compute-particles/particles.frag | 33 ------------ examples/qt3d/compute-particles/particles.vert | 27 ---------- .../compute-particles/shaders/gl43/particles.comp | 41 ++++++++++++++ .../compute-particles/shaders/gl43/particles.frag | 33 ++++++++++++ .../compute-particles/shaders/gl43/particles.vert | 27 ++++++++++ .../compute-particles/shaders/gl45/particles.comp | 43 +++++++++++++++ .../compute-particles/shaders/gl45/particles.frag | 33 ++++++++++++ .../compute-particles/shaders/gl45/particles.vert | 33 ++++++++++++ 12 files changed, 272 insertions(+), 120 deletions(-) delete mode 100644 examples/qt3d/compute-particles/particles.comp delete mode 100644 examples/qt3d/compute-particles/particles.frag delete mode 100644 examples/qt3d/compute-particles/particles.vert create mode 100644 examples/qt3d/compute-particles/shaders/gl43/particles.comp create mode 100644 examples/qt3d/compute-particles/shaders/gl43/particles.frag create mode 100644 examples/qt3d/compute-particles/shaders/gl43/particles.vert create mode 100644 examples/qt3d/compute-particles/shaders/gl45/particles.comp create mode 100644 examples/qt3d/compute-particles/shaders/gl45/particles.frag create mode 100644 examples/qt3d/compute-particles/shaders/gl45/particles.vert (limited to 'examples') 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 @@ main.qml ComputeFrameGraph.qml ComputeMaterial.qml - particles.frag - particles.vert ParticlesScene.qml - particles.comp + shaders/gl43/particles.frag + shaders/gl43/particles.vert + shaders/gl43/particles.comp + shaders/gl45/particles.frag + shaders/gl45/particles.vert + shaders/gl45/particles.comp diff --git a/examples/qt3d/compute-particles/particles.comp b/examples/qt3d/compute-particles/particles.comp deleted file mode 100644 index af993bbe2..000000000 --- a/examples/qt3d/compute-particles/particles.comp +++ /dev/null @@ -1,41 +0,0 @@ -#version 430 core - -uniform float particleStep; -uniform float finalCollisionFactor; - -layout (local_size_x = 1024) in; - -struct ParticleData -{ - vec4 position; - vec4 direction; - vec4 color; -}; - -// Particles from previouse frame -layout (std430, binding = 0) 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/particles.frag b/examples/qt3d/compute-particles/particles.frag deleted file mode 100644 index 3f11b9868..000000000 --- a/examples/qt3d/compute-particles/particles.frag +++ /dev/null @@ -1,33 +0,0 @@ -#version 430 core - -out vec4 color; - -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/particles.vert b/examples/qt3d/compute-particles/particles.vert deleted file mode 100644 index 5f2da2a00..000000000 --- a/examples/qt3d/compute-particles/particles.vert +++ /dev/null @@ -1,27 +0,0 @@ -#version 430 core - -in vec3 vertexPosition; -in vec3 vertexNormal; - -in vec3 particlePosition; -in vec3 particleColor; - -out VertexBlock -{ - flat vec3 color; - vec3 pos; - vec3 normal; -} v_out; - -uniform mat4 mvp; -uniform mat3 modelViewNormal; -uniform mat4 modelView; - -void main(void) -{ - vec4 pos = vec4(vertexPosition.xyz, 1.0) + vec4(particlePosition, 0.0); - gl_Position = mvp * pos; - v_out.pos = vec4(modelView * pos).xyz; - v_out.normal = normalize(modelViewNormal * vertexNormal); - v_out.color = mix(particleColor * 0.2, particleColor, smoothstep(0.5, 0.8, abs(v_out.normal).z)); -} diff --git a/examples/qt3d/compute-particles/shaders/gl43/particles.comp b/examples/qt3d/compute-particles/shaders/gl43/particles.comp new file mode 100644 index 000000000..af993bbe2 --- /dev/null +++ b/examples/qt3d/compute-particles/shaders/gl43/particles.comp @@ -0,0 +1,41 @@ +#version 430 core + +uniform float particleStep; +uniform float finalCollisionFactor; + +layout (local_size_x = 1024) in; + +struct ParticleData +{ + vec4 position; + vec4 direction; + vec4 color; +}; + +// Particles from previouse frame +layout (std430, binding = 0) 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/gl43/particles.frag b/examples/qt3d/compute-particles/shaders/gl43/particles.frag new file mode 100644 index 000000000..3f11b9868 --- /dev/null +++ b/examples/qt3d/compute-particles/shaders/gl43/particles.frag @@ -0,0 +1,33 @@ +#version 430 core + +out vec4 color; + +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/gl43/particles.vert b/examples/qt3d/compute-particles/shaders/gl43/particles.vert new file mode 100644 index 000000000..5f2da2a00 --- /dev/null +++ b/examples/qt3d/compute-particles/shaders/gl43/particles.vert @@ -0,0 +1,27 @@ +#version 430 core + +in vec3 vertexPosition; +in vec3 vertexNormal; + +in vec3 particlePosition; +in vec3 particleColor; + +out VertexBlock +{ + flat vec3 color; + vec3 pos; + vec3 normal; +} v_out; + +uniform mat4 mvp; +uniform mat3 modelViewNormal; +uniform mat4 modelView; + +void main(void) +{ + vec4 pos = vec4(vertexPosition.xyz, 1.0) + vec4(particlePosition, 0.0); + gl_Position = mvp * pos; + v_out.pos = vec4(modelView * pos).xyz; + v_out.normal = normalize(modelViewNormal * vertexNormal); + v_out.color = mix(particleColor * 0.2, particleColor, smoothstep(0.5, 0.8, abs(v_out.normal).z)); +} 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)); +} -- cgit v1.2.3