[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37369] branches/cycles/source/blender: Cycles: quick GLSL stubs for new material nodes, so they show something.

Brecht Van Lommel brechtvanlommel at pandora.be
Fri Jun 10 15:22:55 CEST 2011


Revision: 37369
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37369
Author:   blendix
Date:     2011-06-10 13:22:55 +0000 (Fri, 10 Jun 2011)
Log Message:
-----------
Cycles: quick GLSL stubs for new material nodes, so they show something.

BSDFs and procedural textures show mostly as diffuse and white, geometry
and texture coordinates are incomplete.

Modified Paths:
--------------
    branches/cycles/source/blender/blenkernel/intern/node.c
    branches/cycles/source/blender/gpu/intern/gpu_draw.c
    branches/cycles/source/blender/gpu/intern/gpu_shader_material.glsl
    branches/cycles/source/blender/gpu/intern/gpu_shader_material.glsl.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_add_closure.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_bsdf_anisotropic.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_bsdf_diffuse.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_bsdf_glass.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_bsdf_glossy.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_bsdf_translucent.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_bsdf_transparent.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_bsdf_velvet.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_emission.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_fresnel.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_geometry.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_light_path.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_mix_closure.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_output_material.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_tex_blend.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_tex_clouds.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_tex_coord.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_tex_distnoise.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_tex_environment.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_tex_image.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_tex_magic.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_tex_marble.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_tex_musgrave.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_tex_noise.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_tex_sky.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_tex_stucci.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_tex_voronoi.c
    branches/cycles/source/blender/nodes/intern/SHD_nodes/SHD_tex_wood.c

Modified: branches/cycles/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/cycles/source/blender/blenkernel/intern/node.c	2011-06-10 13:06:51 UTC (rev 37368)
+++ branches/cycles/source/blender/blenkernel/intern/node.c	2011-06-10 13:22:55 UTC (rev 37369)
@@ -3114,6 +3114,8 @@
 			gs[i].type= GPU_VEC3;
 		else if (sock->type == SOCK_RGBA)
 			gs[i].type= GPU_VEC4;
+		else if (sock->type == SOCK_CLOSURE)
+			gs[i].type= GPU_VEC4;
 		else
 			gs[i].type= GPU_NONE;
 

Modified: branches/cycles/source/blender/gpu/intern/gpu_draw.c
===================================================================
--- branches/cycles/source/blender/gpu/intern/gpu_draw.c	2011-06-10 13:06:51 UTC (rev 37368)
+++ branches/cycles/source/blender/gpu/intern/gpu_draw.c	2011-06-10 13:22:55 UTC (rev 37369)
@@ -1189,6 +1189,7 @@
 
 int GPU_default_lights(void)
 {
+	float zero[3] = {0.0f, 0.0f, 0.0f};
 	int a, count = 0;
 	
 	/* initialize */
@@ -1214,27 +1215,25 @@
 
 	glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE);
 
