forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты C++ (http://forum.boolean.name/forumdisplay.php?f=56)
-   -   Software Rasterizer (http://forum.boolean.name/showthread.php?t=11369)

Igor' 08.12.2009 16:51

Software Rasterizer
 
Вложений: 1
Пописываю время от времени софтварный растеризатор :-)


На даный момент реализовано:

- Depth Test
- Depth Early Test
- Alpha Test
- Alpha Blend
- Culling - None,BackFace,FrontFace
- 1D,2D Texture
- Vertex\Pixel Shader's


Демка не большая( Необходимы редисты 2008 вижл студии ),в демке простое по пиксельное освещение от направленого источника,разрешение 1024x768:

Samodelkin 08.12.2009 20:29

Ответ: Software Rasterizer
 
Интересная вещь, но:
- Текстура не отображается (она должна быть на чайнике?)
- Хотелось бы посмотреть зависимость производительности от полигонажа сцены и разрешения текстур.
- Vertex\Pixel Shader's это как я понимаю софтварный аналог шейдеров, но он ничем не ограничен? Будет стандартный базовый набор?
- Смысл написания такого рендера не совсем ясен. Сейчас наоборот стараются делать более программируемый процесс рендера (теже вычислительные шейдеры dx11) чтобы для каждого приложения можно было делать оригинальные варианты, а в этой демке как бы даже не API а сам рендер...
- Есть возможность посмотреть коды?

Igor' 08.12.2009 20:38

Ответ: Software Rasterizer
 
Цитата:

Сообщение от Samodelkin (Сообщение 128794)
Интересная вещь, но:
- Текстура не отображается (она должна быть на чайнике?)
- Хотелось бы посмотреть зависимость производительности от полигонажа сцены и разрешения текстур.
- Vertex\Pixel Shader's это как я понимаю софтварный аналог шейдеров, но он ничем не ограничен? Будет стандартный базовый набор?
- Смысл написания такого рендера не совсем ясен. Сейчас наоборот стараются делать более программируемый процесс рендера (теже вычислительные шейдеры dx11) чтобы для каждого приложения можно было делать оригинальные варианты, а в этой демке как бы даже не API а сам рендер...
- Есть возможность посмотреть коды?

- Нет
- Зависит не от полигонажа а от растояние,тоесть если даже взять тупо один триугольник подлететь к нему чтобы он отображался во весь экран,то фпс будет равен 0.0005 :).
-
Код:

class TestVertexShader : public VertexShader
{
public:

        TestVertexShader() : VertexShader(){}


        VertexOutput shader_main( const VertexInput& input ){
                VertexOutput output = VertexOutput();
                Vertex* vertex = (Vertex*)input.getInput();

                float4 pos = float4(vertex->xyz , 1.0f);
               
                VertexOutput::Element* st = output.createElement(VertexOutput::FLOAT2);
                st->data = float4(vertex->texcoord.x,vertex->texcoord.y,0,0);
               
                float NdL = dot(vertex->normal,float3(0,1.0f,0));
                float3 diffuse = NdL > 0 ? NdL : 0;

                VertexOutput::Element* normal = output.createElement(VertexOutput::FLOAT3);
                normal->data = float4(diffuse,0);

                float4x4 w = getFloat4x4("world");
                float4x4 vp = getFloat4x4("viewProj");

                float4 res = mul(pos,w);
                res = mul(vp,res);

                output.setOutput( res );
                return output;
        }
};

static bool texturing = false;


class TestPixelShader : public PixelShader
{
public:

        PixelOutput shader_main( const VertexOutput& input ){
                PixelOutput output = PixelOutput();
                float3 diffuse = input.getElement(1)->data.xyz();
                float4 pixel = texturing ? texture2D(getSampler(0),input.getElement(0)->data.xy()) : float4(1,1,1,1);
                float3 base = texturing ? pixel.xyz() : float3(1,1,1);
                float alpha = texturing ? pixel.w : 1.0f;
                output.setOutput( float4(base * diffuse,alpha));
                return output;
        }
};

- Ну я не пишу мега растеризатор,пишу просто ради скила,да и просто интерестно.
- Пока проект не опенсурсный,но как надоест,выложу сурсы :)

Сурс демки(программы)
Код:

