Search in sources :

Example 31 with Vector3

use of org.sunflow.math.Vector3 in project joons-renderer by joonhyublee.

the class MirrorShader method scatterPhoton.

public void scatterPhoton(ShadingState state, Color power) {
    float avg = color.getAverage();
    double rnd = state.getRandom(0, 0, 1);
    if (rnd >= avg) {
        return;
    }
    state.faceforward();
    float cos = state.getCosND();
    power.mul(color).mul(1.0f / avg);
    // 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 : Vector3(org.sunflow.math.Vector3) Ray(org.sunflow.core.Ray)

Example 32 with Vector3

use of org.sunflow.math.Vector3 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 33 with Vector3

use of org.sunflow.math.Vector3 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 34 with Vector3

use of org.sunflow.math.Vector3 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 35 with Vector3

use of org.sunflow.math.Vector3 in project joons-renderer by joonhyublee.

the class RealtimeBenchmark method createGeometry.

private void createGeometry() {
    // light source
    parameter("source", new Point3(-15.5945f, -30.0581f, 45.967f));
    parameter("dir", new Vector3(15.5945f, 30.0581f, -45.967f));
    parameter("radius", 60.0f);
    parameter("radiance", null, 3, 3, 3);
    light("light", "directional");
    // gi-engine
    parameter("gi.engine", "fake");
    parameter("gi.fake.sky", null, 0.25f, 0.25f, 0.25f);
    parameter("gi.fake.ground", null, 0.01f, 0.01f, 0.5f);
    parameter("gi.fake.up", new Vector3(0, 0, 1));
    options(DEFAULT_OPTIONS);
    // shaders
    parameter("diffuse", null, 0.5f, 0.5f, 0.5f);
    shader("default", "diffuse");
    parameter("diffuse", null, 0.5f, 0.5f, 0.5f);
    parameter("shiny", 0.2f);
    shader("refl", "shiny_diffuse");
    // objects
    // teapot
    parameter("subdivs", 10);
    geometry("teapot", "teapot");
    parameter("shaders", "default");
    Matrix4 m = Matrix4.IDENTITY;
    m = Matrix4.scale(0.075f).multiply(m);
    m = Matrix4.rotateZ((float) Math.toRadians(-45f)).multiply(m);
    m = Matrix4.translation(-7, 0, 0).multiply(m);
    parameter(TRANSFORM, m);
    instance("teapot.instance", "teapot");
    // gumbo
    parameter("subdivs", 10);
    geometry("gumbo", "gumbo");
    m = Matrix4.IDENTITY;
    m = Matrix4.scale(0.5f).multiply(m);
    m = Matrix4.rotateZ((float) Math.toRadians(25f)).multiply(m);
    m = Matrix4.translation(3, -7, 0).multiply(m);
    parameter("shaders", "default");
    parameter(TRANSFORM, m);
    instance("gumbo.instance", "gumbo");
    // ground plane
    parameter("center", new Point3(0, 0, 0));
    parameter("normal", new Vector3(0, 0, 1));
    geometry("ground", "plane");
    parameter("shaders", "refl");
    instance("ground.instance", "ground");
}
Also used : Point3(org.sunflow.math.Point3) Vector3(org.sunflow.math.Vector3) Matrix4(org.sunflow.math.Matrix4)

Aggregations

Vector3 (org.sunflow.math.Vector3)75 Color (org.sunflow.image.Color)34 Point3 (org.sunflow.math.Point3)27 Ray (org.sunflow.core.Ray)25 OrthoNormalBasis (org.sunflow.math.OrthoNormalBasis)17 Instance (org.sunflow.core.Instance)11 LightSample (org.sunflow.core.LightSample)8 ShadingState (org.sunflow.core.ShadingState)3 ParameterList (org.sunflow.core.ParameterList)2 TriangleMesh (org.sunflow.core.primitive.TriangleMesh)2 XYZColor (org.sunflow.image.XYZColor)2 Timer (org.sunflow.system.Timer)2 File (java.io.File)1 FileInputStream (java.io.FileInputStream)1 FileNotFoundException (java.io.FileNotFoundException)1 IOException (java.io.IOException)1 FloatBuffer (java.nio.FloatBuffer)1 MappedByteBuffer (java.nio.MappedByteBuffer)1 ReentrantReadWriteLock (java.util.concurrent.locks.ReentrantReadWriteLock)1 PrimitiveList (org.sunflow.core.PrimitiveList)1