Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Вниз

Вывод изображения используя средства D3D   Найти похожие ветки 

 
Guest2005   (2005-03-11 11:14) [0]

Вопрос у меня следующий:
-Имеется текстура, имеется примитив ( прямоугольник). Нужно ето вывести в заданных координатах X,Y,Z=0


 
Sphinx ©   (2005-03-11 14:58) [1]

VertexBuffer есть ?
Данные в него заносятся ?
В этих данных есть координаты X, Y, Z ?
Флаг FVF выставлен ?

Если нужен код вывода прямоугольника - то смотри тут http://delphimaster.net/view/9-1110314085/

А хорошие статьи по наложению текстур есть на GameDev.RU


 
Guest2005   (2005-03-14 14:51) [2]

Спасиб. Будем пробовать дальше.


 
Guest2005   (2005-03-16 21:59) [3]

Никак у меня не выходит это дело.
Значится так:
- у меня есть изображение 128х128 пикселей
- имеется VertexBuffer с таким типом данных:
 TCustomVertex = record
   X,
   Y,
   Z,
   RHW: Single;
 end;

VertexBuffer создается так:
 d3ddev.CreateVertexBuffer(sizeof(TCustomVertex) * 4,
                           D3DUSAGE_WRITEONLY,
                           D3DFVF_XYZ,
                           D3DPOOL_DEFAULT,
                           vb,
                           nil);

Текстура создается так:
 D3DXCreateTextureFromFile(d3ddev,"img1.bmp",tx);

Вопрос:
 Как вывести эту текстуру на экране в координатах X=150 Y=220 ?


 
Sphinx ©   (2005-03-16 22:22) [4]

Посмотри вот тут, у меня проблемы были небольшие с наложением текстуры в том классе, может поможет, код оооочень подробный, правда с маленькими заморочками....
http://delphimaster.net/view/9-1110314085/

вот неплохая статейка, правда на С/С++
http://www.gamedev.ru/coding/20526.shtml


 
cyborg ©   (2005-03-17 09:49) [5]

На днях изучал основы, вот как получилось у меня:


> [3] Guest2005   (16.03.05 21:59)

CONST
 PVB_FVFSprite1 = D3DFVF_XYZRHW or D3DFVF_DIFFUSE or D3DFVF_TEX1;
TYPE
 TCustomSpriteVertex1 = packed record
   x, y, z    : Single;
   RHW        : Single;
   Color      : DWORD;
   tu, tv     : Single;
 end;
VAR
 p3DSpriteRect1 = ^t3DSpriteRect1;
 t3DSpriteRect1 = array[0..5] of TCustomSpriteVertex1;

Procedure CreateSpriteRect1(P : p3DSpriteRect1; X,Y,W,H : Single; TX1,TY1,TX2,TY2 : Single);
begin
 //Это вместо FillChar, просто обнуляет структуру по адресу p3DSpriteRect1:
 asm
 //Очищение данных:
 //->EAX     Pointer to data
 PUSH  EBX;
 XOR   EBX,EBX
 mov   [EAX]    , EBX
 mov   [EAX+4]  , EBX
 mov   [EAX+8]  , EBX
 mov   [EAX+12] , EBX
 mov   [EAX+16] , EBX
 mov   [EAX+20] , EBX
 mov   [EAX+24] , EBX
 POP   EBX;
 end; //asm
 P^[0].x:=X;
 P^[0].y:=Y;
 P^[0].tu:=TX1;
 P^[0].tv:=TY1;
 //Цвет, нужно ставить белый, но для различной раскраски
 //и писпользования прозрачности можно ставить на своё усмотрение:
 P^[0].Color:=$00FFFFFF;
 P^[1].x:=X+W;
 P^[1].y:=Y;
 P^[1].tu:=TX2;
 P^[1].tv:=TY1;
 P^[1].Color:=$00404040; //Просто с цветом играюсь, и далее
 P^[2].x:=X;
 P^[2].y:=Y+H;
 P^[2].tu:=TX1;
 P^[2].tv:=TY2;
 P^[2].Color:=$00808080;

 P^[3].x:=X;
 P^[3].y:=Y+H;
 P^[3].tu:=TX1;
 P^[3].tv:=TY2;
 P^[3].Color:=$00808080;
 P^[4].x:=X+W;
 P^[4].y:=Y;
 P^[4].tu:=TX2;
 P^[4].tv:=TY1;
 P^[4].Color:=$00404040;
 P^[5].x:=X+W;
 P^[5].y:=Y+H;
 P^[5].tu:=TX2;
 P^[5].tv:=TY2;
 P^[5].Color:=$00808080;
