public bool TryAddUniform1(Vector3[] value, string uniformName, ShaderProg shader) { if (shader.GetUniform(uniformName) != -1) { float[] values = new float[value.Length * 3]; for (int i = 0; i < value.Length; ++i) { values[i * 3] = value[i].X; values[i * 3 + 1] = value[i].Y; values[i * 3 + 2] = value[i].Z; } try { GL.Uniform3(shader.GetUniform(uniformName), 3 * value.Length, values); } catch (Exception e) { //Possible memmory error. Console.WriteLine(e.Message); } return(true); } else { return(false); } }
private int CalculateBRDF(ShaderProg shader, int framebuffer, int renderbuffer, int size = 512) { int textureId = /*LoadBrdfImage("Resources/zB8UF1G.png");*/ AllocateBrdf(size); Quad quad = new Quad(); GL.BindFramebuffer(FramebufferTarget.Framebuffer, framebuffer); GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, renderbuffer); GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferStorage.DepthComponent24, size, size); GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, TextureTarget.Texture2D, textureId, 0); ShaderProg brdfShader = shader; GL.UseProgram(brdfShader.ProgramID); brdfShader.EnableVertexAttribArrays(); GL.Viewport(0, 0, size, size); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); quad.RenderQuad(); GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0); brdfShader.DisableVertexAttribArrays(); return(textureId); }
private int TransformHdrToPrefilteredCubemap(int textureId, ShaderProg shader, int framebuffer, int renderbuffer, int size = 128, uint mipnapLevels = 5) { Cube cube = new Cube(); GL.BindFramebuffer(FramebufferTarget.Framebuffer, framebuffer); GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, RenderbufferTarget.Renderbuffer, renderbuffer); int cubemap = AllocatePrefilterCubemap(size); Matrix4 projection = Matrix4.Identity; Matrix4[] views = new Matrix4[6]; GenerateMatricesForMapHdrToCubemap(ref projection, ref views); ShaderProg prefilteredShader = shader; GL.UseProgram(prefilteredShader.ProgramID); prefilteredShader.EnableVertexAttribArrays(); GL.UniformMatrix4(prefilteredShader.GetUniform("projection"), false, ref projection); UniformHelper helper = new UniformHelper(); bool suc; suc = helper.TryAddUniformTextureCubemap(textureId, "environmentMap", prefilteredShader, TextureUnit.Texture0); for (uint i = 0; i < mipnapLevels; ++i) { uint mipWidth = (uint)(size * Math.Pow(0.5f, i)); uint mipHeight = (uint)(size * Math.Pow(0.5f, i)); GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, renderbuffer); GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferStorage.DepthComponent24, (int)mipWidth, (int)mipHeight); GL.Viewport(0, 0, (int)mipWidth, (int)mipHeight); float roughness = (float)i / (float)(mipnapLevels - 1); helper.TryAddUniform1(roughness, "roughness", prefilteredShader); GL.BindFramebuffer(FramebufferTarget.Framebuffer, framebuffer); // GL.Disable(EnableCap.FramebufferSrgb); //GL.ActiveTexture(TextureUnit.Texture0); for (uint j = 0; j < 6; ++j) { GL.UniformMatrix4(prefilteredShader.GetUniform("view"), false, ref views[j]); GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, TextureTarget.TextureCubeMapPositiveX + (int)j, cubemap, (int)i); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); // GL.Enable(EnableCap.FramebufferSrgb); cube.RenderCube(); // renders a 1x1 cube // Console.WriteLine(GL.CheckNamedFramebufferStatus(framebuffer, FramebufferTarget.Framebuffer)); } prefilteredShader.DisableVertexAttribArrays(); } GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0); return(cubemap); }
public bool TryAddUniform1(int value, string uniformName, ShaderProg shader) { if (shader.GetUniform(uniformName) != -1) { GL.Uniform1(shader.GetUniform(uniformName), value); return(true); } else { return(false); } }
public Skybox(ShaderProg shader, string skyboxLocation = "Resources//Cubemaps") : base("CubemapSkybox") { SkyboxSceneObjectComponent skyboxComponent = new SkyboxSceneObjectComponent(skyboxLocation, shader, SkyboxSceneObjectComponent.SkyboxType.cubemap); MeshSceneObjectComponent meshComponent = new MeshSceneObjectComponent( new WavefrontModelLoader(), "Resources/box.obj1" ); AddComponent(meshComponent); AddComponent(skyboxComponent); }
public bool TryAddUniformTexture2D(int textureID, string uniformName, ShaderProg shader, TextureUnit unit) { if (shader.GetUniform(uniformName) != -1) { GL.ActiveTexture(unit); GL.BindTexture(TextureTarget.Texture2D, textureID); GL.Uniform1(shader.GetUniform(uniformName), (int)unit - 33984);//convertation of enum to int texture layer return(true); } else { return(false); } }
private int TransformHdrToCubemap(int textureId, string textureName, ShaderProg shader, int framebuffer, int renderbuffer, int size = 2048) { Cube cube = new Cube(); GL.BindFramebuffer(FramebufferTarget.Framebuffer, framebuffer); GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, renderbuffer); GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferStorage.DepthComponent24, size, size); GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, RenderbufferTarget.Renderbuffer, renderbuffer); int cubemap = AllocateCubemap(size); Matrix4 projection = Matrix4.Identity; Matrix4[] views = new Matrix4[6]; GenerateMatricesForMapHdrToCubemap(ref projection, ref views); ShaderProg equirectangularToCubemapShader = shader; GL.UseProgram(equirectangularToCubemapShader.ProgramID); equirectangularToCubemapShader.EnableVertexAttribArrays(); GL.UniformMatrix4(equirectangularToCubemapShader.GetUniform("projection"), false, ref projection); UniformHelper helper = new UniformHelper(); bool suc; if (textureName == "equirectangularMap") { suc = helper.TryAddUniformTexture2D(textureId, textureName, equirectangularToCubemapShader, TextureUnit.Texture0); } else { suc = helper.TryAddUniformTextureCubemap(textureId, textureName, equirectangularToCubemapShader, TextureUnit.Texture0); } GL.Viewport(0, 0, size, size); GL.BindFramebuffer(FramebufferTarget.Framebuffer, framebuffer); GL.ActiveTexture(TextureUnit.Texture0); for (int i = 0; i < 6; ++i) { GL.UniformMatrix4(equirectangularToCubemapShader.GetUniform("view"), false, ref views[i]); GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, TextureTarget.TextureCubeMapPositiveX + i, cubemap, 0); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); cube.RenderCube(); // renders a 1x1 cube } equirectangularToCubemapShader.DisableVertexAttribArrays(); GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0); return(cubemap); }
public SkyboxSceneObjectComponent(string location, SkyboxType type) { _skyboxLocation = location; skyboxType = type; switch (skyboxType) { case SkyboxType.cubemap: { _shader = new ShaderProg("vs_cubemap.glsl", "fs_cubemap.glsl", true); break; } case SkyboxType.hdr: { _shader = new ShaderProg("vs_hdr.glsl", "fs_hdr.glsl", true); break; } default: break; } }
public override void OnLoad() { ShaderProg skyboxShader = new ShaderProg("vs_cubemap.glsl", "fs_cubemap.glsl", true); _skybox = new Skybox(skyboxShader); base.OnLoad(); //Lion gameObject = new Lion(); //_sceneObjects.Add(gameObject); AnimatedModelTest animatedModel = new AnimatedModelTest(); _sceneObjects.Add(animatedModel); PointLight light1 = new PointLight(new Vector3(0f, 0f, 0f), 1); light1.Position = new Vector3(0, 0, -1); _sceneObjects.Add(light1); GLtf2Helm gltf2helm = new GLtf2Helm(); _sceneObjects.Add(gltf2helm); }
public SkyboxSceneObjectComponent(string location, ShaderProg Shader, SkyboxType type) { _skyboxLocation = location; _shader = Shader; skyboxType = type; }