Search in sources :

Example 11 with Ray

use of org.sunflow.core.Ray 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)

Example 12 with Ray

use of org.sunflow.core.Ray in project joons-renderer by joonhyublee.

the class UberShader 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;
    }
    if (glossyness == 0) {
        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 spec = getSpecular(state);
        Color ret = Color.white();
        ret.sub(spec);
        ret.mul(cos5);
        ret.add(spec);
        return lr.add(ret.mul(state.traceReflection(refRay, 0)));
    } else {
        return lr.add(state.specularPhong(getSpecular(state), 2 / glossyness, numSamples));
    }
}
Also used : Color(org.sunflow.image.Color) Vector3(org.sunflow.math.Vector3) Ray(org.sunflow.core.Ray)

Example 13 with Ray

use of org.sunflow.core.Ray in project joons-renderer by joonhyublee.

the class CausticPhotonMap method getSamples.

@Override
public void getSamples(ShadingState state) {
    if (storedPhotons == 0) {
        return;
    }
    NearestPhotons np = new NearestPhotons(state.getPoint(), gatherNum, gatherRadius * gatherRadius);
    locatePhotons(np);
    if (np.found < 8) {
        return;
    }
    Point3 ppos = new Point3();
    Vector3 pdir = new Vector3();
    Vector3 pvec = new Vector3();
    float invArea = 1.0f / ((float) Math.PI * np.dist2[0]);
    float maxNDist = np.dist2[0] * 0.05f;
    float f2r2 = 1.0f / (filterValue * filterValue * np.dist2[0]);
    float fInv = 1.0f / (1.0f - 2.0f / (3.0f * filterValue));
    for (int i = 1; i <= np.found; i++) {
        Photon phot = np.index[i];
        Vector3.decode(phot.dir, pdir);
        float cos = -Vector3.dot(pdir, state.getNormal());
        if (cos > 0.001) {
            ppos.set(phot.x, phot.y, phot.z);
            Point3.sub(ppos, state.getPoint(), pvec);
            float pcos = Vector3.dot(pvec, state.getNormal());
            if ((pcos < maxNDist) && (pcos > -maxNDist)) {
                LightSample sample = new LightSample();
                sample.setShadowRay(new Ray(state.getPoint(), pdir.negate()));
                sample.setRadiance(new Color().setRGBE(np.index[i].power).mul(invArea / cos), Color.BLACK);
                sample.getDiffuseRadiance().mul((1.0f - (float) Math.sqrt(np.dist2[i] * f2r2)) * fInv);
                state.addSample(sample);
            }
        }
    }
}
Also used : Point3(org.sunflow.math.Point3) LightSample(org.sunflow.core.LightSample) Color(org.sunflow.image.Color) Vector3(org.sunflow.math.Vector3) Ray(org.sunflow.core.Ray)

Example 14 with Ray

use of org.sunflow.core.Ray 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 15 with Ray

use of org.sunflow.core.Ray 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)

Aggregations

Ray (org.sunflow.core.Ray)27 Vector3 (org.sunflow.math.Vector3)25 Color (org.sunflow.image.Color)22 OrthoNormalBasis (org.sunflow.math.OrthoNormalBasis)13 LightSample (org.sunflow.core.LightSample)9 Point3 (org.sunflow.math.Point3)5 ShadingState (org.sunflow.core.ShadingState)3 Instance (org.sunflow.core.Instance)1 Shader (org.sunflow.core.Shader)1 XYZColor (org.sunflow.image.XYZColor)1