static Texture2D* diffuseMap = 0;
static Texture2D* back_buffer = 0;
static Texture2D* depth_buffer = 0;
static Texture2D* stencil_buffer = 0;




int main(int argc,char*argv[]){

        bool fullscreen = true;
        int width = 1024,height = 768;

        SDL_Init(SDL_INIT_VIDEO);

        SDL_Surface*    buffer = SDL_SetVideoMode(width,height,24,SDL_HWSURFACE | (fullscreen ? SDL_FULLSCREEN : 0));
        SDL_Event      event;



        Raster* raster = new Raster();
    raster->setViewport(0,0,width,height);


        back_buffer = raster->createTexture2D(Surface::RGB,1);
        back_buffer->getLevel(0)->initialize(width,height);
        depth_buffer = raster->createTexture2D(Surface::R_F,1);
        depth_buffer->getLevel(0)->initialize(width,height);
        stencil_buffer = raster->createTexture2D(Surface::R,1);
        stencil_buffer->getLevel(0)->initialize(width,height);
        RenderTarget* rt = raster->createRenderTarget(back_buffer->getLevel(0),depth_buffer->getLevel(0),stencil_buffer->getLevel(0));

        diffuseMap = raster->createTexture2D(Surface::RGBA,1);
        int dm_w,dm_h;
        unsigned char* dm = load_tga("02.tga",dm_w,dm_h);
        diffuseMap->getLevel(0)->initialize(dm_w,dm_h);
        diffuseMap->getLevel(0)->setData(dm);

        Sampler* diffuseSampler = raster->createSampler();
        diffuseSampler->setMipFiltration(Sampler::FLT_NONE);
        diffuseSampler->setFiltration(Sampler::FLT_NONE);
        diffuseSampler->setAddressing(Sampler::ADRS_CLAMP);
        diffuseSampler->setTexture(diffuseMap);

        unsigned int num_vertex =  0;
        unsigned int num_indices = 0;
        unsigned int num_triangle = 0;

        FILE* file = fopen("teapot.bin","rb");
    fread(&num_vertex,sizeof(unsigned int),1,file);
    fread(&num_indices,sizeof(unsigned int),1,file);
        num_triangle = num_indices / 3;
        Vertex* vertices = new Vertex[num_vertex];
    fread(vertices,sizeof(Vertex),num_vertex,file);
    unsigned short* indices = new unsigned short[num_indices];
    fread(indices,sizeof(unsigned short),num_indices,file);
        fclose(file);

        Buffer* vb = raster->createBuffer(sizeof(Vertex)*num_vertex);
        void* data = 0;
        vb->map((void**)&data,0);
        memcpy(data,vertices,sizeof(Vertex)*num_vertex);
        vb->unmap();

        Buffer* ib = raster->createBuffer(sizeof(unsigned short)*num_indices);
        void* ib_data = 0;
        ib->map((void**)&ib_data,0);
        memcpy(ib_data,indices,sizeof(unsigned short)*num_indices);
        ib->unmap();


        raster->setVertexBuffer(vb,sizeof(Vertex));
        raster->setIndexBuffer(ib,false);
        raster->setCullMode(Raster::CULL_CCW);
        raster->setDepthTest(true,true);
        raster->setDepthWrite(true);
        raster->setDepthFunc(Raster::CMP_LESS);
        raster->setColorWrite(true);
        raster->setAlphaBlend(false);
        raster->setAlphaTest(true);
        raster->setFillMode(Raster::FILL_SOLID);
        raster->setStencilTest(false);
        raster->setStencilWrite(false);


        raster->setRenderTarget(rt);

        VertexShader* vs = new TestVertexShader();
        PixelShader* ps = new TestPixelShader();
        ps->setSampler(0,diffuseSampler);


       

                       
        float4x4 proj = float4x4::perspectiveMatrix(PI/2,(float)width/height,1.0f,1024.0f);
        //float4x4 view = float4x4::translationMatrix(float3(0,2,-5.8f)) * float4x4::rotationMatrixYawPitchRoll(0,0,0);
        //view = -view;
       
        float3 cam_pos = float3(0,2,-5.8f);
        quatf cam_rot = quatf::yawPitchRollQuat(float3(0,0,0));
        float3 pos = float3(0,0,.0f);
        float3 pos1 = float3(0,-2.,0.0f);
        float3 pos2 = float3(0,2.,0.0f);



        quatf rot = quatf::yawPitchRollQuat(float3(0,0,0));
        float3 scl = float3(1,1,1);


        int frames = 0, ticks = SDL_GetTicks();
        bool running = true;
        float4 color = float4(0,0,0,1);

        float yaw = 0;
    while (running) {
                while (SDL_PollEvent(&event)){
            if ((event.type == SDL_QUIT) || ((event.type == SDL_KEYDOWN) && (event.key.keysym.sym == SDLK_ESCAPE)) )
                running = false;

          if (((event.type == SDL_KEYDOWN) && (event.key.keysym.sym == SDLK_SPACE)) )
                texturing = !texturing;
          if (((event.type == SDL_KEYDOWN) && (event.key.keysym.sym == SDLK_q)) )
                          raster->setAlphaTest(!raster->getAlphaTest());
          if (((event.type == SDL_KEYDOWN) && (event.key.keysym.sym == SDLK_w)) )
                          cam_pos += cam_rot * float3(0,0,1);
          if (((event.type == SDL_KEYDOWN) && (event.key.keysym.sym == SDLK_s)) )
                          cam_pos -= cam_rot * float3(0,0,1);
          if (((event.type == SDL_KEYDOWN) && (event.key.keysym.sym == SDLK_a)) )
                          cam_pos -= cam_rot * float3(1,0,0);
          if (((event.type == SDL_KEYDOWN) && (event.key.keysym.sym == SDLK_d)) )
                          cam_pos += cam_rot * float3(1,0,0);

                }


                rot = quatf::yawPitchRollQuat(float3(0,yaw,0)*DEG2RAD);

                if(yaw > 360.0f)
                        yaw = 0.0f;

                const float4x4 view = -(float4x4::translationMatrix(cam_pos) * float4x4::rotationMatrix(cam_rot));
         
                const float4x4 world = float4x4::translationMatrix(float3(pos)) * float4x4::rotationMatrix(rot) * float4x4::scaleMatrix(scl);
                const float4x4 world1 = float4x4::translationMatrix(float3(pos1)) * float4x4::rotationMatrix(rot) * float4x4::scaleMatrix(scl);
                const float4x4 world2 = float4x4::translationMatrix(float3(pos2)) * float4x4::rotationMatrix(rot) * float4x4::scaleMatrix(scl);
                                               
                const float4x4 matrix = view * proj;

                rt->clear(RenderTarget::COLOR|RenderTarget::DEPTH,color,1.0f,255);


                // draw scene
                raster->setVertexShader(vs);
                raster->setPixelShader(ps);

                vs->setFloat4x4("viewProj",matrix);
                vs->setFloat4x4("world",world);
                raster->drawIndexedPrimitive(0,num_triangle);

                vs->setFloat4x4("world",world1);
                raster->drawIndexedPrimitive(0,num_triangle);

                vs->setFloat4x4("world",world2);
                raster->drawIndexedPrimitive(0,num_triangle);



                // fill sdl surface
                unsigned char* b_data = (unsigned char*)back_buffer->getLevel(0)->getData();
                memcpy(buffer->pixels,b_data,width*height*3);

                //save_tga("backbuffer.tga",b_data,width,height);
                //break;
               
                SDL_UpdateRect(buffer, 0, 0,width,height);

        frames++;
        int cur_ticks = SDL_GetTicks();
        if ((cur_ticks - ticks) > 1000) {
 
                        const int fps = (1000.0f / (float(cur_ticks - ticks) / frames));
                        const float ifps = 1.0f / fps;
                        std::cout << "FPS: " << fps << std::endl;
               
                        yaw += 100.5f * ifps;

                    frames = 0; ticks = cur_ticks;     
        }
               
                const float fps = (1000.0f / (float(cur_ticks - ticks) / frames));
                const float ifps = fps > 0 ? 1.0f / fps : 0;
                yaw += 100.5f * ifps;

    }

        return 0;
}


