[Bf-blender-cvs] [a7ce29b] strand_gpu: Various fixes for GL state and some basic texture lookups in the strand geometry shader.
Lukas Tönne
noreply at git.blender.org
Tue Jul 5 09:57:20 CEST 2016
Commit: a7ce29b412d7ce6a23d1abecd7fdf0e2d2cbe7d2
Author: Lukas Tönne
Date: Mon Jul 4 10:04:29 2016 +0200
Branches: strand_gpu
https://developer.blender.org/rBa7ce29b412d7ce6a23d1abecd7fdf0e2d2cbe7d2
Various fixes for GL state and some basic texture lookups in the strand geometry shader.
===================================================================
M source/blender/gpu/intern/gpu_buffers.c
M source/blender/gpu/intern/gpu_strands.c
===================================================================
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index 72e6bc2..3439083 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -2165,7 +2165,7 @@ static GPUBufferTexture *gpu_strands_buffer_texture_from_type(GPUDrawStrands *gd
*format = GL_RGB32F;
return &gds->control_points_tex;
case GPU_STRAND_BUFFER_CONTROL_CURVE:
- *format = GL_R32UI;
+ *format = GL_RG32UI;
return &gds->control_curves_tex;
default:
*format = 0;
@@ -2232,10 +2232,12 @@ static void strands_copy_curve_buffer(StrandData *strands, unsigned int (*varray
static void strands_copy_edge_buffer(StrandData *strands, unsigned int (*varray)[2])
{
int totcurves = strands->totcurves, c;
+ int totedge = 0;
StrandCurveData *curve = strands->curves;
for (c = 0; c < totcurves; ++c, ++curve) {
int verts_begin = curve->verts_begin, num_verts = curve->num_verts, v;
+ BLI_assert(verts_begin < strands->totverts);
BLI_assert(num_verts >= 2);
StrandVertexData *vert = strands->verts + verts_begin;
@@ -2243,8 +2245,11 @@ static void strands_copy_edge_buffer(StrandData *strands, unsigned int (*varray)
(*varray)[0] = verts_begin + v;
(*varray)[1] = verts_begin + v + 1;
++varray;
+ ++totedge;
}
}
+ BLI_assert(totedge == strands->totverts - totcurves);
+ UNUSED_VARS(totedge);
}
static void strands_copy_root_buffer(StrandData *strands, RootVertex *varray)
@@ -2341,6 +2346,9 @@ static GPUBuffer *strands_setup_buffer_type(StrandData *strands, GPUStrandBuffer
static void strands_setup_buffer_texture(StrandData *UNUSED(strands), GPUBuffer *buffer, GLenum format,
GPUBufferTexture *tex)
{
+ if (!buffer)
+ return;
+
glGenTextures(1, &tex->id);
glBindTexture(GL_TEXTURE_BUFFER, tex->id);
@@ -2361,12 +2369,10 @@ static bool strands_setup_buffer_common(StrandData *strands, GPUStrandBufferType
if (*buf == NULL || update) {
*buf = strands_setup_buffer_type(strands, type, *buf);
- if (*buf) {
- GLenum tex_format;
- tex = gpu_strands_buffer_texture_from_type(strands->gpu_buffer, type, &tex_format);
- if (tex)
- strands_setup_buffer_texture(strands, *buf, tex_format, tex);
- }
+ GLenum tex_format;
+ tex = gpu_strands_buffer_texture_from_type(strands->gpu_buffer, type, &tex_format);
+ if (tex)
+ strands_setup_buffer_texture(strands, *buf, tex_format, tex);
}
return *buf != NULL;
@@ -2415,12 +2421,12 @@ void GPU_strands_setup_roots(StrandData *strands)
GLStates |= (GPU_BUFFER_VERTEX_STATE);
- glActiveTexture(GL_TEXTURE0);
if (strands->gpu_buffer->control_curves_tex.id != 0) {
+ glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_BUFFER, strands->gpu_buffer->control_curves_tex.id);
}
- glActiveTexture(GL_TEXTURE1);
if (strands->gpu_buffer->control_points_tex.id != 0) {
+ glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_BUFFER, strands->gpu_buffer->control_points_tex.id);
}
}
@@ -2433,7 +2439,10 @@ void GPU_strands_buffer_unbind(void)
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_BUFFER, 0);
- glDisable(GL_TEXTURE_BUFFER);
+ glActiveTexture(GL_TEXTURE1);
+ glBindTexture(GL_TEXTURE_BUFFER, 0);
+ /* reset, following draw code expects active texture 0 */
+ glActiveTexture(GL_TEXTURE0);
}
void GPU_strands_buffer_free(StrandData *strands)
@@ -2442,11 +2451,14 @@ void GPU_strands_buffer_free(StrandData *strands)
GPUDrawStrands *gds = strands->gpu_buffer;
#if 0 /* XXX crashes, maybe not needed for buffer textures? */
- if (gds->root_tex.id)
- glDeleteTextures(1, &gds->root_tex.id);
+ if (gds->control_curves_tex.id)
+ glDeleteTextures(1, &gds->control_curves_tex.id);
+ if (gds->control_points_tex.id)
+ glDeleteTextures(1, &gds->control_points_tex.id);
#endif
GPU_buffer_free(gds->control_points);
+ GPU_buffer_free(gds->control_curves);
GPU_buffer_free(gds->control_edges);
GPU_buffer_free(gds->root_points);
diff --git a/source/blender/gpu/intern/gpu_strands.c b/source/blender/gpu/intern/gpu_strands.c
index 2764d96..c6f0c72 100644
--- a/source/blender/gpu/intern/gpu_strands.c
+++ b/source/blender/gpu/intern/gpu_strands.c
@@ -50,8 +50,8 @@
typedef enum GPUStrandAttributes {
GPU_STRAND_ATTRIB_POSITION,
- GPU_STRAND_ATTRIB_GUIDE_INDEX,
- GPU_STRAND_ATTRIB_GUIDE_WEIGHT,
+ GPU_STRAND_ATTRIB_CONTROL_INDEX,
+ GPU_STRAND_ATTRIB_CONTROL_WEIGHT,
NUM_GPU_STRAND_ATTRIB /* must be last */
} GPUStrandAttributes;
@@ -68,42 +68,87 @@ struct GPUStrandsShader {
};
const char *vertex_shader = STRINGIFY(
- in uvec3 control_index;
- in vec3 control_weight;
+ in uvec4 control_index;
+ in vec4 control_weight;
- void main()
- {
- vec4 co = gl_ModelViewMatrix * (gl_Vertex + vec4(control_weight.xyz, 0.0));
- gl_Position = gl_ProjectionMatrix * co;
- }
-);
+ out uvec4 v_control_index;
+ out vec4 v_control_weight;
-const char *fragment_shader = STRINGIFY(
- out vec4 outColor;
+ out vec3 vColor;
void main()
{
- outColor = vec4(1.0, 0.0, 1.0, 1.0);
+// vec4 co = gl_ModelViewMatrix * gl_Vertex;
+// gl_Position = gl_ProjectionMatrix * co;
+ gl_Position = gl_Vertex;
+
+ v_control_index = control_index;
+ v_control_weight = control_weight;
+ vColor = vec3(float(control_index.x)/float(10), 0.0, 0.0);
}
);
const char *geometry_shader = STRINGIFY(
layout(points) in;
- layout(line_strip, max_vertices = 2) out;
+ layout(line_strip, max_vertices = 64) out;
- uniform samplerBuffer guides;
+ in vec3 vColor[];
+
+ in uvec4 v_control_index[];
+ in vec4 v_control_weight[];
+
+ out vec3 fColor;
+
+ uniform isamplerBuffer control_curves;
+ uniform samplerBuffer control_points;
void main()
{
- gl_Position = gl_in[0].gl_Position + vec4(-0.1, 0.0, 0.0, 0.0);
+ vec4 root = gl_in[0].gl_Position;
+
+ int index0 = int(v_control_index[0].x);
+ ivec4 curve0 = texelFetch(control_curves, index0);
+ int vert_begin0 = int(curve0.x);
+ int num_verts0 = int(curve0.y);
+ vec4 root0 = texelFetch(control_points, vert_begin0);
+ vec4 offset0 = root - root0;
+
+// fColor = vColor[0];
+ fColor = vec3(float(num_verts0)/float(10), 0.0, 0.0);
+
+ gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * root;
EmitVertex();
- gl_Position = gl_in[0].gl_Position + vec4(0.1, 0.0, 0.0, 0.0);
+// gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * (root + vec4(0.1, 0.0, 0.0, 0.0));
+// gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * (root + vec4(float(index0 % 10 + 1) * 0.01, 0.0, 0.0, 0.0));
+// gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * vec4(index0, 0.0, 0.0, 1.0);
+// gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * vec4(v_control_weight[0].xyz, 1.0);
+// EmitVertex();
+
+ gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * root0;
EmitVertex();
- EndPrimitive();
+/* for (int i = 1; i < num_verts; ++i) {
+ vec4 loc = texelFetch(control_points, vert_begin + i);
+
+ gl_Position = vec4((loc + offset).xyz, 1.0);
+ EmitVertex();
+ }*/
+
+ EndPrimitive();
}
);
+
+ const char *fragment_shader = STRINGIFY(
+ in vec3 fColor;
+
+ out vec4 outColor;
+
+ void main()
+ {
+ outColor = vec4(fColor, 1.0);
+ }
+ );
static char *codegen_vertex(void)
{
@@ -121,7 +166,7 @@ static char *codegen_vertex(void)
#endif
}
-static char *codegen_fragment(void)
+static char *codegen_geometry(void)
{
#if 0
char *code;
@@ -133,11 +178,11 @@ static char *codegen_fragment(void)
return code;
#else
- return BLI_strdup(fragment_shader);
+ return BLI_strdup(geometry_shader);
#endif
}
-static char *codegen_geometry(void)
+static char *codegen_fragment(void)
{
#if 0
char *code;
@@ -149,7 +194,7 @@ static char *codegen_geometry(void)
return code;
#else
- return BLI_strdup(geometry_shader);
+ return BLI_strdup(fragment_shader);
#endif
}
@@ -161,9 +206,9 @@ GPUStrandsShader *GPU_strand_shader_get(struct Strands *strands)
GPUStrandsShader *gpu_shader = MEM_callocN(sizeof(GPUStrandsShader), "GPUStrands");
/* TODO */
- char *fragmentcode = codegen_fragment();
char *vertexcode = codegen_vertex();
char *geometrycode = codegen_geometry();
+ char *fragmentcode = codegen_fragment();
int flags = GPU_SHADER_FLAGS_NONE;
@@ -182,8 +227,13 @@ GPUStrandsShader *GPU_strand_shader_get(struct Strands *strands)
if (shader) {
gpu_shader->shader = shader;
gpu_shader->vertexcode = vertexcode;
- gpu_shader->fragmentcode = fragmentcode;
gpu_shader->geometrycode = geometrycode;
+ gpu_shader->fragmentcode = fragmentcode;
+
+ GPU_shader_bind(gpu_shader->shader);
+ GPU_shader_uniform_int(shader, GPU_shader_get_uniform(shader, "control_curves"), 0);
+ GPU_shader_uniform_int(shader, GPU_shader_get_uniform(shader, "control_points"), 1);
+ GPU_shader_unbind();
GPUAttrib *attr;
@@ -193,13 +243,13 @@ GPUStrandsShader *GPU_strand_shader_get(struct Strands *strands)
attr->type = GL_FLOAT;
attr->size = 3;
- attr = &gpu_shader->attributes[GPU_STRAND_ATTRIB_GUIDE_INDEX];
+ attr = &gpu_shader->attributes[GPU_STRAND_ATTRIB_CONTROL_INDEX];
attr->index = GPU_shader_get_attribute(gpu_shader->shader, "control_index");
attr->info_index = -1;
attr->type = GL_UNSIGNED_INT;
attr->size = 4;
- attr = &gpu_shader->attributes[GPU_STRAND_ATTRIB_GUIDE_WEIGHT];
+ attr = &gpu_shader->attributes[GPU_STRAND_ATTRIB_CONTROL_WEIGHT];
attr->index = GPU_shader_get_attribute(gpu_shader->shader, "control_weight");
attr->info_index = -1;
attr->type = GL_FLOAT;
@@ -208,10 +258,10 @@ GPUStrandsShader *GPU_strand_shader_get(struct Strands *strands)
else {
if (vertexcode)
MEM_freeN(vertexcode);
- if (fragmentcode)
- MEM_freeN(fragmentcode);
if (geometrycode)
MEM_freeN(geometrycode);
+ if (fragmentcode)
+ MEM_freeN(fragmentcode);
}
strands->gpu_shader = gpu_shader;
@@ -223,12 +273,12 @@ void GPU_strand_shader_free(struct GPUStrandsShader *gpu_shader)
if (gpu_shader->shader)
GPU_shader_free(gpu_shader->shader);
- if (gpu_shader->fragmentcode)
- MEM_freeN(gpu_shader->fragmentcode);
if (gpu_shader->vertexcode)
MEM_freeN(gpu_shader->vertexcode);
if (gpu_shader-
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list