OpenSubdiv: Support shadeless shading

This commit is contained in:
Sergey Sharybin 2016-07-25 15:38:28 +02:00
parent c967a381fa
commit 988ec3c40c
2 changed files with 66 additions and 20 deletions

@ -242,6 +242,7 @@ void main()
vec3 L_diffuse = vec3(0.0); vec3 L_diffuse = vec3(0.0);
vec3 L_specular = vec3(0.0); vec3 L_specular = vec3(0.0);
#ifdef USE_LIGHTING
#ifndef USE_COLOR_MATERIAL #ifndef USE_COLOR_MATERIAL
/* Assume NUM_SOLID_LIGHTS directional lights. */ /* Assume NUM_SOLID_LIGHTS directional lights. */
for (int i = 0; i < NUM_SOLID_LIGHTS; i++) { for (int i = 0; i < NUM_SOLID_LIGHTS; i++) {
@ -312,6 +313,9 @@ void main()
L_specular += light_specular * specular_bsdf * intensity; L_specular += light_specular * specular_bsdf * intensity;
} }
#endif /* USE_COLOR_MATERIAL */ #endif /* USE_COLOR_MATERIAL */
#else /* USE_LIGHTING */
L_diffuse = vec3(1.0);
#endif
/* Compute diffuse color. */ /* Compute diffuse color. */
#ifdef USE_TEXTURE_2D #ifdef USE_TEXTURE_2D

