public CommonObjects(IContext glContext, IShaderProgramFactory shaderProgramFactory) { StandardShaderProgram = shaderProgramFactory.CreateDefault(); TransformUb = new UniformBufferSugar <TransformUniform>(glContext); CameraUb = new UniformBufferSugar <Matrix4x4>(glContext); CameraExtraUb = new UniformBufferSugar <Vector3>(glContext); LightUb = new UniformBufferSugar <Vector3>(glContext); MaterialUb = new UniformBufferSugar <MaterialUniform>(glContext); GlobalUb = new UniformBufferSugar <GlobalUniform>(glContext); UndefinedMaterial = CreateUndefinedMaterial(); }
public unsafe BleedDrawer(IContext glContext) { this.glContext = glContext; #region Shader Text const string vertexShaderText = @"#version 150 in vec2 in_position; in vec2 in_tex_coord; out vec2 v_tex_coord; void main() { gl_Position = vec4(in_position, 0, 1); v_tex_coord = in_tex_coord; } "; const string fragmentShaderText = @"#version 150 uniform sampler2D DiffuseMap; layout(std140) uniform Params { vec4 Color; }; in vec2 v_tex_coord; out vec4 out_color; void main() { ivec2 coord = ivec2(gl_FragCoord); float accumulator = 0; for (int i = -4; i <= 4; i++) for (int j = -4; j <= 4; j++) { vec4 col = texelFetch(DiffuseMap, coord + ivec2(i, j), 0); accumulator += col.r + col.g + col.b; } float s = step(0.1, accumulator); out_color = s * Color; } "; #endregion var vs = glContext.Create.VertexShader(vertexShaderText); var fs = glContext.Create.FragmentShader(fragmentShaderText); program = glContext.Create.Program(new ShaderProgramDescription { VertexShaders = new[] { vs }, FragmentShaders = new[] { fs }, VertexAttributeNames = new[] { "in_position" }, UniformBufferNames = new [] { "Params" }, SamplerNames = new [] { "DiffuseMap" }, }); var vertices = new[] { new Vector4(-1, -1, 0, 0), new Vector4(-1, 1, 0, 1), new Vector4(1, -1, 1, 0), new Vector4(1, 1, 1, 1), }; IBuffer vertexBuffer; fixed(Vector4 *data = vertices) vertexBuffer = glContext.Create.Buffer(BufferTarget.Array, 4 * sizeof(float) * vertices.Length, BufferUsageHint.StaticDraw, (IntPtr)data); vao = glContext.Create.VertexArray(); vao.SetVertexAttributeF(0, vertexBuffer, VertexAttributeDimension.Two, VertexAttribPointerType.Float, false, 4 * sizeof(float), 0); //vao.SetVertexAttributeF(1, vertexBuffer, VertexAttributeDimension.Two, VertexAttribPointerType.Float, false, 4 * sizeof(float), 2 * sizeof(float)); paramsUb = new UniformBufferSugar <Color4>(glContext); }
public unsafe VeilDrawer(IContext glContext) { this.glContext = glContext; #region Shader Text const string vertexShaderText = @"#version 150 in vec4 in_position; void main() { gl_Position = in_position; } "; const string fragmentShaderText = @"#version 150 layout(std140) uniform ColorUb { vec4 Color; }; out vec4 out_color; void main() { out_color = Color; } "; #endregion var vs = glContext.Create.VertexShader(vertexShaderText); var fs = glContext.Create.FragmentShader(fragmentShaderText); shaderProgram = glContext.Create.Program(new ShaderProgramDescription { VertexShaders = new[] { vs }, FragmentShaders = new[] { fs }, VertexAttributeNames = new[] { "in_position" }, UniformBufferNames = new[] { "ColorUb" }, }); var vertices = new[] { new Vector4(-1, -1, 0, 1), new Vector4(-1, 1, 0, 1), new Vector4(1, -1, 0, 1), new Vector4(1, 1, 0, 1), }; IBuffer vertexBuffer; fixed(Vector4 *data = vertices) vertexBuffer = glContext.Create.Buffer(BufferTarget.Array, 4 * sizeof(float) * vertices.Length, BufferUsageHint.StaticDraw, (IntPtr)data); vao = glContext.Create.VertexArray(); vao.SetVertexAttributeF(0, vertexBuffer, VertexAttributeDimension.Four, VertexAttribPointerType.Float, false, 4 * sizeof(float), 0); colorUb = new UniformBufferSugar <Color4>(glContext); }
public unsafe SkyboxDrawer(IContext glContext) { this.glContext = glContext; sampler = glContext.Create.Sampler(); sampler.SetMagFilter(TextureMagFilter.Linear); sampler.SetMinFilter(TextureMinFilter.LinearMipmapLinear); sampler.SetWrapR(TextureWrapMode.Clamp); sampler.SetWrapS(TextureWrapMode.Clamp); sampler.SetWrapT(TextureWrapMode.Clamp); sampler.SetMaxAnisotropy(16f); #region Shader Text const string vertexShaderText = @"#version 150 layout(std140) uniform Camera { mat4 ViewProjection; }; in vec3 in_position; out vec3 v_tex_coord; void main() { vec4 worldPosition = vec4(in_position, 1.0f); gl_Position = worldPosition * ViewProjection; gl_Position.y = -gl_Position.y; gl_Position.z = 2.0 * gl_Position.z - gl_Position.w; v_tex_coord = vec3(-worldPosition.x, worldPosition.y, worldPosition.z); } "; const string fragmentShaderText = @"#version 150 uniform samplerCube Texture; in vec3 v_tex_coord; out vec4 out_color; void main() { out_color = texture(Texture, v_tex_coord); } "; #endregion var vs = glContext.Create.VertexShader(vertexShaderText); var fs = glContext.Create.FragmentShader(fragmentShaderText); shaderProgram = glContext.Create.Program(new ShaderProgramDescription { VertexShaders = new[] { vs }, FragmentShaders = new[] { fs }, VertexAttributeNames = new[] { "in_position" }, UniformBufferNames = new[] { "Camera" }, SamplerNames = new[] { "Texture" } }); var vertices = new[] { new Vector4(-10, -10, -1, 1), new Vector4(-10, 10, -1, 1), new Vector4(10, 10, -1, 1), new Vector4(10, -10, -1, 1), new Vector4(-10, -10, 1, 1), new Vector4(-10, 10, 1, 1), new Vector4(10, 10, 1, 1), new Vector4(10, -10, 1, 1), }; var indices = new[] { 0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 0, 4, 7, 0, 7, 3, 0, 4, 5, 0, 5, 1, 1, 5, 6, 1, 6, 2, 3, 7, 6, 3, 6, 2 }; IBuffer vertexBuffer; fixed(Vector4 *data = vertices) vertexBuffer = glContext.Create.Buffer(BufferTarget.Array, 4 * sizeof(float) * vertices.Length, BufferUsageHint.StaticDraw, (IntPtr)data); IBuffer indexBuffer; fixed(int *data = indices) indexBuffer = glContext.Create.Buffer(BufferTarget.ElementArray, sizeof(int) * indices.Length, BufferUsageHint.StaticDraw, (IntPtr)data); vao = glContext.Create.VertexArray(); vao.SetVertexAttributeF(0, vertexBuffer, VertexAttributeDimension.Three, VertexAttribPointerType.Float, false, 4 * sizeof(float), 0); vao.SetElementArrayBuffer(indexBuffer); cameraUb = new UniformBufferSugar <Matrix4x4>(glContext); }
public unsafe BlurDrawer(IContext glContext) { this.glContext = glContext; #region Shader Text const string vertexShaderText = @"#version 150 in vec2 in_position; in vec2 in_tex_coord; out vec2 v_tex_coord; void main() { gl_Position = vec4(in_position, 0, 1); v_tex_coord = in_tex_coord; } "; const string fragmentShaderText = @"#version 150 uniform sampler2D DiffuseMap; layout(std140) uniform Params { int OffsetX; int OffsetY; int Width; int Height; }; in vec2 v_tex_coord; out vec4 out_color; void main() { ivec2 coord = ivec2(gl_FragCoord); //vec4 color = vec4(0, 0, 0, 0); //color += texelFetch(DiffuseMap, coord / 4 + ivec2(-1, -1), 2) / 16; //color += texelFetch(DiffuseMap, coord / 4 + ivec2(-1, 0), 2) / 8; //color += texelFetch(DiffuseMap, coord / 4 + ivec2(-1, 1), 2) / 16; //color += texelFetch(DiffuseMap, coord / 4 + ivec2(0, -1), 2) / 8; //color += texelFetch(DiffuseMap, coord / 4 + ivec2(0, 0), 2) / 4; //color += texelFetch(DiffuseMap, coord / 4 + ivec2(0, 1), 2) / 8; //color += texelFetch(DiffuseMap, coord / 4 + ivec2(1, -1), 2) / 16; //color += texelFetch(DiffuseMap, coord / 4 + ivec2(1, 0), 2) / 8; //color += texelFetch(DiffuseMap, coord / 4 + ivec2(1, 1), 2) / 16; //out_color = color; //out_color = vec4(1, 0, 1, 1); //out_color = texture(DiffuseMap, vec2(gl_FragCoord.x / 500, gl_FragCoord.y / 500));// vec4(gl_FragCoord.x / 500, gl_FragCoord.y / 500, 0, 1); out_color = texture(DiffuseMap, vec2((gl_FragCoord.x + OffsetX) / Width, (gl_FragCoord.y + OffsetY) / Height), 4); } "; #endregion var vs = glContext.Create.VertexShader(vertexShaderText); var fs = glContext.Create.FragmentShader(fragmentShaderText); shaderProgram = glContext.Create.Program(new ShaderProgramDescription { VertexShaders = new[] { vs }, FragmentShaders = new[] { fs }, VertexAttributeNames = new[] { "in_position" }, UniformBufferNames = new [] { "Params" }, SamplerNames = new [] { "DiffuseMap" }, }); var vertices = new[] { new Vector4(-1, -1, 0, 0), new Vector4(-1, 1, 0, 1), new Vector4(1, -1, 1, 0), new Vector4(1, 1, 1, 1), }; IBuffer vertexBuffer; fixed(Vector4 *data = vertices) vertexBuffer = glContext.Create.Buffer(BufferTarget.Array, 4 * sizeof(float) * vertices.Length, BufferUsageHint.StaticDraw, (IntPtr)data); vao = glContext.Create.VertexArray(); vao.SetVertexAttributeF(0, vertexBuffer, VertexAttributeDimension.Two, VertexAttribPointerType.Float, false, 4 * sizeof(float), 0); //vao.SetVertexAttributeF(1, vertexBuffer, VertexAttributeDimension.Two, VertexAttribPointerType.Float, false, 4 * sizeof(float), 2 * sizeof(float)); paramsUb = new UniformBufferSugar <IntVector4>(glContext); }
public unsafe QuadDrawer(IContext glContext) { this.glContext = glContext; #region Shader Text const string vertexShaderText = @"#version 150 in vec4 in_vertex; out vec2 v_tex_coord; void main() { gl_Position = vec4(in_vertex.xy, 0.5, 1.0); v_tex_coord = in_vertex.zw; } "; const string colFragmentShaderText = @"#version 150 layout(std140) uniform ColorUb { vec4 Color; }; out vec4 out_color; void main() { out_color = Color; } "; const string texFragmentShaderText = @"#version 150 uniform sampler2D Texture; in vec2 v_tex_coord; out vec4 out_color; void main() { out_color = texture(Texture, v_tex_coord); } "; #endregion var vs = glContext.Create.VertexShader(vertexShaderText); var colFs = glContext.Create.FragmentShader(colFragmentShaderText); var texFs = glContext.Create.FragmentShader(texFragmentShaderText); colShaderProgram = glContext.Create.Program(new ShaderProgramDescription { VertexShaders = new[] { vs }, FragmentShaders = new[] { colFs }, VertexAttributeNames = new[] { "in_vertex" }, UniformBufferNames = new[] { "ColorUb" }, }); texShaderProgram = glContext.Create.Program(new ShaderProgramDescription { VertexShaders = new[] { vs }, FragmentShaders = new[] { texFs }, VertexAttributeNames = new[] { "in_vertex" }, SamplerNames = new[] { "Texture" } }); var vertices = new[] { new Vector4(-1, -1, 0, 0), new Vector4(-1, 1, 0, 1), new Vector4(1, -1, 1, 0), new Vector4(1, 1, 1, 1), }; IBuffer vertexBuffer; fixed(Vector4 *data = vertices) vertexBuffer = glContext.Create.Buffer(BufferTarget.Array, 4 * sizeof(float) * vertices.Length, BufferUsageHint.StaticDraw, (IntPtr)data); vao = glContext.Create.VertexArray(); vao.SetVertexAttributeF(0, vertexBuffer, VertexAttributeDimension.Four, VertexAttribPointerType.Float, false, 4 * sizeof(float), 0); colorUb = new UniformBufferSugar <Color4>(glContext); }