示例#1
0
        private void btnReinit_Click(object sender, EventArgs e)
        {
            if (sw != null)
            {
                sw.Stop();
            }
            ComponentPipeline.Instance.Session.ReCreate();

            Context = ComponentPipeline.Instance.Session.OptixContext;
            this.OutputBuffer = CreateOutputBuffer(Format.Float4, this.GlControl.Size.Width, this.GlControl.Size.Height);
            Controller.InitializeEngine(OutputBuffer);
            SetCamera(ComponentPipeline.Instance.Session.Frame.CurrentCamera);
            RaysTracedPerFrame = ComponentPipeline.Instance.RenderingEngine.RaysTracedPerFrame;
            sw = Stopwatch.StartNew();
            mFrame = 0;
        }
示例#2
0
        private void Initialize()
        {
            Context = ComponentPipeline.Instance.Session.OptixContext;

            this.OutputBuffer = CreateOutputBuffer(Format.Float4, this.GlControl.Size.Width, this.GlControl.Size.Height);
            Controller.InitializeEngine(OutputBuffer);
            SetCamera(ComponentPipeline.Instance.Session.Frame.CurrentCamera);
            RaysTracedPerFrame = ComponentPipeline.Instance.RenderingEngine.RaysTracedPerFrame;
            sw = Stopwatch.StartNew();
            ComponentPipeline.Instance.RenderingEngine.SetCommands(ref Commands);
        }
示例#3
0
        private void BuildLights(SceneLightsource[] sceneLights)
        {
            var lightInfos = new List<LightInfo>();
            foreach (var sceneLightsource in sceneLights)
            {
                var lightInfo = sceneLightsource.CreateInfo();
                if (lightInfo.type == 5)
                {
                    EnvMapPath = sceneLightsource.Get("EnvMap.Image", string.Empty);
                }
                if (lightInfo.type != 2)
                {
                    lightInfos.Add(lightInfo);
                }
                else
                {
                    var li = ((Dictionary<string, List<int>>)BuildCache["LightTrianglesIndexes"])[((SceneMeshEntity)sceneLightsource["AreaLight.Mesh"]).Name];
                    lightInfos.Add(new LightInfo()
                    {
                        type = 2,
                        emission = sceneLightsource.Color,
                        startTriangle = li.Min(),
                        endTriangle = li.Max(),
                    });
                }
            }

            var triangleInfos = ((List<TriangleLight>)BuildCache["LightTriangles"]).Select(tr => new LightTriangleInfo()
            {
                v0 = tr.v1,
                v1 = tr.v2,
                v2 = tr.v3,
                n = tr.normal,
                area = CalcTriangleArea(tr)
            }).ToList();

            //TODO Index from 1!!! First triangle is fake
            triangleInfos.Insert(0, new LightTriangleInfo()
            {
                area = 1,
                n = new Vector3(1, 1, 1),
                v1 = new Vector3(100, 100, 100),
                v2 = new Vector3(101, 101, 101),
                v0 = new Vector3(102, 102, 102),
            });

            var triBufferDesc = new BufferDesc
            {
                Width = (uint)triangleInfos.Count,
                Format = Format.User,
                Type = BufferType.Input,
                ElemSize = (uint)Marshal.SizeOf(typeof(LightTriangleInfo))
            };
            var triangleBuffer = new Buffer(Session.OptixContext, triBufferDesc);
            var stream = triangleBuffer.Map();
            stream.WriteRange(triangleInfos.ToArray());
            triangleBuffer.Unmap();

            if (!string.IsNullOrWhiteSpace(EnvMapPath))
            {
                Tracer.Print("BuildLights", "Loading environment map " + EnvMapPath);
                var sceneEnvMapPath = EnvMapPath;
                var envmap = TextureCache.Instance.Load(Session.OptixContext, sceneEnvMapPath); //KC_outside_hi.hdr
                var id = envmap.GetId();
                Session.OptixContext["envmapId"].Set((uint)id);
                Session.OptixContext["use_envmap"].Set(1);

                var elt = lightInfos.Find(lt => lt.type == 5);
                var index = lightInfos.IndexOf(elt);
                lightInfos[index] = new LightInfo
                {
                    type = 5,
                    samplerId = id,
                    emission = elt.emission
                };
            }
            else
            {
                Session.OptixContext["use_envmap"].Set(0);
            }

            var ltBufferDesc = new BufferDesc
            {
                Width = (uint)lightInfos.Count,
                Format = Format.User,
                Type = BufferType.Input,
                ElemSize = (uint)Marshal.SizeOf(typeof(LightInfo))
            };
            var lightBuffer = new OptixDotNet.Buffer(Session.OptixContext, ltBufferDesc);
            var ltStream = lightBuffer.Map();
            //LightsCount.LValue += lts.Count;

            foreach (var lightinfo in lightInfos)
            {
                ltStream.Write(lightinfo);
            }
            lightBuffer.Unmap();

            Session.Frame.LightTrianglesBuffer = triangleBuffer;
            Session.Frame.LightBuffer = lightBuffer;
        }