Search in sources :

Example 16 with Color

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

the class ShinyDiffuseShader method scatterPhoton.

public void scatterPhoton(ShadingState state, Color power) {
    Color diffuse;
    // make sure we are on the right side of the material
    state.faceforward();
    diffuse = getDiffuse(state);
    state.storePhoton(state.getRay().getDirection(), power, diffuse);
    float d = diffuse.getAverage();
    float r = d * refl;
    double rnd = state.getRandom(0, 0, 1);
    if (rnd < d) {
        // photon is scattered
        power.mul(diffuse).mul(1.0f / d);
        OrthoNormalBasis onb = state.getBasis();
        double u = 2 * Math.PI * rnd / d;
        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);
    } else if (rnd < d + r) {
        float cos = -Vector3.dot(state.getNormal(), state.getRay().getDirection());
        power.mul(diffuse).mul(1.0f / d);
        // photon is reflected
        float dn = 2 * cos;
        Vector3 dir = new Vector3();
        dir.x = (dn * state.getNormal().x) + state.getRay().getDirection().x;
        dir.y = (dn * state.getNormal().y) + state.getRay().getDirection().y;
        dir.z = (dn * state.getNormal().z) + state.getRay().getDirection().z;
        state.traceReflectionPhoton(new Ray(state.getPoint(), dir), power);
    }
}
Also used : Color(org.sunflow.image.Color) Vector3(org.sunflow.math.Vector3) Ray(org.sunflow.core.Ray) OrthoNormalBasis(org.sunflow.math.OrthoNormalBasis)

Example 17 with Color

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

the class CornellBox method getRadiance.

@Override
public Color getRadiance(ShadingState state) {
    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 state.includeLights() ? radiance : Color.BLACK;
            }
            kd = top;
            break;
        default:
            assert false;
    }
    // make sure we are on the right side of the material
    state.faceforward();
    // setup lighting
    state.initLightSamples();
    state.initCausticSamples();
    return state.diffuse(kd);
}
Also used : Color(org.sunflow.image.Color)

Example 18 with Color

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

the class MirrorShader method getRadiance.

public Color getRadiance(ShadingState state) {
    if (!state.includeSpecular()) {
        return Color.BLACK;
    }
    state.faceforward();
    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();
    ret.sub(color);
    ret.mul(cos5);
    ret.add(color);
    return ret.mul(state.traceReflection(refRay, 0));
}
Also used : Color(org.sunflow.image.Color) Vector3(org.sunflow.math.Vector3) Ray(org.sunflow.core.Ray)

Example 19 with Color

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

the class PhongShader 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 = spec.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
        float dn = 2.0f * state.getCosND();
        // reflected direction
        Vector3 refDir = new Vector3();
        refDir.x = (dn * state.getNormal().x) + state.getRay().dx;
        refDir.y = (dn * state.getNormal().y) + state.getRay().dy;
        refDir.z = (dn * state.getNormal().z) + state.getRay().dz;
        power.mul(spec).mul(1.0f / avgS);
        OrthoNormalBasis onb = state.getBasis();
        double u = 2 * Math.PI * (rnd - avgD) / avgS;
        double v = state.getRandom(0, 1, 1);
        float s = (float) Math.pow(v, 1 / (this.power + 1));
        float s1 = (float) Math.sqrt(1 - s * s);
        Vector3 w = new Vector3((float) Math.cos(u) * s1, (float) Math.sin(u) * s1, s);
        w = onb.transform(w, new Vector3());
        state.traceReflectionPhoton(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 20 with Color

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

the class QuickGrayShader 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 = Color.GRAY;
    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)

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