Форум: "Игры";
Текущий архив: 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.055 c