Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Проекты > Проекты C++

Ответ
 
Опции темы
Старый 08.12.2009, 16:51   #1
Igor'
ПроЭктировщик
 
Аватар для Igor'
 
Регистрация: 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:
Вложения
Тип файла: rar Demo.rar (269.1 Кб, 774 просмотров)
(Offline)
 
Ответить с цитированием
Старый 08.12.2009, 20:29   #2
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: Software Rasterizer

Интересная вещь, но:
- Текстура не отображается (она должна быть на чайнике?)
- Хотелось бы посмотреть зависимость производительности от полигонажа сцены и разрешения текстур.
- Vertex\Pixel Shader's это как я понимаю софтварный аналог шейдеров, но он ничем не ограничен? Будет стандартный базовый набор?
- Смысл написания такого рендера не совсем ясен. Сейчас наоборот стараются делать более программируемый процесс рендера (теже вычислительные шейдеры dx11) чтобы для каждого приложения можно было делать оригинальные варианты, а в этой демке как бы даже не API а сам рендер...
- Есть возможность посмотреть коды?
(Offline)
 
Ответить с цитированием
Старый 08.12.2009, 20:38   #3
Igor'
ПроЭктировщик
 
Аватар для Igor'
 
Регистрация: 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
Igor'
ПроЭктировщик
 
Аватар для Igor'
 
Регистрация: 15.10.2009
Сообщений: 190
Написано 47 полезных сообщений
(для 142 пользователей)
Ответ: Software Rasterizer

Вот с текстурой(3 чайника),фильтрация текстур - BILINEAR.
Миниатюры
Нажмите на изображение для увеличения
Название: Textured.jpg
Просмотров: 1151
Размер:	30.4 Кб
ID:	8482  
Вложения
Тип файла: rar Demo3.rar (350.3 Кб, 737 просмотров)
(Offline)
 
Ответить с цитированием
Старый 08.12.2009, 21:32   #5
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: Software Rasterizer

Текстура всеравно не отображается...

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

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

У меня раньше тоже была идея сделать рендер и графический API, даже видеодрайвер хотел переписать (вроде были под Linux с открытым кодом видеодрайвера) но ИМХО сейчас с появлением программируемых шейдеров я могу практически любой алгоритм отрисовки закодировать и необходимость отпала... Софтварный рендер будет эффективен в системах с цп без программируемого гп, например скоро выйдет процессор на ядре Clarkdale с видеочипом внутри (как бы тока DDR3 не оказалась медленной чтобы конкурировать хотябы с средними видеокарточками). Короче у цп должно быть достаточно много FPU, как например Cell в PS3. Возможно на новых сотовых телефонах такие мультимедийные цп будут...
(Offline)
 
Ответить с цитированием
Старый 08.12.2009, 21:34   #6
Igor'
ПроЭктировщик
 
Аватар для Igor'
 
Регистрация: 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
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: Software Rasterizer

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

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

ИМХО еще в течени двух лет есть смысл придерживаться стандартов OpenGL и DirectX
(Offline)
 
Ответить с цитированием
Старый 08.12.2009, 22:02   #8
Igor'
ПроЭктировщик
 
Аватар для Igor'
 
Регистрация: 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
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: Software Rasterizer

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

В целом у тебя зачетная вещь. Как будет готово я попробую его использовать.
(Offline)
 
Ответить с цитированием
Старый 08.12.2009, 23:30   #10
Igor'
ПроЭктировщик
 
Аватар для Igor'
 
Регистрация: 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
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: Software Rasterizer

Не на асме закодируешься шейдеры писать. Может тебе просто взять компилятор какогонибуть ЯВУ?
Самый просто вариант у рендера сделать поддрежку плагинов ввиде динамической библиотеки - вот тогда они и будут как шейдеры, даже больше.
(Offline)
 
Ответить с цитированием
Старый 09.12.2009, 03:21   #12
jimon
 
Сообщений: n/a
Ответ: Software Rasterizer

Igor'
а зачем всё это ?

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

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

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

единственное где я вижу применение такому подходу - playstation 3, там некоторые графические фишки не боятся просчитывать на CPU
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо за это полезное сообщение:
ABTOMAT (05.03.2010), Mr_F_ (09.12.2009)
Старый 09.12.2009, 13:00   #13
Igor'
ПроЭктировщик
 
Аватар для Igor'
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Mr_F_ (09.12.2009)
Старый 10.12.2009, 21:43   #14
Igor'
ПроЭктировщик
 
Аватар для Igor'
 
Регистрация: 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
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Software Rasterizer

имхо выгодней было бы сделать поддержку существующих шейдеров а не выдумывать свои
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как соединить движок Source(valve software) c Delphi ger1234567 Delphi 5 04.12.2008 10:12


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com