end;

..

инициализация вертексного буфера:

Var
 pb       : Pointer;

...
 Создаёшь вертексный буфер с нужным размером и все дела
 ...

 VBB.Lock(0,0,pb,d3dlock_discard);
 FillChar(pb^,VBDD.Size,0); //обнуление буфера (не обязательно, если всё равно его потом своими значениями заполняем)

 CreateSpriteRect1(pb, 256,256,256,256, 0,0,1,1);

 vbb.Unlock;

 vbb.PreLoad;

Отображение спрайта:

 //Установка текущей текстуры:
 iD3DDevice.SetTexture(0, TempTexture);

 //Установка теущего вертексного буфера:
 iD3DDevice.SetStreamSource(0, VBB, 0, SizeOf(TCustomSpriteVertex1));
 With iD3DDevice do
 begin
   SetRenderState(D3DRS_ZENABLE, D3DZB_False);
   SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
   //Тут играю с прозрачностью, чем темнее цвет вершин, тем прозрачнее получается
   SetRenderState(D3DRS_ALPHABLENDENABLE, 1);
   SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
   SetRenderState(D3DRS_DESTBLEND, D3DBLEND_DESTALPHA);
 end;

 //Естановка значения формата вертексов в буфере:
 iD3DDevice.SetFVF(PVB_FVFSprite1);

 //Вывод вертексов из буфера:
 iD3DDevice.DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);


 
Sapersky   (2005-03-17 12:13) [6]

http://www.mvps.org/directx/articles/blit3d.htm

Если кто-то не в ладах с английским/Си, поясняю:
1) Достаточно 4 вершин в виде стрипа или фэна
2) Чтобы нарисовалось в точности там, где нужно - вычитать из X,Y 0.5
4) rhw на самом деле необязательно считать по мудрёным формулам. Говорят, что работает вообще с любым, но по моему опыту лучше поставить 1.
3) Если рисовать по 2 треугольника, проще и быстрее (!) без VB (DrawPrimitiveUP). Всё что говорит MS про необходимость их использования, относится к тысячам-миллионам треугольников.


 
Sphinx ©   (2005-03-17 12:39) [7]

> проще и быстрее (!) без VB (DrawPrimitiveUP).


Renders data specified by a user memory pointer as a sequence of geometric primitives of the specified type.

Syntax

HRESULT DrawPrimitiveUP(
   D3DPRIMITIVETYPE PrimitiveType,
   UINT PrimitiveCount,
   CONST void* pVertexStreamZeroData,
   UINT VertexStreamZeroStride
);

Parameters

PrimitiveType
[in] Member of the D3DPRIMITIVETYPE enumerated type, describing the type of primitive to render.

PrimitiveCount
[in] Number of primitives to render. The maximum number of primitives allowed is determined by checking the MaxPrimitiveCount member of the D3DCAPS9 structure.

pVertexStreamZeroData
[in] User memory pointer to the vertex data. The vertex data must be in stream 0. (?)

VertexStreamZeroStride
[in] The number of bytes of data for each vertex. This value may not be 0.

Вот этого я не понял :( всё равно ведь в поток необходимо помещать в поток, причем 0-й...или я ошибаюсь ? SDK для 9-го DX если что.


 
Sapersky   (2005-03-17 14:31) [8]

[in] User memory pointer to the vertex data. The vertex data must be in stream 0. (?)

Вот этого я не понял


Наверное, они имеют в виду, что множественные stream source не поддерживаются. Вообще же это (как и написано) просто указатель на первый элемент массива (или, в трансляции Clootie, сам массив - const pVertexStreamZeroData;).
Пример использования DrawPrimitiveUP (на Си и DX8) см. по ссылке, которую я приводил.


 
Guest2005   (2005-03-17 14:32) [9]

Так, доберусь до дома попробую.
Если у меня опять будет беда, выложу исходник для работы над ошибками =)


 
Guest2005   (2005-03-17 18:55) [10]

Ну вот, с вашей помощью все получилось отлично. Спасибо за ссылки и примеры. Особенно помог пример Киборга.


 
Guest2005   (2005-03-19 19:56) [11]

