[Bf-blender-cvs] [d22435f] opensubdiv-modifier: Make OpenSubdiv working on a low-end video cards

Sergey Sharybin noreply at git.blender.org
Wed Jul 2 19:46:55 CEST 2014


Commit: d22435f5e4489e186b868954d80bec2abe95f12c
Author: Sergey Sharybin
Date:   Wed Jul 2 19:06:27 2014 +0600
https://developer.blender.org/rBd22435f5e4489e186b868954d80bec2abe95f12c

Make OpenSubdiv working on a low-end video cards

This commit changes the way how mesh is being displayed when
using OpenSubdiv backend. It does no longer use neither effect
factories nor fragment shaders in order to make all the shaders
compatible with at least GLSL 1.3 compatible cards.

In fact, seems the shaders now goes down to GLSL 1.1 even.

Apart from this now the first material from the material stack
is used for colors.

Still requires our own OpenSubdiv branch:
  https://github.com/Nazg-Gul/OpenSubdiv/tree/cuda-dynload

(it actually needs updated version of this branch)

===================================================================

M	intern/opensubdiv/gpu_shader_opensubd_display.glsl
M	intern/opensubdiv/opensubdiv_capi.cc
M	intern/opensubdiv/opensubdiv_gpu_capi.cc
M	source/blender/blenkernel/intern/subsurf_ccg.c

===================================================================

diff --git a/intern/opensubdiv/gpu_shader_opensubd_display.glsl b/intern/opensubdiv/gpu_shader_opensubd_display.glsl
index b71a113..a57e2a1 100644
--- a/intern/opensubdiv/gpu_shader_opensubd_display.glsl
+++ b/intern/opensubdiv/gpu_shader_opensubd_display.glsl
@@ -1,213 +1,102 @@
-//
-//   Copyright 2013 Pixar
-//
-//   Licensed under the Apache License, Version 2.0 (the "Apache License")
-//   with the following modification; you may not use this file except in
-//   compliance with the Apache License and the following modification to it:
-//   Section 6. Trademarks. is deleted and replaced with:
-//
-//   6. Trademarks. This License does not grant permission to use the trade
-//      names, trademarks, service marks, or product names of the Licensor
-//      and its affiliates, except as required to comply with Section 4(c) of
-//      the License and to reproduce the content of the NOTICE file.
-//
-//   You may obtain a copy of the Apache License at
-//
-//       http://www.apache.org/licenses/LICENSE-2.0
-//
-//   Unless required by applicable law or agreed to in writing, software
-//   distributed under the Apache License with the above modification is
-//   distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-//   KIND, either express or implied. See the Apache License for the specific
-//   language governing permissions and limitations under the Apache License.
-//
-
-//#version 330
-
-//--------------------------------------------------------------
-// Vertex Shader
-//--------------------------------------------------------------
-#ifdef VERTEX_SHADER
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2014 Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): Sergey Sharybin
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/* ***** Vertex shader ***** */
 
-layout (location=0) in vec3 position;
-layout (location=1) in vec3 normal;
+#ifdef VERTEX_SHADER
 
-out vec3 vPosition;
-out vec3 vNormal;
-out vec4 vColor;
+varying vec3 varying_normal;
+varying vec3 varying_position;
 
 void main()
 {
-    vPosition = position;
-    vNormal = normal;
-    vColor = vec4(1, 1, 1, 1);
-}
-
-#endif
-
-//--------------------------------------------------------------
-// Geometry Shader
-//--------------------------------------------------------------
-#ifdef GEOMETRY_SHADER
-
-#ifdef PRIM_QUAD
-
-layout(lines_adjacency) in;
-
-#ifdef GEOMETRY_OUT_FILL
-layout(triangle_strip, max_vertices = 4) out;
-#endif
-
-#ifdef GEOMETRY_OUT_LINE
-layout(line_strip, max_vertices = 5) out;
-#endif
-
-in vec3 vPosition[4];
-in vec3 vNormal[4];
-
-#else // PRIM_TRI
-
-layout(triangles) in;
-
-#ifdef GEOMETRY_OUT_FILL
-layout(triangle_strip, max_vertices = 3) out;
-#endif
-
-#ifdef GEOMETRY_OUT_LINE
-layout(line_strip, max_vertices = 4) out;
-#endif
-
-in vec3 vPosition[3];
-in vec3 vNormal[3];
-
-#endif // PRIM_TRI/QUAD
-
-
-uniform mat4 objectToClipMatrix;
-uniform mat4 objectToEyeMatrix;
+	vec4 co = gl_ModelViewMatrix * gl_Vertex;
 