Igor' 08.12.2009 21:02

Ответ: Software Rasterizer
 
Вложений: 2
Вот с текстурой(3 чайника),фильтрация текстур - BILINEAR.

Samodelkin 08.12.2009 21:32

Ответ: Software Rasterizer
 
Текстура всеравно не отображается...

Да короче производительность влияет от кол-ва пикселей на экране и их глубины (также как и в программном режиме пиксельных шейдеров в DirectX) - это проблема для отрисовки закрытых пространств и скайбоксов.

SDL (это та SDL которая кроссплат OpenSource ?) ты используешь для взаимодействия с видеодрайвером? На каком уровне это происходит?

У меня раньше тоже была идея сделать рендер и графический API, даже видеодрайвер хотел переписать (вроде были под Linux с открытым кодом видеодрайвера) но ИМХО сейчас с появлением программируемых шейдеров я могу практически любой алгоритм отрисовки закодировать и необходимость отпала... Софтварный рендер будет эффективен в системах с цп без программируемого гп, например скоро выйдет процессор на ядре Clarkdale с видеочипом внутри (как бы тока DDR3 не оказалась медленной чтобы конкурировать хотябы с средними видеокарточками). Короче у цп должно быть достаточно много FPU, как например Cell в PS3. Возможно на новых сотовых телефонах такие мультимедийные цп будут...

