Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2011, 16:51   #1
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию Конвейер рендеринга.

Как его не слишком мудрено и удобно можно сделать?

Единственно что пока пришло в голову. Описать абстрактный класс TRenderable с методом Draw(), который буду перекрывать в потомках.
Скажем в TRenderableSphere и TRenderableBox. Для этих классов делаю либо сложные конструкторы c кучей параметров либо специализированные Factory. И далее объекты добавляются к Renderer в список для прорисовки, перед этим сортировка по удалению от камеры и размеру. Все… но я что-то упусти думаю даже много, но что? И вообще кто как делает?
Наглядно это у меня пока выглядит так...
Код:
procedure Rendering();
begin
  if (DEVICE.TestCooperativeLevel = D3D_OK) then begin
  	DEVICE.Clear(0, nil, D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 255), 1, 0);
    DEVICE.BeginScene();

    DrawAll();

    DEVICE.EndScene();
    Device.Present(nil,nil,0,nil);
  end
  else begin
  	if (MessageBoxA(0,'Произошла потеря устройства отрисовки', 'Ошибка фазы прорисовки', MB_OKCANCEL or MB_ICONWARNING) = MB_OK) then
  		DEVICE.Reset(pp)
    else
    	PostQuitMessage(1);
  end;
end;
end.
ф-я Rendering() вызывается в главном цикле программы, если нет сообщений окну. он в свою очередь вызывает DrawAll(), который выглядит так...

Код:
unit Renderer;

interface

const RENDERABLE_MAX  = 1024;
const RENDERABLE_ERROR : Cardinal = 0;
const RENDERABLE_SUCCESS : Cardinal = 1;

type

	PTRenderable = ^TRenderable;
	TRenderable = class
  private
  	index : Cardinal;
  public
  	function Draw(): Integer;virtual;abstract;
	end;

	procedure DrawAll();
  function IncludeToRendering(var obj : TRenderable ): Integer;
  procedure ExcludeFromRendering(var obj : TRenderable);

var
  RenderableList : Array[0..RENDERABLE_MAX] of PTRenderable;  { Список }
  ActiveCount : Integer;     			{ Кол-во активных рисуемых объектов в списке }
  LastIndexAdding : Integer; 			{ Позиция последнего помещения }
  LastIndexDeleting : Integer; 		{ Позиция последнего удаления }
implementation

procedure DrawAll();
var
	e : PTRenderable;
begin
	ActiveCount := 0;
  for e in RenderableList do
  begin
  	if (e <> nil) then
    	begin
    		e.Draw();
      	inc(ActiveCount)
    	end;
  end;

end;

function IncludeToRendering(var obj : TRenderable ): Integer;
begin
	if (ActiveCount < RENDERABLE_MAX) then
  	begin
    	if LastIndexDeleting <> -1 then
      	begin
      		RenderableList[LastIndexDeleting]:= @obj;
          LastIndexDeleting:=-1;
        end
      else
        begin
        	RenderableList[LastIndexAdding]:= @obj;
          inc(LastIndexAdding);
        end;
    result := RENDERABLE_SUCCESS;
    exit;
  	end
  else
  	result := RENDERABLE_ERROR;
end;

procedure ExcludeFromRendering(var obj : TRenderable);
begin
	LastIndexDeleting := obj.index;
  RenderableList[LastIndexDeleting]:=nil;
end;

{ Инициализация }
initialization
begin
	ActiveCount:=0;
  LastIndexAdding:=0;
  LastIndexDeleting:=-1;
end;
end.

Последний раз редактировалось Warn; 14.11.2011 в 20:33. Причина: Ашыбки
Warn вне форума Ответить с цитированием
Старый 16.12.2011, 09:51   #2
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
Радость

Для потомков))
Тут много чего интересного про конвеер... этого как его? рендеринга - вот! С 15-тью фазами...%
http://www.geeks3d.com/20111025/the-...d-frostbite-2/
Warn вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ленточный конвейер.... dj-Oleg Помощь студентам 2 03.11.2011 15:57
программа "комплектовочный конвейер" forsaken Помощь студентам 4 11.04.2011 12:36
Shell на C(Конвейер) l1pton17 Общие вопросы C/C++ 0 01.11.2010 22:01