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); }
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; } } }
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; }