@ -100,6 +100,12 @@ static GLuint g_flat_fill_solid_program = 0;
static GLuint g_flat_fill_texture2d_program = 0; static GLuint g_flat_fill_texture2d_program = 0;
static GLuint g_smooth_fill_solid_program = 0; static GLuint g_smooth_fill_solid_program = 0;
static GLuint g_smooth_fill_texture2d_program = 0; static GLuint g_smooth_fill_texture2d_program = 0;
static GLuint g_flat_fill_solid_shadeless_program = 0;
static GLuint g_flat_fill_texture2d_shadeless_program = 0;
static GLuint g_smooth_fill_solid_shadeless_program = 0;
static GLuint g_smooth_fill_texture2d_shadeless_program = 0;
static GLuint g_wireframe_program = 0; static GLuint g_wireframe_program = 0;
static GLuint g_lighting_ub = 0; static GLuint g_lighting_ub = 0;
@ -425,21 +431,45 @@ bool openSubdiv_osdGLDisplayInit(void)
g_flat_fill_solid_program = linkProgram( g_flat_fill_solid_program = linkProgram(
version, version,
"#define USE_COLOR_MATERIAL\n" "#define USE_COLOR_MATERIAL\n"
"#define USE_LIGHTING\n"
"#define FLAT_SHADING\n"); "#define FLAT_SHADING\n");
g_flat_fill_texture2d_program = linkProgram( g_flat_fill_texture2d_program = linkProgram(
version, version,
"#define USE_COLOR_MATERIAL\n" "#define USE_COLOR_MATERIAL\n"
"#define USE_LIGHTING\n"
"#define USE_TEXTURE_2D\n" "#define USE_TEXTURE_2D\n"
"#define FLAT_SHADING\n"); "#define FLAT_SHADING\n");
g_smooth_fill_solid_program = linkProgram( g_smooth_fill_solid_program = linkProgram(
version, version,
"#define USE_COLOR_MATERIAL\n" "#define USE_COLOR_MATERIAL\n"
"#define USE_LIGHTING\n"
"#define SMOOTH_SHADING\n"); "#define SMOOTH_SHADING\n");
g_smooth_fill_texture2d_program = linkProgram( g_smooth_fill_texture2d_program = linkProgram(
version, version,
"#define USE_COLOR_MATERIAL\n" "#define USE_COLOR_MATERIAL\n"
"#define USE_LIGHTING\n"
"#define USE_TEXTURE_2D\n" "#define USE_TEXTURE_2D\n"
"#define SMOOTH_SHADING\n"); "#define SMOOTH_SHADING\n");
g_flat_fill_solid_shadeless_program = linkProgram(
version,
"#define USE_COLOR_MATERIAL\n"
"#define FLAT_SHADING\n");
g_flat_fill_texture2d_shadeless_program = linkProgram(
version,
"#define USE_COLOR_MATERIAL\n"
"#define USE_TEXTURE_2D\n"
"#define FLAT_SHADING\n");
g_smooth_fill_solid_shadeless_program = linkProgram(
version,
"#define USE_COLOR_MATERIAL\n"
"#define SMOOTH_SHADING\n");
g_smooth_fill_texture2d_shadeless_program = linkProgram(
version,
"#define USE_COLOR_MATERIAL\n"
"#define USE_TEXTURE_2D\n"
"#define SMOOTH_SHADING\n");
g_wireframe_program = linkProgram( g_wireframe_program = linkProgram(
version, version,
"#define WIREFRAME\n"); "#define WIREFRAME\n");
@ -464,21 +494,24 @@ void openSubdiv_osdGLDisplayDeinit(void)
if (g_lighting_ub != 0) { if (g_lighting_ub != 0) {
glDeleteBuffers(1, &g_lighting_ub); glDeleteBuffers(1, &g_lighting_ub);
} }
if (g_flat_fill_solid_program) { #define SAFE_DELETE_PROGRAM(program) \
glDeleteProgram(g_flat_fill_solid_program); do { \
} if (program) { \
if (g_flat_fill_texture2d_program) { glDeleteProgram(program); \
glDeleteProgram(g_flat_fill_texture2d_program); } \
} } while (false)
if (g_smooth_fill_solid_program) {
glDeleteProgram(g_flat_fill_solid_program); SAFE_DELETE_PROGRAM(g_flat_fill_solid_program);
} SAFE_DELETE_PROGRAM(g_flat_fill_texture2d_program);
if (g_smooth_fill_texture2d_program) { SAFE_DELETE_PROGRAM(g_smooth_fill_solid_program);
glDeleteProgram(g_smooth_fill_texture2d_program); SAFE_DELETE_PROGRAM(g_smooth_fill_texture2d_program);
} SAFE_DELETE_PROGRAM(g_flat_fill_solid_shadeless_program);
if (g_wireframe_program) { SAFE_DELETE_PROGRAM(g_flat_fill_texture2d_shadeless_program);
glDeleteProgram(g_wireframe_program); SAFE_DELETE_PROGRAM(g_smooth_fill_solid_shadeless_program);
} SAFE_DELETE_PROGRAM(g_smooth_fill_texture2d_shadeless_program);
SAFE_DELETE_PROGRAM(g_wireframe_program);
#undef SAFE_DELETE_PROGRAM
} }
void openSubdiv_osdGLMeshDisplayPrepare(int use_osd_glsl, void openSubdiv_osdGLMeshDisplayPrepare(int use_osd_glsl,
@ -599,23 +632,32 @@ static GLuint prepare_patchDraw(OpenSubdiv_GLMesh *gl_mesh,
if (fill_quads) { if (fill_quads) {
int model; int model;
GLboolean use_texture_2d; GLboolean use_texture_2d, use_lighting;
glGetIntegerv(GL_SHADE_MODEL, &model); glGetIntegerv(GL_SHADE_MODEL, &model);
glGetBooleanv(GL_TEXTURE_2D, &use_texture_2d); glGetBooleanv(GL_TEXTURE_2D, &use_texture_2d);
glGetBooleanv(GL_LIGHTING, &use_lighting);
if (model == GL_FLAT) { if (model == GL_FLAT) {
if (use_texture_2d) { if (use_texture_2d) {
program = g_flat_fill_texture2d_program; program = use_lighting
? g_flat_fill_texture2d_program
: g_flat_fill_texture2d_shadeless_program;
} }
else { else {
program = g_flat_fill_solid_program; program = use_lighting
? g_flat_fill_solid_program
: g_flat_fill_solid_shadeless_program;
} }
} }
else { else {
if (use_texture_2d) { if (use_texture_2d) {
program = g_smooth_fill_texture2d_program; program = use_lighting
? g_smooth_fill_texture2d_program
: g_smooth_fill_texture2d_shadeless_program;
} }
else { else {
program = g_smooth_fill_solid_program; program = use_lighting
? g_smooth_fill_solid_program
: g_smooth_fill_solid_shadeless_program;
} }
} }
} }