|
08.12.2009, 16:51
|
#1
|
ПроЭктировщик
Регистрация: 15.10.2009
Сообщений: 190
Написано 47 полезных сообщений (для 142 пользователей)
|
Software Rasterizer
Пописываю время от времени софтварный растеризатор
На даный момент реализовано:
- Depth Test
- Depth Early Test
- Alpha Test
- Alpha Blend
- Culling - None,BackFace,FrontFace
- 1D,2D Texture
- Vertex\Pixel Shader's
Демка не большая( Необходимы редисты 2008 вижл студии ),в демке простое по пиксельное освещение от направленого источника,разрешение 1024x768:
|
(Offline)
|
|
08.12.2009, 20:29
|
#2
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
Ответ: Software Rasterizer
Интересная вещь, но:
- Текстура не отображается (она должна быть на чайнике?)
- Хотелось бы посмотреть зависимость производительности от полигонажа сцены и разрешения текстур.
- Vertex\Pixel Shader's это как я понимаю софтварный аналог шейдеров, но он ничем не ограничен? Будет стандартный базовый набор?
- Смысл написания такого рендера не совсем ясен. Сейчас наоборот стараются делать более программируемый процесс рендера (теже вычислительные шейдеры dx11) чтобы для каждого приложения можно было делать оригинальные варианты, а в этой демке как бы даже не API а сам рендер...
- Есть возможность посмотреть коды?
|
(Offline)
|
|
08.12.2009, 20:38
|
#3
|
ПроЭктировщик
Регистрация: 15.10.2009
Сообщений: 190
Написано 47 полезных сообщений (для 142 пользователей)
|
Ответ: Software Rasterizer
Сообщение от Samodelkin
Интересная вещь, но:
- Текстура не отображается (она должна быть на чайнике?)
- Хотелось бы посмотреть зависимость производительности от полигонажа сцены и разрешения текстур.
- 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;
}
|
(Offline)
|
|
08.12.2009, 21:02
|
#4
|
ПроЭктировщик
Регистрация: 15.10.2009
Сообщений: 190
Написано 47 полезных сообщений (для 142 пользователей)
|
Ответ: Software Rasterizer
Вот с текстурой(3 чайника),фильтрация текстур - BILINEAR.
|
(Offline)
|
|
08.12.2009, 21:32
|
#5
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
Ответ: Software Rasterizer
Текстура всеравно не отображается...
Да короче производительность влияет от кол-ва пикселей на экране и их глубины (также как и в программном режиме пиксельных шейдеров в DirectX) - это проблема для отрисовки закрытых пространств и скайбоксов.
SDL (это та SDL которая кроссплат OpenSource ?) ты используешь для взаимодействия с видеодрайвером? На каком уровне это происходит?
У меня раньше тоже была идея сделать рендер и графический API, даже видеодрайвер хотел переписать (вроде были под Linux с открытым кодом видеодрайвера) но ИМХО сейчас с появлением программируемых шейдеров я могу практически любой алгоритм отрисовки закодировать и необходимость отпала... Софтварный рендер будет эффективен в системах с цп без программируемого гп, например скоро выйдет процессор на ядре Clarkdale с видеочипом внутри (как бы тока DDR3 не оказалась медленной чтобы конкурировать хотябы с средними видеокарточками). Короче у цп должно быть достаточно много FPU, как например Cell в PS3. Возможно на новых сотовых телефонах такие мультимедийные цп будут...
|
(Offline)
|
|
08.12.2009, 21:34
|
#6
|
ПроЭктировщик
Регистрация: 15.10.2009
Сообщений: 190
Написано 47 полезных сообщений (для 142 пользователей)
|
Ответ: Software Rasterizer
Сообщение от Samodelkin
Текстура всеравно не отображается...
Да короче производительность влияет от кол-ва пикселей на экране и их глубины (также как и в программном режиме пиксельных шейдеров в DirectX) - это проблема для отрисовки закрытых пространств и скайбоксов.
SDL (это та SDL которая кроссплат OpenSource ?) ты используешь для взаимодействия с видеодрайвером? На каком уровне это происходит?
У меня раньше тоже была идея сделать рендер и графический API, даже видеодрайвер хотел переписать (вроде были под Linux с открытым кодом видеодрайвера) но ИМХО сейчас с появлением программируемых шейдеров я могу практически любой алгоритм отрисовки закодировать и необходимость отпала... Софтварный рендер будет эффективен в системах с цп без программируемого гп, например скоро выйдет процессор на ядре Clarkdale с видеочипом внутри (как бы тока DDR3 не оказалась медленной чтобы конкурировать хотябы с средними видеокарточками). Короче у цп должно быть достаточно много FPU, как например Cell в PS3. Возможно на новых сотовых телефонах такие мультимедийные цп будут...
|
Забыл,пробел - включить\выключить текстурирование...
SDL юзаю только для создания окна,и заливаю в него отрендереный бекбуффер.
Ну с появлением CUDA & OpenCL я могу переписать свой растеризатор на GPU,без неоходимости написания всяких видеодрайверов
|
(Offline)
|
|
08.12.2009, 21:57
|
#7
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
Ответ: Software Rasterizer
Ну с появлением CUDA & OpenCL я могу переписать свой растеризатор на GPU,без неоходимости написания всяких видеодрайверов
|
Я думаю что тогда каждый новый проект будет делать свой рендер... хотя зато у тебя уже будет опыт.
Дело в том что работа с драйверами или напрямую с железом дает некоторую свободу действий вне ОС. Вдруг например появится новая ОС а тут и видеорендер готов
ИМХО еще в течени двух лет есть смысл придерживаться стандартов OpenGL и DirectX
|
(Offline)
|
|
08.12.2009, 22:02
|
#8
|
ПроЭктировщик
Регистрация: 15.10.2009
Сообщений: 190
Написано 47 полезных сообщений (для 142 пользователей)
|
Ответ: Software Rasterizer
Сообщение от Samodelkin
Я думаю что тогда каждый новый проект будет делать свой рендер... хотя зато у тебя уже будет опыт.
Дело в том что работа с драйверами или напрямую с железом дает некоторую свободу действий вне ОС. Вдруг например появится новая ОС а тут и видеорендер готов
ИМХО еще в течени двух лет есть смысл придерживаться стандартов OpenGL и DirectX
|
А мене вот перестал нравится DirectX с приходом DirectX 10,11...
А OpenGL с приходом OpenGL 3.0,3.1.
Хочется что то свое что будет удобно во всех аспектах для себя...
З.Ы. CUDA SDK,есть под 3 оси,Windows,Linux,Mac.
|
(Offline)
|
|
08.12.2009, 22:42
|
#9
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
Ответ: Software Rasterizer
Да OpenGL 3.0 провалился из за команды Khronos помойму. DirectX 10 тоже был не удачный, потому что перестройка была. А вот я читал про DirectX11 вроде даже ничего - тесселяция и мп-рендеринг перспективные направления, я сейчас в DirectX9 работаю но потом сразу планирую на 11 прыгнуть.
В целом у тебя зачетная вещь. Как будет готово я попробую его использовать.
|
(Offline)
|
|
08.12.2009, 23:30
|
#10
|
ПроЭктировщик
Регистрация: 15.10.2009
Сообщений: 190
Написано 47 полезных сообщений (для 142 пользователей)
|
Ответ: Software Rasterizer
Сообщение от Samodelkin
Да OpenGL 3.0 провалился из за команды Khronos помойму. DirectX 10 тоже был не удачный, потому что перестройка была. А вот я читал про DirectX11 вроде даже ничего - тесселяция и мп-рендеринг перспективные направления, я сейчас в DirectX9 работаю но потом сразу планирую на 11 прыгнуть.
В целом у тебя зачетная вещь. Как будет готово я попробую его использовать.
|
Ну вобще,в софтварном мне осталось сделать мип текстурирование,а остальное вроде готово,хотя я ещё планирую сделать шейдеры asm,из файла чтобы можно было шейдеры грузить на не впроге прогить,хотя это канеш многое урежит,но можно и то и это сделать. После уже буду выберать на что переводит,на CUDA или на OpenCL.
|
(Offline)
|
|
09.12.2009, 02:22
|
#11
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
Ответ: Software Rasterizer
Не на асме закодируешься шейдеры писать. Может тебе просто взять компилятор какогонибуть ЯВУ?
Самый просто вариант у рендера сделать поддрежку плагинов ввиде динамической библиотеки - вот тогда они и будут как шейдеры, даже больше.
|
(Offline)
|
|
09.12.2009, 03:21
|
#12
|
|
Ответ: Software Rasterizer
Igor'
а зачем всё это ?
растеризация на cuda\opencl будет в десятки (сотни?) раз медленнее чем напрямую гонять данные в opengl (по-сути cuda\opencl и есть такая же обвертка как и opengl или directx, видеодрайвер нужен в любом случае, в обход него не напишешь потому что у тебя нету спецификации видеочипа, я её видел только для ati r500)
софтварный растеризатор не сможет дать качество и скорость лучше чем видеокарта, но если уж совсем горит - есть софтварная open source реализация mesa 3d
для рейтрейса не подходит сама архитектура видеочипа, тут как не думай - будет медленно, а софтварному рейтрейсу и не нужна скорость, да и их уже полно создали, выбирай какой нравится
единственное где я вижу применение такому подходу - playstation 3, там некоторые графические фишки не боятся просчитывать на CPU
|
|
|
Эти 2 пользователя(ей) сказали Спасибо за это полезное сообщение:
|
|
09.12.2009, 13:00
|
#13
|
ПроЭктировщик
Регистрация: 15.10.2009
Сообщений: 190
Написано 47 полезных сообщений (для 142 пользователей)
|
Ответ: 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
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
10.12.2009, 21:43
|
#14
|
ПроЭктировщик
Регистрация: 15.10.2009
Сообщений: 190
Написано 47 полезных сообщений (для 142 пользователей)
|
Ответ: 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 инструкции.
Для софтварного драйвера готов парзер и интерпритатор.
|
(Offline)
|
|
10.12.2009, 21:46
|
#15
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Software Rasterizer
имхо выгодней было бы сделать поддержку существующих шейдеров а не выдумывать свои
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 04:01.
|