From: Gerardo H. <ma...@us...> - 2006-12-29 20:28:35
|
Update of /cvsroot/jrman/drafts/src In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv8533/src Modified Files: SurfaceHair.java Log Message: Simple hair shader seems to work OK. Index: SurfaceHair.java =================================================================== RCS file: /cvsroot/jrman/drafts/src/SurfaceHair.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** SurfaceHair.java 29 Dec 2006 19:45:30 -0000 1.1 --- SurfaceHair.java 29 Dec 2006 20:28:32 -0000 1.2 *************** *** 2,5 **** --- 2,6 ---- SurfaceHair.java Copyright (C) 2006 Gerardo Horvilleur Martinez + Based on hair shader from sig98.course11.pdf This program is free software; you can redistribute it and/or *************** *** 29,41 **** import org.jrman.parameters.UniformScalarTuple3f; import org.jrman.render.ShaderVariables; import org.jrman.shaders.SurfaceShader; public class SurfaceHair extends SurfaceShader { ! private static Vector3fGrid vg1 = new Vector3fGrid(); ! private static Vector3fGrid vg2 = new Vector3fGrid(); ! private static Vector3fGrid vg3 = new Vector3fGrid(); private static Color3fGrid cg1 = new Color3fGrid(); --- 30,43 ---- import org.jrman.parameters.UniformScalarTuple3f; import org.jrman.render.ShaderVariables; + import org.jrman.shaders.LightShader; import org.jrman.shaders.SurfaceShader; public class SurfaceHair extends SurfaceShader { ! private final static Color3f BLACK = new Color3f(); ! private static Vector3fGrid T = new Vector3fGrid(); ! private static Vector3fGrid V = new Vector3fGrid(); private static Color3fGrid cg1 = new Color3fGrid(); *************** *** 47,53 **** private static Color3fGrid cg4 = new Color3fGrid(); ! private static FloatGrid fg = new FloatGrid(); ! private static FloatGrid fg1 = new FloatGrid(); private static Color3f specularcolor = new Color3f(); --- 49,55 ---- private static Color3fGrid cg4 = new Color3fGrid(); ! private static Color3fGrid Cspec = new Color3fGrid(); ! private static Color3fGrid Cdiff = new Color3fGrid(); private static Color3f specularcolor = new Color3f(); *************** *** 57,61 **** private static Color3f tipcolor = new Color3f(); ! private static Vector3f surface_normal = new Vector3f(); protected void initDefaults() { --- 59,65 ---- private static Color3f tipcolor = new Color3f(); ! private static Statement lightStmt = new Lighting(); ! ! private static float roughness; protected void initDefaults() { *************** *** 64,80 **** defaultParameters.addParameter( new UniformScalarFloat(new Declaration("Kd", "uniform float"), ! .3f)); defaultParameters.addParameter( new UniformScalarFloat(new Declaration("Ks", "uniform float"), ! .01f)); defaultParameters.addParameter( new UniformScalarFloat(new Declaration("roughness", ! "uniform float"), 10f)); defaultParameters.addParameter( new UniformScalarTuple3f( new Declaration("specularcolor", "uniform color"), 1f, ! 1f, ! 1f)); defaultParameters.addParameter( new UniformScalarTuple3f( --- 68,84 ---- defaultParameters.addParameter( new UniformScalarFloat(new Declaration("Kd", "uniform float"), ! .6f)); defaultParameters.addParameter( new UniformScalarFloat(new Declaration("Ks", "uniform float"), ! .35f)); defaultParameters.addParameter( new UniformScalarFloat(new Declaration("roughness", ! "uniform float"), .15f)); defaultParameters.addParameter( new UniformScalarTuple3f( new Declaration("specularcolor", "uniform color"), 1f, ! .9f, ! .5f)); defaultParameters.addParameter( new UniformScalarTuple3f( *************** *** 89,98 **** .8f, 0f)); - defaultParameters.addParameter( - new UniformScalarTuple3f( - new Declaration("surface_normal", "uniform vector"), - 0f, - 0f, - 1f)); } --- 93,96 ---- *************** *** 110,114 **** UniformScalarFloat paramRoughness = (UniformScalarFloat) getParameter(sv, "roughness"); ! final float roughness = paramRoughness.getValue(); UniformScalarTuple3f paramSpecularcolor = (UniformScalarTuple3f) getParameter(sv, "specularcolor"); --- 108,112 ---- UniformScalarFloat paramRoughness = (UniformScalarFloat) getParameter(sv, "roughness"); ! roughness = paramRoughness.getValue(); UniformScalarTuple3f paramSpecularcolor = (UniformScalarTuple3f) getParameter(sv, "specularcolor"); *************** *** 120,152 **** (UniformScalarTuple3f) getParameter(sv, "tipcolor"); paramTipcolor.getValue(tipcolor); - UniformScalarTuple3f paramSurface_normal = - (UniformScalarTuple3f) getParameter(sv, "surface_normal"); - paramSurface_normal.getValue(surface_normal); ! surface_normal.normalize(); ! vg3.set(surface_normal); ! vg2.normalize(sv.dPdv); ! vg1.cross(vg3, vg2); ! vg1.cross(vg2, vg1); ! fg1.dot(vg3, vg1); ! fg1.abs(fg1); ! vg1.mix(vg1, vg3, fg1); ! vg1.faceforward(vg1, sv.I); ! vg1.normalize(vg1); ! vg2.normalize(sv.I); ! vg2.negate(vg2); sv.Oi.set(sv.Os); ambient(sv, cg1); cg3.set(Ka); cg1.mul(cg1, cg3); ! diffuse(sv, vg1, cg2); ! cg3.set(Kd); ! cg2.mul(cg2, cg3); cg1.add(cg1, cg2); cg4.mix(rootcolor, tipcolor, sv.v); cg1.mul(cg1, cg4); - specular(sv, vg1, vg2, roughness, cg2); cg3.set(Ks); ! cg2.mul(cg2, cg3); cg3.set(specularcolor); cg2.mul(cg2, cg3); --- 118,139 ---- (UniformScalarTuple3f) getParameter(sv, "tipcolor"); paramTipcolor.getValue(tipcolor); ! T.normalize(sv.dPdv); ! V.normalize(sv.I); ! V.negate(V); ! Cspec.set(BLACK); ! Cdiff.set(BLACK); ! illuminance(sv, null, sv.P, null, 0f, lightStmt); sv.Oi.set(sv.Os); ambient(sv, cg1); cg3.set(Ka); cg1.mul(cg1, cg3); ! cg2.set(Kd); ! cg2.mul(Cdiff, cg2); cg1.add(cg1, cg2); cg4.mix(rootcolor, tipcolor, sv.v); cg1.mul(cg1, cg4); cg3.set(Ks); ! cg2.mul(Cspec, cg3); cg3.set(specularcolor); cg2.mul(cg2, cg3); *************** *** 155,157 **** --- 142,176 ---- } + private static class Lighting extends Statement { + private static Vector3fGrid _vg1 = new Vector3fGrid(); + + private static FloatGrid _fg1 = new FloatGrid(); + + private static FloatGrid _fg2 = new FloatGrid(); + + private static Color3fGrid _cg1 = new Color3fGrid(); + + public void execute(ShaderVariables sv, LightShader ls) { + _vg1.normalize(sv.L); + _fg1.dot(T, _vg1); + _fg1.acos(_fg1); + _vg1.negate(T); + _fg2.dot(_vg1, V); + _fg2.acos(_fg2); + _fg1.sub(_fg1, _fg2); + _fg1.abs(_fg1); + //_fg1.clamp(_fg1, 0f, 3.14f / 4f); + _fg1.cos(_fg1); + _fg1.max(_fg1, 0.001f); + _fg1.simulPow(_fg1, 1f / roughness); + //_fg1.mul(_fg1, sv.v); + _cg1.set(_fg1); + _cg1.mul(sv.Cl, _cg1); + Cspec.add(Cspec, _cg1); + //_cg1.set(sv.v); + //_cg1.mul(sv.Cl, _cg1); + // Cdiff.add(Cdiff, _cg1); + } + } + } |