Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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);
        }