Beispiel #1
0
        public static void RenderKernel(Index2 id,
                                        dFramebuffer framebuffer,
                                        dWorldBuffer world,
                                        Camera camera, int rngOffset)
        {
            int x = id.X;
            int y = id.Y;

            int index = ((y * camera.width) + x);

            //there is probably a better way to do this, but it seems to work. seed = the tick * a large prime xor (index + 1) * even larger prime
            XorShift64Star rng = new XorShift64Star((((ulong)(rngOffset + 1) * 3727177) ^ ((ulong)(index + 1) * 113013596393)));
            //XorShift64Star rng = new XorShift64Star();

            Ray ray = camera.GetRay(x + rng.NextFloat(), y + rng.NextFloat());

            ColorRay(index, ray, framebuffer, world, rng, camera);
        }
Beispiel #2
0
        public static void NULLTAA(Index1 index,
                                   dFramebuffer srcFramebuffer,
                                   dFramebuffer dstFramebuffer,
                                   float depthFuzz, float exponent, int tick)
        {
            float newDepth = srcFramebuffer.ZBuffer[index];
            int   newID    = srcFramebuffer.DrawableIDBuffer[index];

            int rIndex = index * 3;
            int gIndex = rIndex + 1;
            int bIndex = gIndex + 1;

            if (/*XMath.Abs(newDepth - lastDepth) > depthFuzz || */ tick == 0)
            {
                dstFramebuffer.ColorFrameBuffer[rIndex] = srcFramebuffer.ColorFrameBuffer[rIndex];
                dstFramebuffer.ColorFrameBuffer[gIndex] = srcFramebuffer.ColorFrameBuffer[gIndex];
                dstFramebuffer.ColorFrameBuffer[bIndex] = srcFramebuffer.ColorFrameBuffer[bIndex];

                dstFramebuffer.DrawableIDBuffer[index] = newID;
                dstFramebuffer.ZBuffer[index]          = newDepth;
            }
            else
            {
                if (tick < 1 / exponent)
                {
                    dstFramebuffer.ColorFrameBuffer[rIndex] = ((1.0f / tick) * srcFramebuffer.ColorFrameBuffer[rIndex]) + ((1 - (1.0f / tick)) * dstFramebuffer.ColorFrameBuffer[rIndex]);
                    dstFramebuffer.ColorFrameBuffer[gIndex] = ((1.0f / tick) * srcFramebuffer.ColorFrameBuffer[gIndex]) + ((1 - (1.0f / tick)) * dstFramebuffer.ColorFrameBuffer[gIndex]);
                    dstFramebuffer.ColorFrameBuffer[bIndex] = ((1.0f / tick) * srcFramebuffer.ColorFrameBuffer[bIndex]) + ((1 - (1.0f / tick)) * dstFramebuffer.ColorFrameBuffer[bIndex]);

                    dstFramebuffer.DrawableIDBuffer[index] = newID;
                    dstFramebuffer.ZBuffer[index]          = newDepth;
                }
                else
                {
                    dstFramebuffer.ColorFrameBuffer[rIndex] = (exponent * srcFramebuffer.ColorFrameBuffer[rIndex]) + ((1 - exponent) * dstFramebuffer.ColorFrameBuffer[rIndex]);
                    dstFramebuffer.ColorFrameBuffer[gIndex] = (exponent * srcFramebuffer.ColorFrameBuffer[gIndex]) + ((1 - exponent) * dstFramebuffer.ColorFrameBuffer[gIndex]);
                    dstFramebuffer.ColorFrameBuffer[bIndex] = (exponent * srcFramebuffer.ColorFrameBuffer[bIndex]) + ((1 - exponent) * dstFramebuffer.ColorFrameBuffer[bIndex]);

                    dstFramebuffer.DrawableIDBuffer[index] = newID;
                    dstFramebuffer.ZBuffer[index]          = newDepth;
                }
            }
        }
Beispiel #3
0
        private static void ColorRay(int index,
                                     Ray ray,
                                     dFramebuffer framebuffer,
                                     dWorldBuffer world,
                                     XorShift64Star rng, Camera camera)
        {
            Vec3 attenuation = new Vec3(1f, 1f, 1f);
            Vec3 lighting    = new Vec3();

            Ray  working             = ray;
            bool attenuationHasValue = false;

            float minT = 0.1f;

            for (int i = 0; i < camera.maxBounces; i++)
            {
                HitRecord rec = GetWorldHit(working, world, minT);

                if (rec.materialID == -1)
                {
                    if (i == 0 || attenuationHasValue)
                    {
                        framebuffer.DrawableIDBuffer[index] = -2;
                    }

                    float t = 0.5f * (working.b.y + 1.0f);
                    attenuation *= (1.0f - t) * new Vec3(1.0f, 1.0f, 1.0f) + t * new Vec3(0.5f, 0.7f, 1.0f);
                    break;
                }
                else
                {
                    if (i == 0)
                    {
                        framebuffer.ZBuffer[index]          = rec.t;
                        framebuffer.DrawableIDBuffer[index] = rec.drawableID;
                    }

                    ScatterRecord sRec = Scatter(working, rec, rng, world.materials, minT);
                    if (sRec.materialID != -1)
                    {
                        attenuationHasValue = sRec.mirrorSkyLightingFix;
                        attenuation        *= sRec.attenuation;
                        working             = sRec.scatterRay;
                    }
                    else
                    {
                        framebuffer.DrawableIDBuffer[index] = -1;
                        break;
                    }
                }

                for (int j = 0; j < world.lightSphereIDs.Length; j++)
                {
                    Sphere    s         = world.spheres[world.lightSphereIDs[j]];
                    Vec3      lightDir  = s.center - rec.p;
                    HitRecord shadowRec = GetWorldHit(new Ray(rec.p, lightDir), world, minT);

                    if (shadowRec.materialID != -1 && (shadowRec.p - rec.p).length() > lightDir.length() - (s.radius * 1.1f)) // the second part of this IF could probably be much more efficent
                    {
                        MaterialData material = world.materials[shadowRec.materialID];
                        if (material.type != 1)
                        {
                            lightDir  = Vec3.unitVector(lightDir);
                            lighting += material.color * XMath.Max(0.0f, Vec3.dot(lightDir, rec.normal));
                            lighting *= XMath.Pow(XMath.Max(0.0f, Vec3.dot(-Vec3.reflect(rec.normal, -lightDir), ray.b)), material.reflectivity) * material.color;
                        }
                    }
                }
            }

            int rIndex = index * 3;
            int gIndex = rIndex + 1;
            int bIndex = rIndex + 2;

            framebuffer.ColorFrameBuffer[rIndex] = attenuation.x;
            framebuffer.ColorFrameBuffer[gIndex] = attenuation.y;
            framebuffer.ColorFrameBuffer[bIndex] = attenuation.z;

            framebuffer.LightingFrameBuffer[rIndex] = lighting.x;
            framebuffer.LightingFrameBuffer[gIndex] = lighting.y;
            framebuffer.LightingFrameBuffer[bIndex] = lighting.z;
        }