From a5262a9504d0ad264d93e1761f5a4123e524cc87 Mon Sep 17 00:00:00 2001 From: Tomasz Kramkowski Date: Fri, 19 Oct 2018 23:42:59 +0300 Subject: Implement specular mapping --- faqe.c | 3 ++- mtl.c | 33 +++++++++++++++++++++++---------- shaders/data.h | 3 ++- shaders/main/frag.glsl | 11 ++++++----- 4 files changed, 33 insertions(+), 17 deletions(-) diff --git a/faqe.c b/faqe.c index afb8bb4..975fffb 100644 --- a/faqe.c +++ b/faqe.c @@ -87,7 +87,8 @@ int main(int argc, char **argv) gl_prog_use(prog.main.prog); viewport(prog.main.uni.proj, WIDTH, HEIGHT); - gl_uni_set1i(prog.main.tex.tex, 0); + gl_uni_set1i(prog.main.tex.tdiff, 0); + gl_uni_set1i(prog.main.tex.tspec, 1); gl_enable(GL_DEPTH_TEST); gl_enable(GL_FRAMEBUFFER_SRGB); diff --git a/mtl.c b/mtl.c index 3b46ce7..dc74e01 100644 --- a/mtl.c +++ b/mtl.c @@ -13,19 +13,34 @@ struct mtl { char name[50]; - GLuint diffuse; + GLuint diff; + GLuint spec; }; static struct mtl *mtls; static int lmtls; static size_t nmtls; -int mtl_load(char *name) +GLuint tex_file(const char *name, const char *type) { - struct mtl *m; char loc[100]; + GLuint ret; FILE *f; + snprintf(loc, sizeof loc, "assets/%s.%s.png", name, type); + f = fopen(loc, "rb"); + if (f == NULL) + eprintf("Could not open '%s':", loc); + ret = png2tex(f); + fclose(f); + + return ret; +} + +int mtl_load(char *name) +{ + struct mtl *m; + for (int i = 0; i < lmtls; i++) if (strcmp(mtls[i].name, name) == 0) return i; @@ -35,12 +50,8 @@ int mtl_load(char *name) snprintf(m->name, sizeof m->name, "%s", name); - snprintf(loc, sizeof loc, "assets/%s.diff.png", name); - f = fopen(loc, "rb"); - if (f == NULL) - eprintf("Could not open '%s':", loc); - m->diffuse = png2tex(f); - fclose(f); + m->diff = tex_file(name, "diff"); + m->spec = tex_file(name, "spec"); return lmtls++; } @@ -54,5 +65,7 @@ void mtl_use(int mtl) return; gl_tex_active(GL_TEXTURE0); - gl_tex_bind(GL_TEXTURE_2D, mtls[mtl].diffuse); + gl_tex_bind(GL_TEXTURE_2D, mtls[mtl].diff); + gl_tex_active(GL_TEXTURE1); + gl_tex_bind(GL_TEXTURE_2D, mtls[mtl].spec); } diff --git a/shaders/data.h b/shaders/data.h index e1a71c3..0225212 100644 --- a/shaders/data.h +++ b/shaders/data.h @@ -24,7 +24,8 @@ #undef SH_UNI #endif // SH_UNI #ifdef SH_TEX - SH_TEX(2D, tex) + SH_TEX(2D, tdiff) + SH_TEX(2D, tspec) #undef SH_TEX #endif // SH_TEX #ifdef SH_OUT diff --git a/shaders/main/frag.glsl b/shaders/main/frag.glsl index 6d7a53e..8aa9a6a 100644 --- a/shaders/main/frag.glsl +++ b/shaders/main/frag.glsl @@ -9,20 +9,21 @@ in vec3 lipos; void main() { - vec3 objco = vec3(texture(tex, fuv)); + vec3 fdiff = vec3(texture(tdiff, fuv)); + vec3 fspec = vec3(texture(tspec, fuv)); vec3 lico = vec3(1.0, 1.0, 1.0); vec3 amb = vec3(0.1, 0.1, 0.1); vec3 norm = normalize(fnorm); vec3 lidir = normalize(lipos - fpos); - vec3 dif = max(dot(norm, lidir), 0.0) * objco; + vec3 diff = max(dot(norm, lidir), 0.0) * fdiff; - float speen = max(sign(dot(lidir, norm)), 0.0); + float specen = max(sign(dot(lidir, norm)), 0.0); vec3 vwdir = normalize(-fpos); vec3 mid = normalize(lidir + vwdir); - float spe = pow(max(dot(norm, mid), 0.0), 256) * speen; + vec3 spec = pow(max(dot(norm, mid), 0.0), 256) * specen * fspec; - color = vec4((amb + dif + spe) * lico, 1.0); + color = vec4((amb + diff + spec) * lico, 1.0); } -- cgit v1.2.3-54-g00ecf