Войти
ПрограммированиеФорумГрафика

Графический конвеер и шейдеры (4 стр)

Страницы: 1 2 3 4
#45
11:25, 14 авг. 2018

nes
именно для этого компьют шейдеры и изобрели. всё, что непосредственно не связано с растеризацией, проще делать на них.


#46
11:35, 14 авг. 2018

Suslik
Игровую логику кто нить делал на них?
Просто в относительно несложных играх можно логику частично вынести на гпу

#47
12:09, 14 авг. 2018

>проще делать на них
охх лол

#48
12:47, 14 авг. 2018

monobogdan
> Просто в относительно несложных играх можно логику частично вынести на гпу
Учитывая творчество народных умельцев, ты туда все можешь вынести, процессору только FPS считать останется. Причем достаточно будет использовать один пиксельный шейдер.

#49
13:23, 14 авг. 2018

foxes
Писать игру на шейдерах извращение, но в крупных играх аля старбаунд не помешало бы часть логики перенести на гпу т.к игра требует более менее неплохого проца.

#50
14:32, 14 авг. 2018
struct Uniforms
{
    // user-defined
};
struct Attributes
{
    // user-defined
};
struct Varyings
{
    vec4 position;
    // user-defined
};
enum PrimitiveType
{
    Point,
    LineSet,
    LineStrip,
    TriangleSet,
    TriangleStrip,
    TriangleFan,
};
struct Texture2D;
struct Pixel
{
    int x;
    int y;
    vec4* data;
};

using VertexShader = Varyings(*)(Attributes const& vertex, Uniforms const& uniforms);
using FragmentShader = vec4(*)(Varyings const& fragment, Uniforms const& uniforms);
using BlendingOperator = vec4(*)(vec4 source, vec4 dest);

struct PipelineState
{
    VertexShader vertex_shader;
    FragmentShader fragment_shader;
    BlendingOperator blending_operator;
    Uniforms* uniforms;
    Texture2D* render_target;
};

void draw(PipelineState const& pipeline, PrimitiveType primitive_type, std::vector<Attributes> const& attr_buf)
{
    std::vector<Varyings> var_buf;
    for(Attributes const& vertex : attr_buf)
    {
        var_buf.push_back(pipeline.vertex_shader(attrs, *pipeline.uniforms));
    }
    std::vector<std::vector<Varyings>> primitive_buf = assemble_primitives(primitive_type, var_buf);
    std::vector<std::vector<Varyings>> clipped_buf;
    for(std::vector<Varyings>& primitive : primitive_buf)
    {
        std::vector<Varyings> clipped = clip_primitive(primitive);
        if(!cipped.empty())
        {
            clipped_buf.push_back(clipped);
        }
    }
    for(std::vector<Varyings>& clipped : clipped_buf)
    {
        for(Pixel pixel : pipeline.render_target)
        {
            if(is_pixel_within(pixel, clipped))
            {
                Varyings fragment = interpolate_varyings(pixel, clipped);
                vec4 source = pipeline.fragment_shader(fragment, *pipeline.uniforms);
                vec4 dest = *pixel.data;
                *pixel.data = pipeline.blending_operator(source, dest);
            }
        }
    }
}

std::vector<Varyings> transform_feedback(PipelineState const& pipeline, PrimitiveType primitive_type, std::vector<Attributes> const& attr_buf)
{
    std::vector<Varyings> var_buf;
    for(Attributes const& vertex : attr_buf)
    {
        var_buf.push_back(pipeline.vertex_shader(attrs, *pipeline.uniforms));
    }
    std::vector<std::vector<Varyings>> primitive_buf = assemble_primitives(primitive_type, var_buf);
    std::vector<std::vector<Varyings>> clipped_buf;
    for(std::vector<Varyings>& primitive : primitive_buf)
    {
        std::vector<Varyings> clipped = clip_primitive(primitive);
        if(!cipped.empty())
        {
            clipped_buf.push_back(clipped);
        }
    }
    return disassemble_primitives(primitive_type, clipped_buf);
}
#51
17:55, 14 авг. 2018

Suslik
> всё, что непосредственно не связано с растеризацией, проще делать на них.
Может быть проще, но не всегда производительно.

Страницы: 1 2 3 4
ПрограммированиеФорумГрафика

Тема в архиве.