Igor' 08.12.2009 21:34

Ответ: Software Rasterizer
 
Цитата:

Сообщение от Samodelkin (Сообщение 128807)
Текстура всеравно не отображается...

Да короче производительность влияет от кол-ва пикселей на экране и их глубины (также как и в программном режиме пиксельных шейдеров в DirectX) - это проблема для отрисовки закрытых пространств и скайбоксов.

SDL (это та SDL которая кроссплат OpenSource ?) ты используешь для взаимодействия с видеодрайвером? На каком уровне это происходит?

У меня раньше тоже была идея сделать рендер и графический API, даже видеодрайвер хотел переписать (вроде были под Linux с открытым кодом видеодрайвера) но ИМХО сейчас с появлением программируемых шейдеров я могу практически любой алгоритм отрисовки закодировать и необходимость отпала... Софтварный рендер будет эффективен в системах с цп без программируемого гп, например скоро выйдет процессор на ядре Clarkdale с видеочипом внутри (как бы тока DDR3 не оказалась медленной чтобы конкурировать хотябы с средними видеокарточками). Короче у цп должно быть достаточно много FPU, как например Cell в PS3. Возможно на новых сотовых телефонах такие мультимедийные цп будут...

Забыл,пробел - включить\выключить текстурирование...

SDL юзаю только для создания окна,и заливаю в него отрендереный бекбуффер.

Ну с появлением CUDA & OpenCL я могу переписать свой растеризатор на GPU,без неоходимости написания всяких видеодрайверов :)

Samodelkin 08.12.2009 21:57

Ответ: Software Rasterizer
 
Цитата:

Ну с появлением CUDA & OpenCL я могу переписать свой растеризатор на GPU,без неоходимости написания всяких видеодрайверов
Я думаю что тогда каждый новый проект будет делать свой рендер... хотя зато у тебя уже будет опыт.

Дело в том что работа с драйверами или напрямую с железом дает некоторую свободу действий вне ОС. Вдруг например появится новая ОС а тут и видеорендер готов :)

ИМХО еще в течени двух лет есть смысл придерживаться стандартов OpenGL и DirectX

Igor' 08.12.2009 22:02

Ответ: Software Rasterizer
 
Цитата:

Сообщение от Samodelkin (Сообщение 128819)
Я думаю что тогда каждый новый проект будет делать свой рендер... хотя зато у тебя уже будет опыт.

Дело в том что работа с драйверами или напрямую с железом дает некоторую свободу действий вне ОС. Вдруг например появится новая ОС а тут и видеорендер готов :)

ИМХО еще в течени двух лет есть смысл придерживаться стандартов OpenGL и DirectX

А мене вот перестал нравится DirectX с приходом DirectX 10,11...
А OpenGL с приходом OpenGL 3.0,3.1.

Хочется что то свое что будет удобно во всех аспектах для себя...

З.Ы. CUDA SDK,есть под 3 оси,Windows,Linux,Mac.

Samodelkin 08.12.2009 22:42

Ответ: Software Rasterizer
 
Да OpenGL 3.0 провалился из за команды Khronos помойму. DirectX 10 тоже был не удачный, потому что перестройка была. А вот я читал про DirectX11 вроде даже ничего - тесселяция и мп-рендеринг перспективные направления, я сейчас в DirectX9 работаю но потом сразу планирую на 11 прыгнуть.