-flat out vec3 gFacetNormal;
-out vec3 Peye;
-out vec3 Neye;
-out vec4 Cout;
+	varying_normal = normalize(gl_NormalMatrix * gl_Normal);
+	varying_position = co.xyz;
 
-void emit(int index)
-{
-    Peye = vPosition[index];
-    gl_Position = objectToClipMatrix * vec4(vPosition[index], 1);
-    Neye = (objectToEyeMatrix * vec4(vNormal[index], 0)).xyz;
-    EmitVertex();
-}
+	gl_Position = gl_ProjectionMatrix * co;
 
-void main()
-{
-    gl_PrimitiveID = gl_PrimitiveIDIn;
-    
-#ifdef PRIM_QUAD
-#ifdef GEOMETRY_OUT_FILL
-    vec3 A = vPosition[0] - vPosition[1];
-    vec3 B = vPosition[3] - vPosition[1];
-    vec3 C = vPosition[2] - vPosition[1];
-
-    gFacetNormal = (objectToEyeMatrix*vec4(normalize(cross(B, A)), 0)).xyz;
-    emit(0);
-    emit(1);
-    emit(3);
-//    gFacetNormal = (objectToEyeMatrix*vec4(normalize(cross(C, B)), 0)).xyz;
-    emit(2);
-#else  // GEOMETRY_OUT_LINE
-    emit(0);
-    emit(1);
-    emit(2);
-    emit(3);
-    emit(0);
+#ifdef GPU_NVIDIA
+	/* Setting gl_ClipVertex is necessary to get glClipPlane working on NVIDIA
+	 * graphic cards, while on ATI it can cause a software fallback.
+	 */
+	gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
 #endif
-#endif // PRIM_QUAD
-
-#ifdef PRIM_TRI
-    vec3 A = vPosition[1] - vPosition[0];
-    vec3 B = vPosition[2] - vPosition[0];
-    gFacetNormal = (objectToEyeMatrix*vec4(normalize(cross(B, A)), 0)).xyz;
-
-    emit(0);
-    emit(1);
-    emit(2);
-#ifdef GEOMETRY_OUT_LINE
-    emit(0);
-#endif //GEOMETRY_OUT_LINE
-#endif // PRIM_TRI
-
-    EndPrimitive();
 }
 
-#endif
+#endif  /* VERTEX_SHADER */
 
-//--------------------------------------------------------------
-// Fragment Shader
-//--------------------------------------------------------------
+/* ***** Fragment shader ***** */
 #ifdef FRAGMENT_SHADER
 
-layout (location=0) out vec4 FragColor;
-flat in vec3 gFacetNormal;
-in vec3 Neye;
-in vec3 Peye;
-in vec4 Cout;
-
-#define NUM_LIGHTS 2
-
-struct LightSource {
-    vec4 position;
-    vec4 ambient;
-    vec4 diffuse;
-    vec4 specular;
-};
-
-uniform LightSource lightSource[NUM_LIGHTS];
-
-vec4
-lighting(vec3 Peye, vec3 Neye)
-{
-    vec4 color = vec4(0);
-    vec4 material = vec4(0.4, 0.4, 0.8, 1);
-
-    for (int i = 0; i < NUM_LIGHTS; ++i) {
-
-        vec4 Plight = lightSource[i].position;
+#define NUM_SOLID_LIGHTS 3
 
-        vec3 l = (Plight.w == 0.0)
-                    ? normalize(Plight.xyz) : normalize(Plight.xyz - Peye);
+varying vec3 varying_normal;
+varying vec3 varying_position;
+varying vec4 varying_vertex_color;
 
-        vec3 n = normalize(Neye);
-        vec3 h = normalize(l + vec3(0,0,1));    // directional viewer
-
-        float d = max(0.0, dot(n, l));
-        float s = pow(max(0.0, dot(n, h)), 500.0f);
-
-        color += lightSource[i].ambient * material
-            + d * lightSource[i].diffuse * material
-            + s * lightSource[i].specular;
-    }
-
-    color.a = 1;
-    return color;
-}
-
-#ifdef GEOMETRY_OUT_LINE
-uniform vec4 fragColor;
-void
-main()
-{
-    FragColor = fragColor;
-}
-
-#else
-
-void
-main()
+void main()
 {
-    vec3 N = (gl_FrontFacing ? gFacetNormal : -gFacetNormal);
-    FragColor = lighting(Peye, N);
+	/* Compute normal. */
+	vec3 N = normalize(cross(dFdx(varying_position),
+	                         dFdy(varying_position)));
+
+	/* Compute diffuse and specular lighting. */
+	vec3 L_diffuse = vec3(0.0);
+	vec3 L_specular = vec3(0.0);
+
+	/* Assume NUM_SOLID_LIGHTS directional lights. */
+	for (int i = 0; i < NUM_SOLID_LIGHTS; i++) {
+		vec3 light_direction = gl_LightSource[i].position.xyz;
+
+		/* Diffuse light. */
+		vec3 light_diffuse = gl_LightSource[i].diffuse.rgb;
+		float diffuse_bsdf = max(dot(N, light_direction), 0.0);
+		L_diffuse += light_diffuse*diffuse_bsdf;
+
+		/* Specular light. */
+		vec3 light_specular = gl_LightSource[i].specular.rgb;
+		vec3 H = gl_LightSource[i].halfVector.xyz;
+
+		float specular_bsdf = pow(max(dot(N, H), 0.0),
+		                          gl_FrontMaterial.shininess);
+		L_specular += light_specular*specular_bsdf;
+	}
+
+	/* Compute diffuse color. */
+	float alpha;
+	L_diffuse *= gl_FrontMaterial.diffuse.rgb;
+	alpha = gl_FrontMaterial.diffuse.a;
+
+	/* Sum lighting. */
+	vec3 L = gl_FrontLightModelProduct.sceneColor.rgb + L_diffuse;
+	L += L_specular*gl_FrontMaterial.specular.rgb;
+
+	/* Write out fragment color. */
+	gl_FragColor = vec4(L, alpha);
 }
