public void UpdateMatrix(List <Mesh3dInstance> instances, bool instantRebuffer = false) { var cameraPos = Camera.Current.GetPosition(); instancesFiltered = 0; // instances.Sort((a, b) => (int)(((a.GetPosition() - cameraPos).Length - (b.GetPosition() - cameraPos).Length)*10)); for (int i = 0; i < instances.Count; i++) { float dst = (instances[i].GetPosition() - cameraPos).Length; if (dst >= DistanceStart && dst < DistanceEnd) { if (ModelInfosData.Length < instances.Count * matbsize) { ModelInfosData = new byte[instances.Count * matbsize]; } // MeshColoredID[instancesFiltered] = (instances[i].Id); var rot = Matrix4.CreateFromQuaternion(instances[i].GetOrientation()); memset(ref ModelInfosData, instances[i].GetOrientation(), instances[i].GetPosition(), instances[i].Id, instances[i].GetScale(), instancesFiltered * matbsize); instancesFiltered++; } } if (!instantRebuffer) { Game.Invoke(() => { //GL.FenceSync(SyncCondition.SyncGpuCommandsComplete, WaitSyncFlags.None); ModelInfosBuffer.MapData(ModelInfosData); //GL.FenceSync(SyncCondition.SyncGpuCommandsComplete, WaitSyncFlags.None); //GL.MemoryBarrier(MemoryBarrierFlags.ShaderImageAccessBarrierBit); InstancesFiltered = instancesFiltered; }); } else { GL.FenceSync(SyncCondition.SyncGpuCommandsComplete, WaitSyncFlags.None); ModelInfosBuffer.MapData(ModelInfosData); GL.FenceSync(SyncCondition.SyncGpuCommandsComplete, WaitSyncFlags.None); GL.MemoryBarrier(MemoryBarrierFlags.ShaderImageAccessBarrierBit); InstancesFiltered = instancesFiltered; } }
public void MapToCurrentShader() { var shader = ShaderProgram.Current; List <Vector4> buf = new List <Vector4>(); for (int i = 0; i < Drops.Count; i++) { buf.Add(new Vector4(Drops[i].Center, Drops[i].Radius)); } DropsBuffer.MapData(buf.ToArray()); DropsBuffer.Use(4); shader.SetUniform("DropsCount", Drops.Count); shader.SetUniform("DropsMaxRadius", MaxRadius); shader.SetUniform("DropsStrength", Strength); }
public ComputeBallsScene() { int instancesAxis = 10; int instances = instancesAxis * instancesAxis * instancesAxis; var ballInfo = Object3dInfo.LoadFromObjSingle(Media.Get("star3d.obj")); // var cb = Object3dGenerator.CreateCube(new Vector3(1000, 1000, 1000), new Vector2(1, 1)); // cb.FlipFaces(); // var sky = new Mesh3d(cb, new GenericMaterial(Color.Black)); // Add(sky); ballInfo.Normalize(); var instanced = new InstancedMesh3d(ballInfo, new GenericMaterial(new Vector4(0, 1, 0, 1))); var instanced2 = new InstancedMesh3d(ballInfo, new GenericMaterial(Color.Green)); //var model = Object3dInfo.LoadFromObjSingle(Media.Get("monkey.obj")); //var vrts = model.GetOrderedVertices(); //vrts = vrts.Distinct().ToList(); var bts3 = new List<Vector4>(); for(int x = 0; x < 20; x++) for(int y = 60; y > 0; y--) { bts3.Add(new Vector4(x, y, 0, 1)); } instanced2.UpdateMatrix(); Add(instanced2); instanced.Instances = instances; var SBuffer = new ShaderStorageBuffer(); var VBuffer = new ShaderStorageBuffer(); var PBuffer = new ShaderStorageBuffer(); GLThread.Invoke(() => { var cshader = new ComputeShader("AIPathFollower.compute.glsl"); var bts = new List<Vector4>(); var bts2 = new List<Vector4>(); var rand = new Random(); PBuffer.MapData(bts3.ToArray()); for(int x = 0; x < 12; x++) { for(int y = 0; y < 90; y++) { for(int z = 0; z < 12; z++) { instanced.Transformations.Add(new TransformationManager(new Vector3(x * 5, y + 300, z * 5), Quaternion.Identity, 1.5f)); bts.Add(new Vector4(x * 5, y + 300, z * 5, 1)); bts2.Add(new Vector4(0, 0, 0, 1)); } } } SBuffer.MapData(bts.ToArray()); VBuffer.MapData(bts2.ToArray()); instanced.UpdateMatrix(); GLThread.OnBeforeDraw += (o, e) => { cshader.Use(); instanced.ModelMatricesBuffer.Use(0); SBuffer.Use(1); VBuffer.Use(2); PBuffer.Use(3); cshader.SetUniform("BallsCount", instances); cshader.SetUniform("PathPointsCount", bts3.Count); cshader.SetUniform("Time", (float)(DateTime.Now - GLThread.StartTime).TotalMilliseconds / 1000); cshader.Dispatch(12, 90, 12); }; }); Add(instanced); }
public PostProcessing(int initialWidth, int initialHeight) { //FullScene3DTexture = new Texture3D(new Vector3(64, 64, 64)); TestBuffer = new ShaderStorageBuffer(); NumbersTexture = new Texture(Media.Get("numbers.png")); CShader = new ComputeShader("Blur.compute.glsl"); GLThread.Invoke(() => { TestBuffer.MapData(new Vector3[4]{ new Vector3(1, 0.25f, 1), new Vector3(0, 0.55f, 0.75f), new Vector3(1, 0.25f, 0), new Vector3(0.55f, 0, 0.75f) }); }); Width = initialWidth; Height = initialHeight; MSAAResolvingFrameBuffer = new Framebuffer(initialWidth, initialHeight); MSAAResolvingFrameBuffer.SetMultiSample(true); MRT = new MRTFramebuffer(initialWidth, initialHeight); BackMRT = new MRTFramebuffer(initialWidth / 4, initialHeight / 4); Pass1FrameBuffer = new Framebuffer(initialWidth, initialHeight); Pass2FrameBuffer = new Framebuffer(initialWidth, initialHeight); LightPointsFrameBuffer = new Framebuffer(initialWidth / 6, initialHeight / 6); BloomFrameBuffer = new Framebuffer(initialWidth / 4, initialHeight / 4); FogFramebuffer = new Framebuffer(initialWidth, initialHeight); SmallFrameBuffer = new Framebuffer(initialWidth / 10, initialHeight / 10); LastWorldPositionFramebuffer = new Framebuffer(initialWidth / 1, initialHeight / 1); RSMFramebuffer = new Framebuffer(initialWidth / 1, initialHeight / 1); SSReflectionsFramebuffer = new Framebuffer(initialWidth / 1, initialHeight / 1); VDAOFramebuffer = new Framebuffer(initialWidth / 1, initialHeight / 1); GlobalIlluminationFrameBuffer = new Framebuffer(initialWidth, initialHeight); //GlobalIlluminationFrameBuffer.ColorInternalFormat = PixelInternalFormat.R8; //GlobalIlluminationFrameBuffer.ColorPixelFormat = PixelFormat.Red; //GlobalIlluminationFrameBuffer.ColorPixelType = PixelType.UnsignedByte; GlobalIlluminationFrameBuffer.Use(); //BackDiffuseFrameBuffer = new Framebuffer(initialWidth / 2, initialHeight / 2); //BackNormalsFrameBuffer = new Framebuffer(initialWidth / 2, initialHeight / 2); ScreenSpaceNormalsWriterShader = ShaderProgram.Compile("Generic.vertex.glsl", "ScreenSpaceNormalsWriter.fragment.glsl"); BackDepthWriterShader = ShaderProgram.Compile("Generic.vertex.glsl", "BackDepthWriter.fragment.glsl"); BloomShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "Bloom.fragment.glsl"); MSAAShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "MSAA.fragment.glsl"); SSAOShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "SSAO.fragment.glsl"); FogShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "Fog.fragment.glsl"); LightPointsShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "LightPoints.fragment.glsl"); LensBlurShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "LensBlur.fragment.glsl"); HDRShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "HDR.fragment.glsl"); BlitShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "Blit.fragment.glsl"); DeferredShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "Deferred.fragment.glsl"); CombinerShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "Combiner.fragment.glsl"); PathTracerOutputShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "Output.fragment.glsl"); GlobalIlluminationShaderX = ShaderProgram.Compile("PostProcess.vertex.glsl", "GlobalIllumination.fragment.glsl"); GlobalIlluminationShaderX.SetGlobal("SEED", "gl_FragCoord.x"); GlobalIlluminationShaderY = ShaderProgram.Compile("PostProcess.vertex.glsl", "GlobalIllumination.fragment.glsl"); GlobalIlluminationShaderY.SetGlobal("SEED", "gl_FragCoord.y"); RSMShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "RSM.fragment.glsl"); SSReflectionsShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "SSReflections.fragment.glsl"); VDAOShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "VDAO.fragment.glsl"); //ReflectShader = ShaderProgram.Compile(Media.ReadAllText("PostProcess.vertex.glsl"), Media.ReadAllText("Reflect.fragment.glsl")); Object3dInfo postPlane3dInfo = new Object3dInfo(postProcessingPlaneVertices, postProcessingPlaneIndices); PostProcessingMesh = new Mesh3d(postPlane3dInfo, new GenericMaterial(Color.Pink)); }
public List <Voxel> Voxelize(Object3dManager objinfo, int gridSize) { List <Voxel> voxels = new List <Voxel>(); List <byte> bytes = new List <byte>(); var dv3 = new Vector3(gridSize, gridSize, gridSize); for (int x = 0; x < gridSize; x++) { for (int y = 0; y < gridSize; y++) { for (int z = 0; z < gridSize; z++) { var voxel = new Voxel(); voxel.Minimum = (Vector3.Divide(new Vector3(x, y, z), (float)gridSize) - new Vector3(0.5f)) * 2.0f; voxel.Maximum = (Vector3.Divide(new Vector3(x + 1, y + 1, z + 1), (float)gridSize) - new Vector3(0.5f)) * 2.0f; voxels.Add(voxel); bytes.AddRange(BitConverter.GetBytes((uint)0)); bytes.AddRange(BitConverter.GetBytes((int)0)); bytes.AddRange(BitConverter.GetBytes((int)0)); bytes.AddRange(BitConverter.GetBytes((int)0)); } } } BoxesSSBO.MapData(bytes.ToArray()); // yay Vector3 transFromCenter = objinfo.GetAverageTranslationFromZero(); objinfo.OriginToCenter(); float divisor = objinfo.GetNormalizeDivisor(); var v3aabb = objinfo.GetAxisAlignedBox(); //objinfo.Normalize(); objinfo.AxisDivide(v3aabb); DrawingFramebuffer.Use(); GL.Disable(EnableCap.DepthTest); GL.Disable(EnableCap.CullFace); GL.ColorMask(true, false, false, false); VoxelizerShader.Use(); //VoxelizerShader.SetUniform("NormalizationDivisor", 1.0f / divisor); // VoxelizerShader.SetUniform("CenterToZero", transFromCenter); BoxesSSBO.Use(9); var ob3d = new Object3dInfo(objinfo.Vertices); VoxelizerShader.SetUniform("Grid", gridSize); VoxelizerShader.SetUniform("Pass", 0); ob3d.Draw();/* * VoxelizerShader.SetUniform("Pass", 1); * ob3d.Draw(); * VoxelizerShader.SetUniform("Pass", 2); * ob3d.Draw();*/ GL.MemoryBarrier(MemoryBarrierFlags.ShaderStorageBarrierBit); var resultBytes = BoxesSSBO.Read(0, bytes.Count); int cursor = 0; int i = 0; var newVoxels = new List <Voxel>(); for (int x = 0; x < gridSize; x++) { for (int y = 0; y < gridSize; y++) { for (int z = 0; z < gridSize; z++) { uint hit = BitConverter.ToUInt32(resultBytes, cursor); int nrx = BitConverter.ToInt32(resultBytes, cursor + 4); int nry = BitConverter.ToInt32(resultBytes, cursor + 8); int nrz = BitConverter.ToInt32(resultBytes, cursor + 12); cursor += 4 * 4; if (hit > 0) { float fnrx = (float)nrx / (float)hit; float fnry = (float)nry / (float)hit; float fnrz = (float)nrz / (float)hit; if (hit > 65536) { hit = 65536; } float dens = (float)hit / (float)65536; voxels[i].Maximum *= v3aabb; voxels[i].Minimum *= v3aabb; voxels[i].Maximum += transFromCenter; voxels[i].Minimum += transFromCenter; voxels[i].Density = dens; voxels[i].Normal = new Vector3(fnrx / 128.0f, fnry / 128.0f, fnrz / 128.0f); newVoxels.Add(voxels[i]); } i++; } } } GL.Enable(EnableCap.DepthTest); GL.Enable(EnableCap.CullFace); GL.ColorMask(true, true, true, true); return(newVoxels); }