В целом у тебя зачетная вещь. Как будет готово я попробую его использовать.

Igor' 08.12.2009 23:30

Ответ: Software Rasterizer
 
Цитата:

Сообщение от Samodelkin (Сообщение 128837)
Да OpenGL 3.0 провалился из за команды Khronos помойму. DirectX 10 тоже был не удачный, потому что перестройка была. А вот я читал про DirectX11 вроде даже ничего - тесселяция и мп-рендеринг перспективные направления, я сейчас в DirectX9 работаю но потом сразу планирую на 11 прыгнуть.

В целом у тебя зачетная вещь. Как будет готово я попробую его использовать.

Ну вобще,в софтварном мне осталось сделать мип текстурирование,а остальное вроде готово,хотя я ещё планирую сделать шейдеры asm,из файла чтобы можно было шейдеры грузить на не впроге прогить,хотя это канеш многое урежит,но можно и то и это сделать. После уже буду выберать на что переводит,на CUDA или на OpenCL.

Samodelkin 09.12.2009 02:22

Ответ: Software Rasterizer
 
Не на асме закодируешься шейдеры писать. Может тебе просто взять компилятор какогонибуть ЯВУ?
Самый просто вариант у рендера сделать поддрежку плагинов ввиде динамической библиотеки - вот тогда они и будут как шейдеры, даже больше.

jimon 09.12.2009 03:21

Ответ: Software Rasterizer
 
Igor'
а зачем всё это ?

растеризация на cuda\opencl будет в десятки (сотни?) раз медленнее чем напрямую гонять данные в opengl (по-сути cuda\opencl и есть такая же обвертка как и opengl или directx, видеодрайвер нужен в любом случае, в обход него не напишешь потому что у тебя нету спецификации видеочипа, я её видел только для ati r500)

софтварный растеризатор не сможет дать качество и скорость лучше чем видеокарта, но если уж совсем горит - есть софтварная open source реализация mesa 3d

для рейтрейса не подходит сама архитектура видеочипа, тут как не думай - будет медленно, а софтварному рейтрейсу и не нужна скорость, да и их уже полно создали, выбирай какой нравится

единственное где я вижу применение такому подходу - playstation 3, там некоторые графические фишки не боятся просчитывать на CPU

Igor' 09.12.2009 13:00

Ответ: Software Rasterizer
 
Обдумал класс драйвера,щас пишу софтварный драйвер,а сам растеризатор,пардон,GAPI,да да оно самое будет уже юзать класс драйвера :)

Код:

class BAPI Driver
{
public:

  enum{
    FMT_R = 1 << 0,
    FMT_RF = 1 << 1,
    FMT_RGB = 1 << 2,
    FMT_RGBF = 1 << 3,
    FMT_RGBA = 1 << 4,
    FMT_RGBAF = 1 << 5,
  };

  enum{
    FLOAT = 1 << 0,
    FLOAT2 = 1 << 1,
    FLOAT3 = 1 << 2,
    FLOAT4 = 1 << 3,
  };

  enum{
    PT_TRIANGLE_LIST = 1 << 0,
    PT_LINE_LIST = 1 << 1,
    PT_POINT_LIST = 1 << 2,
  };


  enum{
    FILL_SOLID = 1 << 0,
    FILL_POINT = 1 << 1,
    FILL_WIREFRAME = 1 << 2,
  };
 
  enum{
    CMP_NEVER = 1 << 0,
    CMP_EQUAL = 1 << 1,
    CMP_NOTEQUAL = 1 << 2,
    CMP_LESS = 1 << 3,
    CMP_LESSEQUAL = 1 << 4,
    CMP_GREATEREQUAL = 1 << 5,
    CMP_GREATER = 1 << 6,
    CMP_ALWAYS = 1 << 7,
  };

  /* Sample vertex format
    int vertexFormat[3];
    vertexFormat[0] = FLOAT3; //POSITION
    vertexFormat[1] = FLOAT3; //NORMAL
    vertexFormat[2] = FLOAT2; //TEXCOORD
  */

  Driver(){}
  virtual ~Driver(){}

  virtual const char* getLastError()const = 0;

