Ejemplo n.º 1
0
        /// <summary>
        /// 渲染
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_render_Click(object sender, EventArgs e)
        {
            //开始时间
            DateTime startTime = DateTime.Now;

            //构建世界
            World world = new World();

            world.Bulid();//根据bulid构建
            //world = World.RandomScene1();//随机构建函数1(封面图1)
            //world = World.RandomScene2();//随即构建函数2(封面图2)

            //根据world的物体构造层次包围盒树
            BVH_node bVH = new BVH_node(world.GeometryObjects, world.GeometryObjects.Count, 0, 0);

            //画布参数
            int    nx     = 200;                //宽
            int    ny     = 100;                //高
            Bitmap bitmap = new Bitmap(nx, ny); //画布
            int    ns     = 10;                 //画布上一个像素点的实际随机采样数

            //相机参数
            Point3D  lookfrom = new Point3D(1, 0.5f, 1.5f);
            Vector3D lookat   = new Vector3D(0, 0, 0f);
            Camera   cam      = new Camera(lookfrom, lookat, new Vector3D(0, 1, 0), 60, (double)(nx) / (double)(ny), 0, (lookfrom - lookat).Length(), 0.0, 1.0);

            //Camera cam = new Camera();//默认相机参数,使用默认相机,则相机获取射线的函数一样要替换成默认

            //遍历画布上的每一点,计算出该点的颜色并画到画布上
            for (int i = 0; i < nx; i++)
            {
                for (int j = 0; j < ny; j++)
                {
                    SColor col = new SColor();   //像素点颜色
                    for (int s = 0; s < ns; s++) //随机采样,消除锯齿
                    {
                        //像素点的每一次采样具体计算
                        double u = (double)(i + RTUtils.rd.NextDouble()) / (double)nx; //该点在水平方向上的比例
                        double v = (double)(j + RTUtils.rd.NextDouble()) / (double)ny; //该点在垂直方向上的比例
                        Ray    r = cam.GetRayWith_Time(u, v);                          //获取从相机到该点的射线(运动+景深)
                        //Ray r = cam.GetRay(u, v);//获取从相机到该点的射线(默认)
                        //Ray r = cam.GetRayWith_Time(u, v);//获取从相机到该点的射线(景深)
                        SColor colTemp = RTUtils.Color(r, world, 0); //采样点颜色值
                        col = col + colTemp;                         //采样颜色总和
                    }
                    //ns次采样的平均颜色
                    col = col / ns;
                    col = new SColor(Math.Sqrt(col.R), Math.Sqrt(col.G), Math.Sqrt(col.B)); //对颜色进行伽马矫正
                    bitmap.SetPixel(i, ny - j - 1, col.GetColor255());                      //画上该点颜色
                    //设置进度
                    int pro = (int)((((i + 1) * ny + j) * 100.0) / (nx * ny) + 1);
                    SetPos(pro);
                }
            }
            string fileneame = "result" + DateTime.Now.Millisecond.ToString() + ".jpeg";

            bitmap.Save(fileneame);
            //avi_bmps.Add(bitmap);
            pictureBox1.Image = bitmap;
            textBox1.Text     = "渲染时间:" + (DateTime.Now - startTime).ToString();
        }