aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomasz Kramkowski <tk@the-tk.com>2018-10-19 23:42:59 +0300
committerTomasz Kramkowski <tk@the-tk.com>2018-10-19 23:42:59 +0300
commita5262a9504d0ad264d93e1761f5a4123e524cc87 (patch)
tree28b147973149f860007f8ef78e5f9af890ea3e33
parent63a4ed57bae7a7ff8c497380cd3353badea15806 (diff)
downloadfaqe-a5262a9504d0ad264d93e1761f5a4123e524cc87.tar.gz
faqe-a5262a9504d0ad264d93e1761f5a4123e524cc87.tar.xz
faqe-a5262a9504d0ad264d93e1761f5a4123e524cc87.zip
Implement specular mapping
-rw-r--r--faqe.c3
-rw-r--r--mtl.c33
-rw-r--r--shaders/data.h3
-rw-r--r--shaders/main/frag.glsl11
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);
}