[Bf-blender-cvs] [2a272ed145f] temp-gpu-compute-shader-hair: Use GPU calls for hair.
Jeroen Bakker
noreply at git.blender.org
Wed Apr 28 13:18:50 CEST 2021
Commit: 2a272ed145f75db823f97e5a40c60585d5312361
Author: Jeroen Bakker
Date: Mon Apr 26 13:35:20 2021 +0200
Branches: temp-gpu-compute-shader-hair
https://developer.blender.org/rB2a272ed145f75db823f97e5a40c60585d5312361
Use GPU calls for hair.
===================================================================
M source/blender/draw/intern/draw_hair.c
M source/blender/draw/intern/shaders/common_hair_refine_vert.glsl
===================================================================
diff --git a/source/blender/draw/intern/draw_hair.c b/source/blender/draw/intern/draw_hair.c
index b08a2c09f60..1f75a760be3 100644
--- a/source/blender/draw/intern/draw_hair.c
+++ b/source/blender/draw/intern/draw_hair.c
@@ -37,7 +37,9 @@
#include "GPU_batch.h"
#include "GPU_capabilities.h"
+#include "GPU_compute.h"
#include "GPU_shader.h"
+#include "GPU_texture.h"
#include "GPU_vertex_buffer.h"
#include "draw_hair_private.h"
@@ -95,7 +97,7 @@ static GPUShader *hair_refine_shader_get(ParticleRefineShader sh)
const bool do_compute = drw_hair_use_compute_shaders();
if (do_compute) {
g_refine_shaders[sh] = GPU_shader_create_compute(datatoc_common_hair_refine_vert_glsl,
- datatoc_common_hair_lib_glsl,
+ NULL /* datatoc_common_hair_lib_glsl*/,
"#define HAIR_PHASE_SUBDIV\n",
__func__);
return g_refine_shaders[sh];
@@ -161,12 +163,24 @@ static void drw_hair_particle_cache_update_compute(ParticleHairCache *cache, con
const int final_points_len = cache->final[subdiv].strands_res * cache->strands_len;
if (final_points_len > 0) {
GPUShader *shader = hair_refine_shader_get(PART_REFINE_CATMULL_ROM);
-
- DRWShadingGroup *shgrp = DRW_shgroup_create(shader, g_tf_pass);
-
- drw_hair_particle_cache_shgrp_attach_resources(shgrp, cache, subdiv);
- DRW_shgroup_uniform_image(shgrp, "hairPointOutputBuffer", cache->final[subdiv].proc_tex);
- DRW_shgroup_call_compute(shgrp, cache->strands_len, cache->final[subdiv].strands_res, 1);
+ GPU_shader_bind(shader);
+ // GPU_texture_bind(cache->point_tex, GPU_shader_get_uniform(shader, "hairPointBuffer"));
+ // GPU_texture_bind(cache->strand_tex, GPU_shader_get_uniform(shader, "hairStrandBuffer"));
+ // GPU_texture_bind(cache->strand_seg_tex, GPU_shader_get_uniform(shader,
+ // "hairStrandSegBuffer")); GPU_shader_uniform_1i(shader, "hairStrandsRes",
+ // cache->final[subdiv].strands_res);
+ GPU_texture_image_bind(cache->final[subdiv].proc_tex,
+ GPU_shader_get_uniform(shader, "hairPointOutputBuffer"));
+ GPU_compute_dispatch(shader, final_points_len, 1, 1);
+ GPU_memory_barrier(GPU_BARRIER_TEXTURE_FETCH);
+ float *data = GPU_texture_read(cache->final[subdiv].proc_tex, GPU_DATA_FLOAT, 0);
+ for (int index = 0; index < final_points_len; index++) {
+ printf("%f, %f, %f, %f\n",
+ data[index * 4],
+ data[index * 4 + 1],
+ data[index * 4 + 2],
+ data[index * 4 + 3]);
+ }
}
}
@@ -425,6 +439,7 @@ void DRW_hair_update(void)
DRW_draw_pass(g_tf_pass);
if (drw_hair_use_compute_shaders()) {
GPU_memory_barrier(GPU_BARRIER_VERTEX_ATTRIB_ARRAY);
+ GPU_memory_barrier(GPU_BARRIER_TEXTURE_FETCH);
}
#endif
TIMEIT_END(DRW_hair_update);
diff --git a/source/blender/draw/intern/shaders/common_hair_refine_vert.glsl b/source/blender/draw/intern/shaders/common_hair_refine_vert.glsl
index 28e3432c704..8b29b1a09b9 100644
--- a/source/blender/draw/intern/shaders/common_hair_refine_vert.glsl
+++ b/source/blender/draw/intern/shaders/common_hair_refine_vert.glsl
@@ -3,24 +3,26 @@
* To be compiled with common_hair_lib.glsl.
* Shader can be used as a vertex or a compute shader.
*/
-#ifdef GPU_VERTEX_SHADER
+
+#if 0
+# ifdef GPU_VERTEX_SHADER
out vec4 finalColor;
-#endif
+# endif
-#ifdef GPU_COMPUTE_SHADER
+# ifdef GPU_COMPUTE_SHADER
layout(local_size_x = 1, local_size_y = 1) in;
layout(rgba32f, binding = 0) uniform image1D hairPointOutputBuffer;
-#endif
+# endif
vec4 get_weights_cardinal(float t)
{
float t2 = t * t;
float t3 = t2 * t;
-#if defined(CARDINAL)
+# if defined(CARDINAL)
float fc = 0.71;
-#else /* defined(CATMULL_ROM) */
+# else /* defined(CATMULL_ROM) */
float fc = 0.5;
-#endif
+# endif
vec4 weights;
/* GLSL Optimized version of key_curve_position_weights() */
@@ -53,11 +55,11 @@ vec4 interp_data(vec4 v0, vec4 v1, vec4 v2, vec4 v3, vec4 w)
return v0 * w.x + v1 * w.y + v2 * w.z + v3 * w.w;
}
-#ifdef TF_WORKAROUND
+# ifdef TF_WORKAROUND
uniform int targetWidth;
uniform int targetHeight;
uniform int idOffset;
-#endif
+# endif
void main(void)
{
@@ -68,10 +70,10 @@ void main(void)
vec4 weights = get_weights_cardinal(interp_time);
vec4 result = interp_data(data0, data1, data2, data3, weights);
-#ifdef GPU_VERTEX_SHADER
+# ifdef GPU_VERTEX_SHADER
finalColor = result;
-# ifdef TF_WORKAROUND
+# ifdef TF_WORKAROUND
int id = gl_VertexID - idOffset;
gl_Position.x = ((float(id % targetWidth) + 0.5) / float(targetWidth)) * 2.0 - 1.0;
gl_Position.y = ((float(id / targetWidth) + 0.5) / float(targetHeight)) * 2.0 - 1.0;
@@ -79,11 +81,24 @@ void main(void)
gl_Position.w = 1.0;
gl_PointSize = 1.0;
+# endif
# endif
-#endif
-#ifdef GPU_COMPUTE_SHADER
- int index = int(gl_GlobalInvocationID.x) * hairStrandsRes;
+# ifdef GPU_COMPUTE_SHADER
+ int index = int(gl_GlobalInvocationID.x) * hairStrandsRes + int(gl_GlobalInvocationID.y);
imageStore(hairPointOutputBuffer, index, result);
-#endif
+# endif
}
+#else
+
+layout(local_size_x = 1, local_size_y = 1) in;
+layout(rgba32f, binding = 0) uniform image1D hairPointOutputBuffer;
+
+void main(void)
+{
+ vec4 result = vec4(0.0, 0.2, 0.4, 1.0);
+ int index = int(gl_GlobalInvocationID.x);
+ imageStore(hairPointOutputBuffer, index, result);
+}
+
+#endif
\ No newline at end of file
More information about the Bf-blender-cvs
mailing list