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

View File

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

View File

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