-#endif // GEOMETRY_OUT_LINE
 
-#endif
+#endif  // FRAGMENT_SHADER
diff --git a/intern/opensubdiv/opensubdiv_capi.cc b/intern/opensubdiv/opensubdiv_capi.cc
index e9db997..1ae9e75 100644
--- a/intern/opensubdiv/opensubdiv_capi.cc
+++ b/intern/opensubdiv/opensubdiv_capi.cc
@@ -30,6 +30,8 @@
 #  include "iso646.h"
 #endif
 
+#include <GL/glew.h>
+
 #include <opensubdiv/osd/glMesh.h>
 #include <opensubdiv/osd/glDrawRegistry.h>
 #include <opensubdiv/osdutil/evaluator_capi.h>
@@ -434,7 +436,9 @@ int openSubdiv_getAvailableControllers(void)
 #endif
 
 #ifdef OPENSUBDIV_HAS_GLSL_TRANSFORM_FEEDBACK
-	flags |= OPENSUBDIV_CONTROLLER_GLSL_TRANSFORM_FEEDBACK;
+	if (GLEW_ARB_texture_buffer_object) {
+		flags |= OPENSUBDIV_CONTROLLER_GLSL_TRANSFORM_FEEDBACK;
+	}
 #endif
 
 #ifdef OPENSUBDIV_HAS_GLSL_COMPUTE
@@ -472,8 +476,10 @@ void openSubdiv_cleanup(void)
 #endif
 
 #ifdef OPENSUBDIV_HAS_GLSL_TRANSFORM_FEEDBACK
-	DELETE_DESCRIPTOR(g_glslTransformFeedbackComputeController,
-	                  OsdGLSLTransformFeedbackComputeController);
+	if (GLEW_ARB_texture_buffer_object) {
+		DELETE_DESCRIPTOR(g_glslTransformFeedbackComputeController,
+		                  OsdGLSLTransformFeedbackComputeController);
+	}
 #endif
 
 #ifdef OPENSUBDIV_HAS_GLSL_COMPUTE
diff --git a/intern/opensubdiv/opensubdiv_gpu_capi.cc b/intern/opensubdiv/opensubdiv_gpu_capi.cc
index d52b619..3a409c0 100644
--- a/intern/opensubdiv/opensubdiv_gpu_capi.cc
+++ b/intern/opensubdiv/opensubdiv_gpu_capi.cc
@@ -36,89 +36,31 @@
 #endif
 
 #include <GL/glew.h>
-#include <vector>
 
 #include <opensubdiv/osd/glMesh.h>
 
 #ifdef OPENSUBDIV_HAS_CUDA
 #  include <opensubdiv/osd/cudaGLVertexBuffer.h>
 #endif
-#include <opensubdiv/osd/glDrawRegistry.h>
 
-// **************** Types declaration ****************
-
-using OpenSubdiv::OsdDrawContext;
-using OpenSubdiv::OsdGLDrawRegistry;
 using OpenSubdiv::OsdGLMeshInterface;
 
-static struct Transform {
-	float ModelViewMatrix[16];
-	float ProjectionMatrix[16];
-	float ModelViewProjectionMatrix[16];
-} g_transformData;
-
 extern "C" char d

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list