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
 
имхо выгодней было бы сделать поддержку существующих шейдеров а не выдумывать свои


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

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