Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: CL | DM;

Вниз

Вывод изображения используя средства 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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.043 c
3-1116167981
anton_m
2005-05-15 18:39
2005.06.29
Вопрос по StoredProc


1-1118240005
Norny
2005-06-08 18:13
2005.06.29
Как убрать scrollbar-ы в Twebbrowser


1-1118254543
нехочу называться
2005-06-08 22:15
2005.06.29
Упростить конструкцию


9-1111308695
grouzd[E]v
2005-03-20 11:51
2005.06.29
ASCII и треугольник


14-1118029888
КаПиБаРа
2005-06-06 07:51
2005.06.29
не балуйтесь с електричеством!!!