Так с выводом изображения разобрался. Терь у меня возник другой вопрос:
При изменении координат вызываются VertexBuffer.Lock и VertexBuffer.UnLock. Это получается, что при выводе 500 изображений (спрайтов) надо 500 раз Lock и Unlock сделать ? Можно как то этого избежать или нет ? Нормальным это считается или нет ?


 
cyborg ©   (2005-03-19 20:41) [12]

Для рендеринга из памяти используй DrawPrimitiveUp, вертексный буфер создавать не надо будет.


 
Guest2005   (2005-03-20 01:13) [13]

При использовании DrawPrimitiveUp окрашивание вершин пропадает кудато. Как то не так выходит.
Может подскажете в чем проблема?
И еще, ето нормально или нет: 500-1000 раз делать Lock и Unlock буфферу ?


 
Sapersky   (2005-03-20 16:52) [14]

И еще, ето нормально или нет: 500-1000 раз делать Lock и Unlock буфферу?

Ненормально.
Лучше сделать буфер на 500-1000 спрайтов, один раз залочить, потом вывести всё сразу (если текстура и render states у спрайтов одинаковые). Возможно, это будет быстрее чем UP.
Да, использовать придётся triangle list или indexed list - последнее предпочтительнее (4 вершины на спрайт вместо 6, а буфер с индексами не меняется - можно заранее загнать его в видеопамять).
Ещё есть point sprites (см. DX SDK)...


 
Guest2005   (2005-03-21 13:23) [15]

Пожалуй так и поступлю: один раз закрыть буффер и занести все спрайты сразу. На Gamedev вычитал следующее про DrawPrimitiveUP:
Использование DrawPrimitiveUP() является ошибкой, вызывает задержки в работе процессора и всегда вызывает дополнительное копирование вершин.
Ну и у меня кудато пропадает цвет вершин при использовании DrawPrimitiveUP. Вот исходный код:


unit UD3D;

interface

uses
 Windows,
 Direct3D9,
 D3DX9;

type
 TCustomVertex = packed record
   X, Y, Z: Single;
   RHW    : Single;
   Color  : DWORD;
   U, V   : Single;
 end;

 PQuad = ^Quad;
 Quad  = array[0..3] of TCustomVertex;

var
 d3d    : IDirect3D9;
 d3ddev : IDirect3DDevice9;
 tx     : IDirect3DTexture9;
 d3dpp  : TD3DPresentParameters;
 MainWnd: HWND;
 p      : PQuad;

const
 D3DFVF_vertex = D3DFVF_XYZRHW or D3DFVF_DIFFUSE or D3DFVF_TEX1;

 function InitD3D: HResult;
 procedure CleanD3D;
 function Render: HResult;

implementation

function InitD3D: HResult;
begin
 d3d:=nil;
 d3d:=Direct3DCreate9(D3D_SDK_VERSION);
 if d3d=nil then
   begin
     Result:=E_FAIL;
     Exit;
   end;
 ZeroMemory(@d3dpp,SizeOf(d3dpp));
 with d3dpp do
   begin
     Windowed:=false;
     SwapEffect:=D3DSWAPEFFECT_DISCARD;
     BackBufferWidth:=800;
     BackBufferHeight:=600;
     BackBufferFormat:=D3DFMT_A8R8G8B8;
   end;
 Result:=d3d.CreateDevice(D3DADAPTER_DEFAULT,
                          D3DDEVTYPE_HAL,
                          MainWnd,
                          D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                          @d3dpp,
                          d3ddev);
p^[0].X := 100;
p^[0].Y := 228;
p^[0].Z := 0;
p^[0].RHW := 1.0;
p^[0].Color:=$00FFFFFF;
p^[0].U:=0;
p^[0].V:=0;

p^[1].X := 100;
p^[1].Y := 100;
p^[1].Z := 0;
p^[1].RHW := 1.0;
p^[1].Color:=$FFFFFFFF;
p^[1].U:=0;
p^[1].V:=1;

p^[2].X := 228;
p^[2].Y := 228;
p^[2].Z := 0;
p^[2].RHW := 1.0;
p^[2].Color:=$00FFFFFF;
p^[2].U:=1;
p^[2].V:=0;

p^[3].X := 228;
p^[3].Y := 100;
p^[3].Z := 0;
p^[3].RHW := 1.0;
p^[3].Color:=$00FFFFFF;
p^[3].U:=1;
p^[3].V:=1;

 D3DXCreateTextureFromFile(d3ddev,"img1.bmp",tx);

end;