-	glLightfv(GL_LIGHT0, GL_POSITION, U.light[0].vec); 
-	glLightfv(GL_LIGHT0, GL_DIFFUSE, U.light[0].col); 
-	glLightfv(GL_LIGHT0, GL_SPECULAR, U.light[0].spec); 
-
-	glLightfv(GL_LIGHT1, GL_POSITION, U.light[1].vec); 
-	glLightfv(GL_LIGHT1, GL_DIFFUSE, U.light[1].col); 
-	glLightfv(GL_LIGHT1, GL_SPECULAR, U.light[1].spec); 
-
-	glLightfv(GL_LIGHT2, GL_POSITION, U.light[2].vec); 
-	glLightfv(GL_LIGHT2, GL_DIFFUSE, U.light[2].col); 
-	glLightfv(GL_LIGHT2, GL_SPECULAR, U.light[2].spec); 
-
 	for(a=0; a<8; a++) {
 		if(a<3) {
 			if(U.light[a].flag) {
 				glEnable(GL_LIGHT0+a);
+				
+				glLightfv(GL_LIGHT0+a, GL_POSITION, U.light[a].vec); 
+				glLightfv(GL_LIGHT0+a, GL_DIFFUSE, U.light[a].col); 
+				glLightfv(GL_LIGHT0+a, GL_SPECULAR, U.light[a].spec); 
+
 				count++;
 			}
-			else
+			else {
 				glDisable(GL_LIGHT0+a);
-			
+
+				glLightfv(GL_LIGHT0+a, GL_POSITION, zero); 
+				glLightfv(GL_LIGHT0+a, GL_DIFFUSE, zero); 
+				glLightfv(GL_LIGHT0+a, GL_SPECULAR, zero);
+			}
+
 			// clear stuff from other opengl lamp usage
 			glLightf(GL_LIGHT0+a, GL_SPOT_CUTOFF, 180.0);
 			glLightf(GL_LIGHT0+a, GL_CONSTANT_ATTENUATION, 1.0);

Modified: branches/cycles/source/blender/gpu/intern/gpu_shader_material.glsl
===================================================================
--- branches/cycles/source/blender/gpu/intern/gpu_shader_material.glsl	2011-06-10 13:06:51 UTC (rev 37368)
+++ branches/cycles/source/blender/gpu/intern/gpu_shader_material.glsl	2011-06-10 13:22:55 UTC (rev 37369)
@@ -108,6 +108,7 @@
 }
 
 #define M_PI 3.14159265358979323846
+#define M_1_PI 0.31830988618379069
 
 /*********** SHADER NODES ***************/
 
@@ -1786,3 +1787,312 @@
 	outcol = vec4(col.rgb, col.a*obcol.a);
 }
 
