public Vector3d GetBackSurfaceSample(Vector2d sample) { //var sample2d = Sampler.UniformSampleDisk(sample); var sample2d = Sampler.ConcentricSampleDisk(sample); return(new Vector3d(ApertureRadius * sample2d)); }
private Vector3d GenerateSampleAtStop(Circle stop, Vector2d sample) { var sample2d = Sampler.ConcentricSampleDisk(sample); return(new Vector3d( stop.Radius * sample2d.X, stop.Radius * sample2d.Y, stop.Z)); }
private void GenerateLensSamplesTexture(int textureId, int tileSize, int sqrtSampleCount, int totalSampleCount, float lensApertureRadius) { GL.BindTexture(TextureTarget.Texture3D, textureId); // size of a group of samples for a single pixel int bands = 2; int groupSize = bands * totalSampleCount; int textureSize = groupSize * tileSize * tileSize; Sampler sampler = new Sampler(); IntPtr texturePtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(float)) * textureSize); unsafe { int zStride = bands * tileSize * tileSize; for (int y = 0; y < tileSize; y++) { for (int x = 0; x < tileSize; x++) { float *row = (float *)texturePtr + bands * (y * tileSize + x); int index = 0; // Z dimension, totalSampleCount times foreach (Vector2d sample in sampler.GenerateJitteredSamples(sqrtSampleCount)) { Vector2d lensPos = lensApertureRadius * //2 * (sample - new Vector2d(0.5, 0.5)); Sampler.ConcentricSampleDisk(sample); row[index] = (float)lensPos.X; row[index + 1] = (float)lensPos.Y; index += zStride; } } } } // TODO: could be an unsigned byte instead of a float // TODO: two sample pair could be stored in one 4-channel value GL.TexImage3D(TextureTarget.Texture3D, 0, PixelInternalFormat.Rg32f, tileSize, tileSize, totalSampleCount, 0, PixelFormat.Rg, PixelType.Float, texturePtr); GL.TexParameter(TextureTarget.Texture3D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest); GL.TexParameter(TextureTarget.Texture3D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest); GL.TexParameter(TextureTarget.Texture3D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat); GL.TexParameter(TextureTarget.Texture3D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat); GL.TexParameter(TextureTarget.Texture3D, TextureParameterName.TextureWrapR, (int)TextureWrapMode.Clamp); }
private static Func <Vector2d, Vector2d> GetConcentricDiskMapping() { return((squarePoint) => 0.5 * (Vector2d.One + Sampler.ConcentricSampleDisk(squarePoint))); }