  virtual const char* getDriverCodename()const{ return "Unknown-Driver"; }

  virtual void createBuffer( DriverPtr index , unsigned int length ) = 0;
  virtual void createTexture1D( DriverPtr index , unsigned int size , int format ) = 0;
  virtual void createTexture2D( DriverPtr index , unsigned int width , unsigned int height , unsigned int num_levels , int format ) = 0;
  virtual void createTextureCUBE( DriverPtr index , unsigned int width , unsigned int height , unsigned int num_levels , int format ) = 0;   
  virtual void createVertexFormat( DriverPtr index , int* format , int count ) = 0;
  virtual void createVertexShader( DriverPtr index , const char* source ) = 0;
  virtual void createPixelShader( DriverPtr index , const char* source ) = 0;


  virtual void texImage1D( DriverPtr index , const void* data ) = 0;
  virtual void texImage2D( DriverPtr index , const void* data , unsigned int level ) = 0;
    virtual void texImageCUBE( DriverPtr index , const void* data , unsigned int face , unsigned int level ) = 0;

  virtual void texParameterF( DriverPtr index , int pram , const float value ) = 0;
  virtual void texParameterI( DriverPtr index , int pram , const int value ) = 0;
  virtual void texParameterB( DriverPtr index , int pram , const bool value ) = 0;


  virtual void setVertexShader( DriverPtr index ) = 0;
  virtual void setPixelShader( DriverPtr index ) = 0;
  virtual void setVertexFormat( DriverPtr index ) = 0;
  virtual void setVertexBuffer( DriverPtr index , unsigned int stride ) = 0;
  virtual void setIndexBuffer( DriverPtr index , bool index32 ) = 0;
 
  virtual void setPrimitiveTopology( int topology ) = 0;
  virtual void getPrimitiveTopology( int* topology ) = 0;

  virtual void setScissor( int x , int y , int width , int height ) = 0;
  virtual void getScissort( int *x , int *x , int *width , int *height ) = 0;

  virtual void setViewport( int x , int y , int width , int height ) = 0;
  virtual void getViewport( int *x , int *y , int *width , int *height ) = 0;

  virtual void setVertexElementLocation( int element_index , const char* name );

  virtual void getUniformLocation( int *index ,  const char* name );
  virtual void setUniformF( int index , const float value ) = 0;
  virtual void setUniformB( int index , const bool value ) = 0;
  virtual void setUniformI( int index , const int value ) = 0;
  virtual void setUniformV2( int index , const float2& vector2 ) = 0;
  virtual void setUniformV3( int index , const float3& vector2 ) = 0;
  virtual void setUniformV4( int index , const float4& vector2 ) = 0;
  virtual void setUniformM( int index , const float4x4& matrix ) = 0;
  virtual void setUniformS( int index , DriverPtr index ) = 0;
  virtual void getUniformF( int index , float* value ) = 0;
  virtual void getUniformB( int index , bool* value ) = 0;
  virtual void getUniformI( int index , int* value ) = 0;
  virtual void getUniformV2( int index , float2* vector2 ) = 0;
  virtual void getUniformV3( int index , float3* vector2 ) = 0;
  virtual void getUniformV4( int index , float4* vector2 ) = 0;
  virtual void getUniformM( int index , float4x4* matrix ) = 0;
  virtual void getUniformS( int index , DriverPtr index ) = 0;

  virtual void setColorBuffer( int index , DriverPtr texture_ptr );
  virtual void setDepthBuffer( DriverPtr surface_index );

  virtual void drawPrimitive( unsigned int start , unsigned int primitiveCount ) = 0;
  virtual void drawIndexedPrimitive( unsigned int start , unsigned int primitiveCount ) = 0;
     

  virtual void setDepthTest( bool enable , bool early ) = 0;
  virtual void getDepthTest( bool* enable , bool* early ) = 0;

  virtual void setDepthWrite( bool enable ) = 0;
  virtual void getDepthWrite( bool* enable ) = 0;

  virtual void setDepthFunc( int func ) = 0;
  virtual void getDepthFunc( int* func )  = 0;

  virtual void setColorWrite( bool enable ) = 0;
  virtual void getColorWrite( bool enable ) = 0;

  virtual void setFillMode( int mode ) =  0;
  virtual void getFillMode( int* mode ) = 0;

