From 2336be02e4e124c09414068a6b28485c13d502b9 Mon Sep 17 00:00:00 2001 From: Ian Wilkes Date: Fri, 2 Sep 2016 11:41:18 -0700 Subject: [PATCH] Added Phong refelction to the TinyRenderer Shader. --- examples/TinyRenderer/TinyRenderer.cpp | 40 ++++++++++++++------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/examples/TinyRenderer/TinyRenderer.cpp b/examples/TinyRenderer/TinyRenderer.cpp index 5e3ef4f67..499aca098 100644 --- a/examples/TinyRenderer/TinyRenderer.cpp +++ b/examples/TinyRenderer/TinyRenderer.cpp @@ -43,26 +43,22 @@ struct Shader : public IShader { { m_invModelMat = m_modelMat.invert_transpose(); } - + virtual Vec4f vertex(int iface, int nthvert) { - - Vec2f uv = m_model->uv(iface, nthvert); - //printf("uv = %f,%f\n", uv.x,uv.y); + Vec2f uv = m_model->uv(iface, nthvert); varying_uv.set_col(nthvert, uv); - //varying_nrm.set_col(nthvert, proj<3>((m_projectionMatrix*m_modelView).invert_transpose()*embed<4>(m_model->normal(iface, nthvert), 0.f))); varying_nrm.set_col(nthvert, proj<3>(m_invModelMat*embed<4>(m_model->normal(iface, nthvert), 0.f))); - //m_localNormal = m_model->normal(iface, nthvert); - //varying_nrm.set_col(nthvert, m_model->normal(iface, nthvert)); - - Vec3f unScaledVert = m_model->vert(iface, nthvert); - - Vec3f scaledVert=Vec3f(unScaledVert[0]*m_localScaling[0],unScaledVert[1]*m_localScaling[1],unScaledVert[2]*m_localScaling[2]); - - Vec4f gl_Vertex = m_projectionMatrix*m_modelView1*embed<4>(scaledVert); - + //m_localNormal = m_model->normal(iface, nthvert); + //varying_nrm.set_col(nthvert, m_model->normal(iface, nthvert)); + Vec3f unScaledVert = m_model->vert(iface, nthvert); + + Vec3f scaledVert=Vec3f(unScaledVert[0]*m_localScaling[0], + unScaledVert[1]*m_localScaling[1], + unScaledVert[2]*m_localScaling[2]); + + Vec4f gl_Vertex = m_projectionMatrix*m_modelView1*embed<4>(scaledVert); varying_tri.set_col(nthvert, gl_Vertex); - //ndc_tri.set_col(nthvert, proj<3>(gl_Vertex/gl_Vertex[3])); return gl_Vertex; } @@ -70,9 +66,17 @@ struct Shader : public IShader { Vec3f bn = (varying_nrm*bar).normalize(); Vec2f uv = varying_uv*bar; - float ambient = 0.7; - float intensity = ambient + (1-ambient)*b3Min(b3Max(bn*m_light_dir_local, -1.f), 1.f); - color = m_model->diffuse(uv)*intensity; + Vec3f reflection_direction = (bn * (bn * m_light_dir_local * 2.f) - m_light_dir_local).normalize(); + float specular = pow(b3Max(reflection_direction.z, 0.f), m_model->specular(uv)); + float diffuse = b3Max(0.f, bn * m_light_dir_local); + + float ambient_coefficient = 0.6; + float diffuse_coefficient = 0.35; + float specular_coefficient = 0.05; + + float intensity = ambient_coefficient + b3Min(diffuse * diffuse_coefficient + specular * specular_coefficient, 1.0f - ambient_coefficient); + + color = m_model->diffuse(uv) * intensity; //warning: bgra color is swapped to rgba to upload texture color.bgra[0] *= m_colorRGBA[0];