コード例 #1
0
ファイル: ThinLens.cs プロジェクト: VIPERWorld/bokehlab
        public Vector3d GetBackSurfaceSample(Vector2d sample)
        {
            //var sample2d = Sampler.UniformSampleDisk(sample);
            var sample2d = Sampler.ConcentricSampleDisk(sample);

            return(new Vector3d(ApertureRadius * sample2d));
        }
コード例 #2
0
        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));
        }
コード例 #3
0
ファイル: IbrtGpu.cs プロジェクト: VIPERWorld/bokehlab
        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);
        }
コード例 #4
0
 private static Func <Vector2d, Vector2d> GetConcentricDiskMapping()
 {
     return((squarePoint) => 0.5 * (Vector2d.One + Sampler.ConcentricSampleDisk(squarePoint)));
 }