  virtual void setAlphaTest( bool enable ) = 0;
  virtual void getAlphaTest( bool* enable ) = 0;

  /* Биндинг элементов вершины с шейдером

  driver->setVertexElementLocation( 0 , "position" );
  driver->setVertexElementLocation( 1 , "normal" );
  driver->setVertexElementLocation( 2 , "texcoord" );

    */
};

Ничего не говорите,суровый моё второе имя xD

Igor' 10.12.2009 21:43

Ответ: Software Rasterizer
 
Обдумал шейдерный язык,версия 1_0

VS
Код:


vs_1_0
dcl_input iPos,float4
dcl_output oPos,float4
dcl_uniform matrix,float4x4
mul oPos,iPos,matrix

PS
Код:


ps_1_0
dcl_output color,float4
set4 color,1,1,1,1

1_0 версия несёт в себе 32 инструкции.

Для софтварного драйвера готов парзер и интерпритатор.

Mr_F_ 10.12.2009 21:46

Ответ: Software Rasterizer
 
имхо выгодней было бы сделать поддержку существующих шейдеров а не выдумывать свои

Igor' 10.12.2009 21:49

Ответ: Software Rasterizer
 
Цитата:

Сообщение от Mr_F_ (Сообщение 129063)
имхо выгодней было бы сделать поддержку существующих шейдеров а не выдумывать свои


А в d3d,ogl идентичные шейдерные языки,просто у них ещё есть high level language,а это low level language тоесть у них идёт трансляция high level language -> low level language,тоесть я тоже потом могу сделать свой хайд левел язык и транслировать его в этот.

Igor' 11.12.2009 23:13

Ответ: Software Rasterizer
 
Вложений: 1
И так первая версия растеризатора с BSM(Burn Shader Model) версии 1.0





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

Код:

ps_1_0

/**************************************
*      Test Burn Shader Model 1.0    *
**************************************/



// Обявляем входную интерполируемую константу
dcl_varying out_color,float4

// это что мы будем писать во фрейм буффер xD
dcl_output out,float3

// Магия
st3 out,0.0,0.0,0.0
dcl NdL,float
st1 NdL,0.0
dcl nil,float
st1 nil,0.0
dcl light,float3
st3 light,0.0,1.0,0.0
dp3 NdL,out_color,light
dcl red,float3
st3 red,1.0,0.0,0.0
jle NdL,nil,8
mov out,red
mul out,out,NdL


Igor' 26.12.2009 13:24

Ответ: Software Rasterizer
 
Новый пиплайн готов:



Вывод одного триугольника,с тессиляцией (уровень 6),разрешение 512x512:

Mr_F_ 26.12.2009 14:32

Ответ: Software Rasterizer
 
хм...всегда было интересно, как работают геометрические шейдеры? на вход идут... вертексы? трианглы? и то и то? и что из него в результате выходит?

Igor' 26.12.2009 15:06

Ответ: Software Rasterizer
 
Цитата:

Сообщение от Mr_F_ (Сообщение 131143)
хм...всегда было интересно, как работают геометрические шейдеры? на вход идут... вертексы? трианглы? и то и то? и что из него в результате выходит?

На входе дается приметив,а что это триангл или линя,или точка,уже зависит от выставленого типа примитива,а что на выходе получается это уже зависит от того чего тебе надо на выходе :)

Геометрический шейдер это тот же вертексный шейдер только работает ни с одной вершиной а с несколькими,ну и можно в нем добавлять новые приметивы "на лету".

Igor' 27.12.2009 18:02

Ответ: Software Rasterizer
 
Добавил в пиплайн Compute Shader,и добавил ещё framework в апи,делаю сеймплы Ж)

Igor' 04.03.2010 13:32

Ответ: Software Rasterizer
 
Продолжаю тему софтварного рендеринга,пишу опенсурсный кроссплатформеный растеризатор в свободное от работы время,убийцу mesa3d вобщем.
SVN находится на sourceforge.net - https://sourceforge.net/projects/softogl/

dector 07.03.2010 01:19

Ответ: Software Rasterizer
 
Хаус-топик? О_о

SBJoker 07.03.2010 11:38

Ответ: Software Rasterizer
 
У вас волчанка!


Часовой пояс GMT +4, время: 17:02.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot