[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