procedure CleanD3D;
begin
 if (tx<>nil) then
   begin
     tx._Release;
     tx:=nil;
   end;
 if (d3ddev<>nil) then
   begin
     d3ddev._Release;
     d3ddev:=nil;
   end;
 if (d3d<>nil) then
   begin
     d3d._Release;
     d3d:=nil;
   end;

end;

function Render: HResult;
begin
 d3ddev.Clear(0, nil, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 150), 0, 0);
 d3ddev.BeginScene;
 d3ddev.SetFVF(D3DFVF_vertex);
 d3ddev.SetTexture(0,tx);

 d3ddev.SetRenderState(D3DRS_ZENABLE, D3DZB_False);
 d3ddev.SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
 d3ddev.SetRenderState(D3DRS_ALPHABLENDENABLE, 1);
 d3ddev.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
 d3ddev.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_DESTALPHA);

 d3ddev.DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, p, SizeOf(TCustomVertex);
 d3ddev.EndScene;
 Result:=d3ddev.Present(nil, nil, 0, nil);
end;
end.


Может делаю что то не так ?


 
Guest2005   (2005-03-21 13:26) [16]

В приведенном примере при изменении цвета вершин ничего не происходит.


 
Sphinx ©   (2005-03-21 13:41) [17]

Ну...нормально работающий пример у меня только один :) остальное или фигня полная, или не работает...

В общих чертах - это класс создания интерфейса в играх (окошки, панельки...прочее...)

 { устанавливаем размеры элемента }
 FLeft                 := 50;
 FTop                  := 50;
 FWidth                := 10;
 FHeight               := 10;
 FBorderWidth          := 2;
 FHeadWidth            := 15;
 FBorderColor          := $FFFBD05C;
 FBackgroundColor      := $FF754C23;
 FPointSize            := 1.0;

 { заполняем массив }
 FControlVPoints[0].Z      := 0;
 FControlVPoints[0].RHW    := 1.0;
 FControlVPoints[0].Color  := FBorderColor;
 FControlVPoints[1].Z      := 0;
 FControlVPoints[1].RHW    := 1.0;
 FControlVPoints[1].Color  := FBorderColor;
 FControlVPoints[2].Z      := 0;
 FControlVPoints[2].RHW    := 1.0;
 FControlVPoints[2].Color  := FBorderColor;
 FControlVPoints[3].Z      := 0;
 FControlVPoints[3].RHW    := 1.0;
 FControlVPoints[3].Color  := FBorderColor;
 FControlVPoints[4].Z      := 0;
 FControlVPoints[4].RHW    := 1.0;
 FControlVPoints[4].Color  := FBorderColor;
 FControlVPoints[5].Z      := 0;
 FControlVPoints[5].RHW    := 1.0;
 FControlVPoints[5].Color  := FBorderColor;

 { обнуляем переменные Direct3D }
 FControlVertexBuffer  := nil;
 FControlIndexBuffer   := nil;
 FControlPVertex       := nil;
 FControlTextureD9     := nil;

 { создаем буфер вершин }
 FHErrorResult := FD3DDevice^.CreateVertexBuffer(
                               SizeOf(FControlVPoints),
                               D3DUSAGE_DYNAMIC,
                               TD3DFVF_GUIVertex,
                               D3DPOOL_SYSTEMMEM,
                               FControlVertexBuffer,
                               nil);

 if FHErrorResult <> D3D_OK then Exit;

 FHErrorResult := FD3DDevice^.CreateIndexBuffer(
                               SizeOf(FControlBorderIndex),
                               D3DUSAGE_DYNAMIC,
                               D3DFMT_INDEX16,
                               D3DPOOL_SYSTEMMEM,
                               FControlIndexBuffer,
                               nil);

 if FHErrorResult <> D3D_OK then Exit;

 FControlBorderIndex[0] := 0;
 FControlBorderIndex[1] := 1;
 FControlBorderIndex[2] := 3;
 FControlBorderIndex[3] := 2;
 FControlBorderIndex[4] := 0;

 FHErrorResult := FControlIndexBuffer.Lock(0, SizeOf(FControlBorderIndex), FControlPVertex, 0);
 if FHErrorResult <> D3D_OK then Exit;

 Move (FControlBorderIndex, FControlPVertex^, SizeOf(FControlBorderIndex));

 FHErrorResult := FControlIndexBuffer.Unlock;
 if FHErrorResult <> D3D_OK then Exit;

 { создаем прямоугольник элемента }
 SetControlBounds;