+/*********** NEW SHADER UTILITIES **************/
+
+float fresnel_dielectric(vec3 Incoming, vec3 Normal, float eta)
+{
+    /* compute fresnel reflectance without explicitly computing
+       the refracted direction */
+    float c = abs(dot(Incoming, Normal));
+    float g = eta * eta - 1.0 + c * c;
+    float result;
+
+    if(g > 0.0) {
+        g = sqrt(g);
+        float A =(g - c)/(g + c);
+        float B =(c *(g + c)- 1.0)/(c *(g - c)+ 1.0);
+        result = 0.5 * A * A *(1.0 + B * B);
+    }
+    else
+        result = 1.0;  /* TIR (no refracted component) */
+
+    return result;
+}
+
+float hypot(float x, float y)
+{
+	return sqrt(x*x + y*y);
+}
+
+/*********** NEW SHADER NODES ***************/
+
+#define NUM_LIGHTS 3
+
+/* bsdfs */
+
+void node_bsdf_diffuse(vec4 color, vec3 N, out vec4 result)
+{
+	result = vec4(0.0);
+
+	for(int i = 0; i < NUM_LIGHTS; i++) {
+		vec3 L = gl_LightSource[i].position.xyz;
+		vec4 Ldiffuse = gl_LightSource[i].diffuse;
+
+		float bsdf = abs(dot(N, L)) * M_1_PI;
+		result += Ldiffuse*color*bsdf;
+	}
+}
+
+void node_bsdf_glossy(vec4 color, float roughness, float fresnel, vec3 N, vec3 I, out vec4 result)
+{
+	result = vec4(0.0);
+
+	for(int i = 0; i < NUM_LIGHTS; i++) {
+		vec3 H = gl_LightSource[i].halfVector.xyz;
+		vec4 Lspecular = gl_LightSource[i].specular;
+
+		float bsdf = pow(abs(dot(N, H)), 1.0/roughness) * M_1_PI;
+		result += Lspecular*color*bsdf;
+	}
+}
+
+void node_bsdf_anisotropic(vec4 color, float roughnessU, float roughnessV, vec3 N, vec3 I, out vec4 result)
+{
+	node_bsdf_diffuse(color, N, result);
+}
+
+void node_bsdf_glass(vec4 color, float roughness, float fresnel, vec3 N, vec3 I, out vec4 result)
+{
+	node_bsdf_diffuse(color, N, result);
+}
+
+void node_bsdf_translucent(vec4 color, vec3 N, out vec4 result)
+{
+	node_bsdf_diffuse(color, N, result);
+}
+
+void node_bsdf_transparent(vec4 color, out vec4 result)
+{
+	/* this isn't right */
+	result.r = color.r;
+	result.g = color.g;
+	result.b = color.b;
+	result.a = 0.0;
+}
+
+void node_bsdf_velvet(vec4 color, float sigma, float fresnel, vec3 N, out vec4 result)
+{
+	node_bsdf_diffuse(color, N, result);
+}
+
+/* emission */
+
+void node_emission(vec4 color, float strength, vec3 N, out vec4 result)
+{
+	result = color*strength * M_1_PI;
+}
+
+/* closures */
+
+void node_mix_closure(float fac, vec4 closure1, vec4 closure2, out vec4 closure)
+{
+	closure = mix(closure1, closure2, fac);
+}
+
+void node_add_closure(vec4 closure1, vec4 closure2, out vec4 closure)
+{
+	closure = closure1 + closure2;
+}
+
+/* fresnel */
+
+void node_fresnel(float f, vec3 N, vec3 I, out float result)
+{
+	f = max(1.0 - f, 0.00001);
+	result = fresnel_dielectric(I, N, 1.0/f); //backfacing()? f: 1.0/f);
+}
+
+/* geometry */
+
+void node_geometry(vec3 I, vec3 N, mat4 toworld,
+	out vec3 position, out vec3 normal, out vec3 tangent,
+	out vec3 true_normal, out vec3 incoming, out vec3 parametric,
+	out float backfacing)
+{
+	position = (toworld*vec4(I, 1.0)).xyz;
+	normal = N;
+	tangent = vec3(0.0);
+	true_normal = N;
+	incoming = I;
+	parametric = vec3(0.0);
+	backfacing = 0.0;
+}
+
+void node_tex_coord(vec3 I, vec3 N, mat4 toworld,
+	vec3 attr_orco, vec3 attr_uv,
+	out vec3 generated, out vec3 uv, out vec3 object,
+	out vec3 camera, out vec3 window, out vec3 reflection)
+{
+	generated = attr_orco;
+	uv = attr_uv;
+	object = I;
+	camera = I;
+	window = gl_FragCoord.xyz;
+	reflection = reflect(N, I);
+
+}
+
+/* textures */
+
+void node_tex_blend(vec3 co, out float fac)
+{
+	fac = 1.0;
+}
+
+void node_tex_clouds(vec3 co, float size, out vec4 color, out float fac)
+{
+	color = vec4(1.0);
+	fac = 1.0;
+}
+
+void node_tex_distnoise(vec3 co, float size, float distortion, out float fac)
+{
+	fac = 1.0;
+}
+
+void node_tex_environment(vec3 co, sampler2D ima, out vec4 color)
+{
+	float u = (atan(co.y, co.x) + M_PI)/(2.0*M_PI);
+	float v = atan(co.z, hypot(co.x, co.y))/M_PI + 0.5;
+
+	color = texture2D(ima, vec2(u, v));
+}
+
+void node_tex_image(vec3 co, sampler2D ima, out vec4 color)
+{
+	color = texture2D(ima, co.xy);
+}
+
+void node_tex_magic(vec3 p, float turbulence, float n, out vec4 color)
+{
+	float turb = turbulence/5.0;
+
+	float x = sin((p.x + p.y + p.z)*5.0);
+	float y = cos((-p.x + p.y - p.z)*5.0);
+	float z = -cos((-p.x - p.y + p.z)*5.0);
+
+	if(n > 0.0) {
+		x *= turb;
+		y *= turb;
+		z *= turb;
+		y = -cos(x-y+z);
+		y *= turb;
+
+		if(n > 1.0) {
+			x= cos(x-y-z);
+			x *= turb;
+
+			if(n > 2.0) {
+				z= sin(-x-y-z);
+				z *= turb;
+
+				if(n > 3.0) {
+					x= -cos(-x+y-z);
+					x *= turb;
+
+					if(n > 4.0) {
+						y= -sin(-x+y+z);
+						y *= turb;
+
+						if(n > 5.0) {
+							y= -cos(-x+y+z);
+							y *= turb;
+
+							if(n > 6.0) {
+								x= cos(x+y+z);
+								x *= turb;
+
+								if(n > 7.0) {
+									z= sin(x+y-z);
+									z *= turb;
+
+									if(n > 8.0) {
+										x= -cos(-x-y+z);
+										x *= turb;
+
+										if(n > 9.0) {
+											y= -sin(x-y+z);
+											y *= turb;
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
+	if(turb != 0.0) {
+		turb *= 2.0;
+		x /= turb;
+		y /= turb;
+		z /= turb;
+	}
+
+	color = vec4(0.5 - x, 0.5 - y, 0.5 - z, 1.0);
+}
+
+void node_tex_marble(vec3 co, float size, float turbulence, out float fac)
+{
+	fac = 1.0;
+}
+
+void node_tex_musgrave(vec3 co, float size, float dimension, float lacunarity, float octaves, float offset, float gain, out float fac)
+{
+	fac = 1.0;
+}
+
+void node_tex_noise(vec3 co, out vec4 color, out float fac)
+{
+	color = vec4(1.0);
+	fac = 1.0;
+}
+
+void node_tex_sky(vec3 co, out vec4 color)
+{
+	color = vec4(1.0);
+}
+
+void node_tex_stucci(vec3 co, float size, float turbulence, out float fac)
+{
+	fac = 1.0;
+}
+
+void node_tex_voronoi(vec3 co, float size, float weight1, float weight2, float weight3, float weight4, float exponent, out vec4 color, out float fac)
+{
+	color = vec4(1.0);
+	fac = 1.0;
+}
+
+void node_tex_wood(vec3 co, float size, float turbulence, out float fac)
+{
+	fac = 1.0;
+}
+
+/* light path */
+
+void node_light_path(
+	out float is_camera_ray,
+	out float is_shadow_ray,
+	out float is_diffuse_ray,
+	out float is_glossy_ray,
+	out float is_reflection_ray,
+	out float is_transmission_ray)
+{
+	is_camera_ray = 1.0;
+	is_shadow_ray = 0.0;
+	is_diffuse_ray = 0.0;
+	is_glossy_ray = 0.0;
+	is_reflection_ray = 0.0;
+	is_transmission_ray = 0.0;
+}
+
+/* output */
+
+void node_output_material(vec4 surface, vec4 volume, float displacement, out vec4 result)
+{
+	result = surface * M_PI;
+}
+

Modified: branches/cycles/source/blender/gpu/intern/gpu_shader_material.glsl.c
===================================================================
--- branches/cycles/source/blender/gpu/intern/gpu_shader_material.glsl.c	2011-06-10 13:06:51 UTC (rev 37368)
+++ branches/cycles/source/blender/gpu/intern/gpu_shader_material.glsl.c	2011-06-10 13:22:55 UTC (rev 37369)
@@ -1,1232 +1,1428 @@
 /* DataToC output of file <gpu_shader_material_glsl> */
 
-int datatoc_gpu_shader_material_glsl_size= 39207;
+int datatoc_gpu_shader_material_glsl_size= 45475;
 char datatoc_gpu_shader_material_glsl[]= {
- 10,102,108,111, 97,116, 32,
-101,120,112, 95, 98,108,101,110,100,101,114, 40,102,108,111, 97,116, 32,102, 41, 10,123, 10,  9,114,101,116,117,114,110, 32,112,
-111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32,102, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114,103,
- 98, 95,116,111, 95,104,115,118, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,
-111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32, 99,109, 97,120, 44, 32, 99,109,105,110, 44, 32,104, 44, 32,115, 44, 32,118,
- 44, 32, 99,100,101,108,116, 97, 59, 10,  9,118,101, 99, 51, 32, 99, 59, 10, 10,  9, 99,109, 97,120, 32, 61, 32,109, 97,120, 40,

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list