Search in sources :

Example 26 with Color

use of org.sunflow.image.Color in project joons-renderer by joonhyublee.

the class AnisotropicWardShader method scatterPhoton.

public void scatterPhoton(ShadingState state, Color power) {
    // make sure we are on the right side of the material
    state.faceforward();
    Color d = getDiffuse(state);
    state.storePhoton(state.getRay().getDirection(), power, d);
    float avgD = d.getAverage();
    float avgS = rhoS.getAverage();
    double rnd = state.getRandom(0, 0, 1);
    if (rnd < avgD) {
        // photon is scattered diffusely
        power.mul(d).mul(1.0f / avgD);
        OrthoNormalBasis onb = state.getBasis();
        double u = 2 * Math.PI * rnd / avgD;
        double v = state.getRandom(0, 1, 1);
        float s = (float) Math.sqrt(v);
        float s1 = (float) Math.sqrt(1.0f - v);
        Vector3 w = new Vector3((float) Math.cos(u) * s, (float) Math.sin(u) * s, s1);
        w = onb.transform(w, new Vector3());
        state.traceDiffusePhoton(new Ray(state.getPoint(), w), power);
    } else if (rnd < avgD + avgS) {
        // photon is scattered specularly
        power.mul(rhoS).mul(1 / avgS);
        OrthoNormalBasis basis = state.getBasis();
        Vector3 in = state.getRay().getDirection().negate(new Vector3());
        double r1 = rnd / avgS;
        double r2 = state.getRandom(0, 1, 1);
        float alphaRatio = alphaY / alphaX;
        float phi = 0;
        if (r1 < 0.25) {
            double val = 4 * r1;
            phi = (float) Math.atan(alphaRatio * Math.tan(Math.PI / 2 * val));
        } else if (r1 < 0.5) {
            double val = 1 - 4 * (0.5 - r1);
            phi = (float) Math.atan(alphaRatio * Math.tan(Math.PI / 2 * val));
            phi = (float) Math.PI - phi;
        } else if (r1 < 0.75) {
            double val = 4 * (r1 - 0.5);
            phi = (float) Math.atan(alphaRatio * Math.tan(Math.PI / 2 * val));
            phi += Math.PI;
        } else {
            double val = 1 - 4 * (1 - r1);
            phi = (float) Math.atan(alphaRatio * Math.tan(Math.PI / 2 * val));
            phi = 2 * (float) Math.PI - phi;
        }
        float cosPhi = (float) Math.cos(phi);
        float sinPhi = (float) Math.sin(phi);
        float denom = (cosPhi * cosPhi) / (alphaX * alphaX) + (sinPhi * sinPhi) / (alphaY * alphaY);
        float theta = (float) Math.atan(Math.sqrt(-Math.log(1 - r2) / denom));
        float sinTheta = (float) Math.sin(theta);
        float cosTheta = (float) Math.cos(theta);
        Vector3 h = new Vector3();
        h.x = sinTheta * cosPhi;
        h.y = sinTheta * sinPhi;
        h.z = cosTheta;
        basis.transform(h);
        Vector3 o = new Vector3();
        float ih = Vector3.dot(h, in);
        o.x = 2 * ih * h.x - in.x;
        o.y = 2 * ih * h.y - in.y;
        o.z = 2 * ih * h.z - in.z;
        Ray r = new Ray(state.getPoint(), o);
        state.traceReflectionPhoton(r, power);
    }
}
Also used : Color(org.sunflow.image.Color) Vector3(org.sunflow.math.Vector3) Ray(org.sunflow.core.Ray) OrthoNormalBasis(org.sunflow.math.OrthoNormalBasis)

Example 27 with Color

use of org.sunflow.image.Color in project joons-renderer by joonhyublee.

the class DiffuseShader method scatterPhoton.

public void scatterPhoton(ShadingState state, Color power) {
    Color diffuse;
    // make sure we are on the right side of the material
    if (Vector3.dot(state.getNormal(), state.getRay().getDirection()) > 0.0) {
        state.getNormal().negate();
        state.getGeoNormal().negate();
    }
    diffuse = getDiffuse(state);
    state.storePhoton(state.getRay().getDirection(), power, diffuse);
    float avg = diffuse.getAverage();
    double rnd = state.getRandom(0, 0, 1);
    if (rnd < avg) {
        // photon is scattered
        power.mul(diffuse).mul(1.0f / avg);
        OrthoNormalBasis onb = state.getBasis();
        double u = 2 * Math.PI * rnd / avg;
        double v = state.getRandom(0, 1, 1);
        float s = (float) Math.sqrt(v);
        float s1 = (float) Math.sqrt(1.0 - v);
        Vector3 w = new Vector3((float) Math.cos(u) * s, (float) Math.sin(u) * s, s1);
        w = onb.transform(w, new Vector3());
        state.traceDiffusePhoton(new Ray(state.getPoint(), w), power);
    }
}
Also used : Color(org.sunflow.image.Color) Vector3(org.sunflow.math.Vector3) Ray(org.sunflow.core.Ray) OrthoNormalBasis(org.sunflow.math.OrthoNormalBasis)