в процедуре SetControlBounds:

 { заполнить координатные элементы массива }
 FControlVPoints[0].X := FLeft;
 FControlVPoints[0].Y := FTop + Integer(FHeight);
 FControlVPoints[0].U := 0;
 FControlVPoints[0].V := 0 - (FHeight / FControlTextureArray.Height);

 FControlVPoints[1].X := FLeft;
 FControlVPoints[1].Y := FTop;
 FControlVPoints[1].U := 0;
 FControlVPoints[1].V := 0;

 FControlVPoints[2].X := FLeft + Integer(FWidth);
 FControlVPoints[2].Y := FTop + Integer(FHeight);
 FControlVPoints[2].U := 0 - (FWidth / FControlTextureArray.Width);
 FControlVPoints[2].V := 0 - (FHeight / FControlTextureArray.Height);

 FControlVPoints[3].X := FLeft + Integer(FWidth);
 FControlVPoints[3].Y := FTop;
 FControlVPoints[3].U := 0 - (FWidth / FControlTextureArray.Width);
 FControlVPoints[3].V := 0;

 FControlVPoints[4].X := FLeft;
 FControlVPoints[4].Y := FTop + Integer(FHeadWidth);

 FControlVPoints[5].X := FLeft + Integer(FWidth);
 FControlVPoints[5].Y := FTop + Integer(FHeadWidth);

 { заполнить вертексный буфер }
 FHErrorResult := FControlVertexBuffer.Lock(0, SizeOf(FControlVPoints), FControlPVertex, 0);
 if FHErrorResult <> D3D_OK then Exit;

 Move (FControlVPoints, FControlPVertex^, SizeOf(FControlVPoints));

 FHErrorResult := FControlVertexBuffer.Unlock;


 
Sphinx ©   (2005-03-21 13:44) [18]

продолжение:
procedure TGUIControl.ControlRender;
begin
 { проверяем видим ли элемент }
 if not(FVisible) then Exit;
 { устанавливаем собственное значение FVF-флага }
 FHErrorResult := FD3DDevice^.SetFVF(TD3DFVF_GUIVertex);
 if FHErrorResult <> D3D_OK then Exit;
 { устанавливаем поток вертекстного буфера }
 FHErrorResult := FD3DDevice^.SetStreamSource(0, FControlVertexBuffer, 0, SizeOf(TGUIVertex));
 if FHErrorResult <> D3D_OK then Exit;

 { устанавливаем прозрачность отображения и её параметры }
 if FAlphaBlending then
   begin
     FHErrorResult := FD3DDevice^.SetRenderState(D3DRS_ALPHABLENDENABLE, iTrue);
     if FHErrorResult <> D3D_OK then Exit;
     FHErrorResult := FD3DDevice^.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
     if FHErrorResult <> D3D_OK then Exit;
     FHErrorResult := FD3DDevice^.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
   end
 else
   FHErrorResult := FD3DDevice^.SetRenderState(D3DRS_ALPHABLENDENABLE, iFalse);
 if FHErrorResult <> D3D_OK then Exit;

 { если на элемент наложена текстура - задаем текстуру }
 if FControlTextured then
   begin
     { собственно установка текстуры }
     FHErrorResult := FD3DDevice^.SetTexture(0, FControlTextureD9);
     if FHErrorResult <> D3D_OK then Exit;
     { установка параметров текстурирования }
     FHErrorResult := FD3DDevice^.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
     if FHErrorResult <> D3D_OK then Exit;
     FHErrorResult := FD3DDevice^.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
     if FHErrorResult <> D3D_OK then Exit;
     FHErrorResult := FD3DDevice^.SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
     if FHErrorResult <> D3D_OK then Exit;
     if FAlphaBlending then
       begin
         SetVertexColor($00000000 or (FAlphaBlendValue shl 24));
         FHErrorResult := FD3DDevice^.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
         if FHErrorResult <> D3D_OK then Exit;
         FHErrorResult := FD3DDevice^.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
         if FHErrorResult <> D3D_OK then Exit;
         FHErrorResult := FD3DDevice^.SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
         if FHErrorResult <> D3D_OK then Exit;
       end;
   end
 else
   begin
     SetVertexColor(FBackgroundColor);
   end;
 { отрисовка примитивов }
 FHErrorResult := FD3DDevice^.SetRenderState(D3DRS_POINTSIZE, PDWORD(@FPointSize)^);
 FHErrorResult := FD3DDevice^.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
 if FHErrorResult <> D3D_OK then Exit;
 { отключение текстурирования }
 if FControlTextured then
   begin
     FHErrorResult := FD3DDevice^.SetTexture(0, nil);
     if FHErrorResult <> D3D_OK then Exit;
   end;
 { устанавливаем цвет бордюра }
 SetVertexColor(FBorderColor);
 { отрисовываем бордюр, если есть }
 if FBordered then
   begin
     FD3DDevice^.SetIndices(FControlIndexBuffer);
     FD3DDevice^.DrawIndexedPrimitive(
                 D3DPT_LINESTRIP,    // тип примитивов
                 0,                  //
                 0,                  //
                 5,                  // количество вершин
                 0,                  // начальная вершина
                 4);                 // количество примитивов
     FD3DDevice^.SetIndices(nil);
   end;
 { отрисовываем заголовок, если есть }
 if FHeader then
   begin
     FD3DDevice^.DrawPrimitive(D3DPT_LINELIST, 4, 1);
   end;
