예제 #1
0
 public Color getGlobalRadiance(ShadingState state)
 {
     if (globalPhotonMap == null)
     {
         if (state.getShader() != null)
             return state.getShader().getRadiance(state);
         else
             return Color.BLACK;
     }
     else
         return globalPhotonMap.getRadiance(state.getPoint(), state.getNormal());
 }
예제 #2
0
 public Color GetRadiance(ShadingState state)
 {
     if (state.getNormal() == null)
     {
         // if this shader has been applied to an infinite instance because of shader overrides
         // run the default shader, otherwise, just shade black
         return(state.getShader() != this ? state.getShader().GetRadiance(state) : Color.BLACK);
     }
     // make sure we are on the right side of the material
     state.faceforward();
     // setup lighting
     state.initLightSamples();
     state.initCausticSamples();
     return(state.diffuse(Color.GRAY));
 }
예제 #3
0
 public Color GetRadiance(ShadingState state)
 {
     if (state.getNormal() == null)
     {
         // if this shader has been applied to an infinite instance because of shader overrides
         // run the default shader, otherwise, just shade black
         return state.getShader() != this ? state.getShader().GetRadiance(state) : Color.BLACK;
     }
     // make sure we are on the right side of the material
     state.faceforward();
     // setup lighting
     state.initLightSamples();
     state.initCausticSamples();
     return state.diffuse(Color.GRAY);
 }
예제 #4
0
 public Color getGlobalRadiance(ShadingState state)
 {
     if (globalPhotonMap == null)
     {
         if (state.getShader() != null)
         {
             return(state.getShader().GetRadiance(state));
         }
         else
         {
             return(Color.BLACK);
         }
     }
     else
     {
         return(globalPhotonMap.getRadiance(state.getPoint(), state.getNormal()));
     }
 }
예제 #5
0
        public Color getIrradiance(ShadingState state, Color diffuseReflectance)
        {
            if (samples <= 0)
            {
                return(Color.BLACK);
            }
            // compute new sample
            Color            irr = Color.black();
            OrthoNormalBasis onb = state.getBasis();
            Vector3          w   = new Vector3();
            int n = state.getDiffuseDepth() == 0 ? samples : 1;

            for (int i = 0; i < n; i++)
            {
                float xi       = (float)state.getRandom(i, 0, n);
                float xj       = (float)state.getRandom(i, 1, n);
                float phi      = (float)(xi * 2 * Math.PI);
                float cosPhi   = (float)Math.Cos(phi);
                float sinPhi   = (float)Math.Sin(phi);
                float sinTheta = (float)Math.Sqrt(xj);
                float cosTheta = (float)Math.Sqrt(1.0f - xj);
                w.x = cosPhi * sinTheta;
                w.y = sinPhi * sinTheta;
                w.z = cosTheta;
                onb.transform(w);
                ShadingState temp = state.traceFinalGather(new Ray(state.getPoint(), w), i);
                if (temp != null)
                {
                    temp.getInstance().prepareShadingState(temp);
                    if (temp.getShader() != null)
                    {
                        irr.add(temp.getShader().getRadiance(temp));
                    }
                }
            }
            irr.mul((float)Math.PI / n);
            return(irr);
        }
예제 #6
0
 public void set(ShadingState state)
 {
     if (state == null)
     {
         c = Color.BLACK;
     }
     else
     {
         c = state.getResult();
         checkNanInf();
         shader   = state.getShader();
         instance = state.getInstance();
         if (state.getNormal() != null)
         {
             nx = state.getNormal().x;
             ny = state.getNormal().y;
             nz = state.getNormal().z;
         }
     }
     n = 1;
 }
예제 #7
0
 private IShader getShader(ShadingState state)
 {
     return shaderOverride != null ? shaderOverride : state.getShader();
 }
예제 #8
0
 private IShader getPhotonShader(ShadingState state)
 {
     return (shaderOverride != null && shaderOverridePhotons) ? shaderOverride : state.getShader();
 }
예제 #9
0
 public override Color getFillColor(ShadingState state)
 {
     return ambocc ? state.occlusion(16, 6.0f) : state.getShader().getRadiance(state);
 }
예제 #10
0
 public override Color getFillColor(ShadingState state)
 {
     return(ambocc ? state.occlusion(16, 6.0f) : state.getShader().getRadiance(state));
 }
예제 #11
0
        public Color getIrradiance(ShadingState state, Color diffuseReflectance)
        {
            float   b   = (float)Math.PI * c / diffuseReflectance.getMax();
            Color   irr = Color.black();
            Point3  p   = state.getPoint();
            Vector3 n   = state.getNormal();
            int     set = (int)(state.getRandom(0, 1, 1) * numSets);

            foreach (PointLight vpl in virtualLights[set])
            {
                Ray   r      = new Ray(p, vpl.p);
                float dotNlD = -(r.dx * vpl.n.x + r.dy * vpl.n.y + r.dz * vpl.n.z);
                float dotND  = r.dx * n.x + r.dy * n.y + r.dz * n.z;
                if (dotNlD > 0 && dotND > 0)
                {
                    float r2      = r.getMax() * r.getMax();
                    Color opacity = state.traceShadow(r);
                    Color power   = Color.blend(vpl.power, Color.BLACK, opacity);
                    float g       = (dotND * dotNlD) / r2;
                    irr.madd(0.25f * Math.Min(g, b), power);
                }
            }
            // bias compensation
            int nb = (state.getDiffuseDepth() == 0 || numBias <= 0) ? numBias : 1;

            if (nb <= 0)
            {
                return(irr);
            }
            OrthoNormalBasis onb   = state.getBasis();
            Vector3          w     = new Vector3();
            float            scale = (float)Math.PI / nb;

            for (int i = 0; i < nb; i++)
            {
                float xi       = (float)state.getRandom(i, 0, nb);
                float xj       = (float)state.getRandom(i, 1, nb);
                float phi      = (float)(xi * 2 * Math.PI);
                float cosPhi   = (float)Math.Cos(phi);
                float sinPhi   = (float)Math.Sin(phi);
                float sinTheta = (float)Math.Sqrt(xj);
                float cosTheta = (float)Math.Sqrt(1.0f - xj);
                w.x = cosPhi * sinTheta;
                w.y = sinPhi * sinTheta;
                w.z = cosTheta;
                onb.transform(w);
                Ray r = new Ray(state.getPoint(), w);
                r.setMax((float)Math.Sqrt(cosTheta / b));
                ShadingState temp = state.traceFinalGather(r, i);
                if (temp != null)
                {
                    temp.getInstance().prepareShadingState(temp);
                    if (temp.getShader() != null)
                    {
                        float dist      = temp.getRay().getMax();
                        float r2        = dist * dist;
                        float cosThetaY = -Vector3.dot(w, temp.getNormal());
                        if (cosThetaY > 0)
                        {
                            float g = (cosTheta * cosThetaY) / r2;
                            // was this path accounted for yet?
                            if (g > b)
                            {
                                irr.madd(scale * (g - b) / g, temp.getShader().GetRadiance(temp));
                            }
                        }
                    }
                }
            }
            return(irr);
        }
예제 #12
0
            public void set(ShadingState state)
            {
                if (state == null)
                    c = Color.BLACK;
                else
                {
                    c = state.getResult();
                    shader = state.getShader();
                    instance = state.getInstance();
                    if (state.getNormal() != null)
                    {
                        nx = state.getNormal().x;
                        ny = state.getNormal().y;
                        nz = state.getNormal().z;
                    }
					alpha = state.getInstance() == null ? 0 : 1;
                }
                n = 1;
            }