Example 28 with Color

use of org.sunflow.image.Color in project joons-renderer by joonhyublee.

the class IDShader method getRadiance.

public Color getRadiance(ShadingState state) {
    Vector3 n = state.getNormal();
    float f = n == null ? 1.0f : Math.abs(state.getRay().dot(n));
    return new Color(state.getInstance().hashCode()).mul(f);
}
Also used : Color(org.sunflow.image.Color) Vector3(org.sunflow.math.Vector3)

Example 29 with Color

use of org.sunflow.image.Color in project joons-renderer by joonhyublee.

the class ShinyDiffuseShader method getRadiance.

public Color getRadiance(ShadingState state) {
    // make sure we are on the right side of the material
    state.faceforward();
    // direct lighting
    state.initLightSamples();
    state.initCausticSamples();
    Color d = getDiffuse(state);
    Color lr = state.diffuse(d);
    if (!state.includeSpecular()) {
        return lr;
    }
    float cos = state.getCosND();
    float dn = 2 * cos;
    Vector3 refDir = new Vector3();
    refDir.x = (dn * state.getNormal().x) + state.getRay().getDirection().x;
    refDir.y = (dn * state.getNormal().y) + state.getRay().getDirection().y;
    refDir.z = (dn * state.getNormal().z) + state.getRay().getDirection().z;
    Ray refRay = new Ray(state.getPoint(), refDir);
    // compute Fresnel term
    cos = 1 - cos;
    float cos2 = cos * cos;
    float cos5 = cos2 * cos2 * cos;
    Color ret = Color.white();
    Color r = d.copy().mul(refl);
    ret.sub(r);
    ret.mul(cos5);
    ret.add(r);
    return lr.add(ret.mul(state.traceReflection(refRay, 0)));
}
Also used : Color(org.sunflow.image.Color) Vector3(org.sunflow.math.Vector3) Ray(org.sunflow.core.Ray)

Example 30 with Color

use of org.sunflow.image.Color in project joons-renderer by joonhyublee.

the class CornellBox method scatterPhoton.

@Override
public void scatterPhoton(ShadingState state, Color power) {
    int side = state.getPrimitiveID();
    Color kd = null;
    switch(side) {
        case 0:
            kd = left;
            break;
        case 1:
            kd = right;
            break;
        case 3:
            kd = back;
            break;
        case 4:
            kd = bottom;
            break;
        case 5:
            float lx = state.getPoint().x;
            float ly = state.getPoint().y;
            if (lx >= lxmin && lx < lxmax && ly >= lymin && ly < lymax && state.getRay().dz > 0) {
                return;
            }
            kd = top;
            break;
        default:
            assert false;
    }
    // make sure we are on the right side of the material
    if (Vector3.dot(state.getNormal(), state.getRay().getDirection()) > 0) {
        state.getNormal().negate();
        state.getGeoNormal().negate();
    }
    state.storePhoton(state.getRay().getDirection(), power, kd);
    double avg = kd.getAverage();
    double rnd = state.getRandom(0, 0, 1);
    if (rnd < avg) {
        // photon is scattered
        power.mul(kd).mul(1 / (float) avg);
        OrthoNormalBasis onb = OrthoNormalBasis.makeFromW(state.getNormal());
        double u = 2 * Math.PI * rnd / avg;
        double v = state.getRandom(0, 1, 1);
        float s = (float) Math.sqrt(v);
        float s1 = (float) Math.sqrt(1.0 - v);
        Vector3 w = new Vector3((float) Math.cos(u) * s, (float) Math.sin(u) * s, s1);
        w = onb.transform(w, new Vector3());
        state.traceDiffusePhoton(new Ray(state.getPoint(), w), power);
    }
}
Also used : Color(org.sunflow.image.Color) Vector3(org.sunflow.math.Vector3) Ray(org.sunflow.core.Ray) OrthoNormalBasis(org.sunflow.math.OrthoNormalBasis)

Aggregations

Color (org.sunflow.image.Color)48 Vector3 (org.sunflow.math.Vector3)34 Ray (org.sunflow.core.Ray)22 OrthoNormalBasis (org.sunflow.math.OrthoNormalBasis)15 LightSample (org.sunflow.core.LightSample)8 Point3 (org.sunflow.math.Point3)7 ShadingState (org.sunflow.core.ShadingState)6 Bitmap (org.sunflow.image.Bitmap)2 XYZColor (org.sunflow.image.XYZColor)2 Timer (org.sunflow.system.Timer)2 FileWriter (java.io.FileWriter)1 IOException (java.io.IOException)1 ConstantSpectralCurve (org.sunflow.image.ConstantSpectralCurve)1 GenericBitmap (org.sunflow.image.formats.GenericBitmap)1 BoundingBox (org.sunflow.math.BoundingBox)1 IntArray (org.sunflow.util.IntArray)1