end;


 
Sphinx ©   (2005-03-21 13:48) [19]

и еще немного:
procedure TGUIControl.SetVertexColor(aColor: DWORD);
begin
 FControlVPoints[0].Color  := aColor;
 FControlVPoints[1].Color  := aColor;
 FControlVPoints[2].Color  := aColor;
 FControlVPoints[3].Color  := aColor;
 FControlVPoints[4].Color  := aColor;
 FControlVPoints[5].Color  := aColor;
 SetControlBounds;
end;

procedure TGUIControl.SetAlphaBlendValue(aValue: Byte);
begin
 FAlphaBlendValue  := aValue;
 FBorderColor      := (FBorderColor - (FBorderColor and $FF000000)) or (FAlphaBlendValue shl 24);
 FBackgroundColor  := (FBackgroundColor - (FBackgroundColor and $FF000000)) or (FAlphaBlendValue shl 24);
 SetControlBounds;
end;

procedure TGUIControl.SetAlphaBlend(aAlpha: Boolean);
begin
 FAlphaBlending := aAlpha;
end;


В двух словах - что получилось.
Элемент может иметь произвольные размеры, при этом текстура накладывается на него с "растяжением", но может и не накладываться, если текстуры нет то рисую прямоугольник цветом фона, если есть - текстуру. Поддерживается прозрачность. Вокруг прямоугольника с текстурой рисуется обводка из четырёх линий, и еще одна линия изображающая заголовок окна, если есть этот самый заголовок...нужны комментарии кода - спрашивай :)


 
Guest2005   (2005-03-21 14:31) [20]

Выходит что при создании нового элемента каждый раз создается буффер фершин. Это при 100 элементах будет 100 буфферов ? Я правильно понял ?


 
Sphinx ©   (2005-03-21 15:02) [21]

правильно...но за количеством элементов у меня следит специальный менеджер...то есть хранятся описания и координаты элементов, а создаются они реально только когда необходимы...ведь реально то на экране более 50 элементов не планируется...

Была идея хранить все вершины в одном буфере менеджера, но мне показалось это слишком сложным, хотя как вариант это не отброшено. Да и множество буферов - это не так уж и плохо, хотя и не очень хорошо. Проблемы только при активных перемещениях элементов, происходит последовательная блокировка буферов всех элементов, а это порядка 50 штук (пока что три-четыре). И еще, если внимательно посмотреть, у меня при рендере буфер на данный момент дважды блокируется, пока что не до оптимизации, но вот этого надо бы избегать...а то получается до сотни блокировок за кадр :(

Вот с менеджером пока туго :) он не работает как я хочу :(


 
Guest2005   (2005-03-21 16:21) [22]

И все же я думаю надо будет использовать один буффер на всех. Приеду домой попробую данную затею. А за пример все равно спасибо


 
Sphinx ©   (2005-03-21 17:15) [23]

А я его не для того помещал что бы агитировать за множество буферов :) а для того что бы показать как можно менять цвет вершин и прозрачность, если нужна, и при этом еще и текстуру накладывать :)



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.049 c
3-1116151121
Рукма
2005-05-15 13:58
2005.06.29
Value of field CurrencyRate is out of range


1-1118149549
Lexander
2005-06-07 17:05
2005.06.29
Поток и текстовая переменная


4-1114426398
Суслик
2005-04-25 14:53
2005.06.29
TerminateProcess


1-1117777655
Homa_Programer
2005-06-03 09:47
2005.06.29
StringGrid &amp; mouse


14-1117441732
Rentgen
2005-05-30 12:28
2005.06.29
Рабросать N на Count чисел





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский