Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

OpenGL Extensions [Delphi, Windows]


Страницы:   1 2

grisme ©   (2006-02-22 14:36:00) 

Господа, не подскажете ли где достать заголовочники для Delphi с большинством популярных расширений OpenGL, ато искать приходится инфу по каждому расширению, какие в нем функции, etc.? А тут раз-и готово... =)


Pa5ha   (2006-03-16 13:39:00) [1]

Пытался написать демку с вбо. 9 машин по 1705 полигонов. В каждой по 223 бинда текстуры (блин, только ща заметил, надо написать оптимизатор), на gf4mx440 фпс 90, без биндов 100, на х700 фпс 110 с биндами. Почему фпс такой мелкий? Как его сделать побольше? Пример на всякий случай.
http://sampo.ru/~pashav/projects/basic_game_engine.rar

И фпс не меняется ни на единицу, если использовать передачу через указатель или с помощью вбо. Т.е. шины 16х агп хватает? А процессор разгружается в таком случае или возвращение из процедуры рисования происходит при завершении оного?


Pa5ha   (2006-03-07 01:28:00) [2]

Блин, опять не смог все  в одной мессаге.

СисУтилс я отключил перед тем, как запаковать и залить файлы. И все равно ошибок небыло.

GL_INDEX_ARRAY - а как без этого работает? В примере на си это было :)
   glBindBufferARB          ( GL_ARRAY_BUFFER_ARB, 0 );
   glEnableClientState      ( GL_INDEX_ARRAY  );
   glBindBufferARB          ( GL_ELEMENT_ARRAY_BUFFER_ARB, indexId );
   glIndexPointer           ( GL_UNSIGNED_INT, 0, 0 );

                                               // request draw
   glDrawElements  ( GL_TRIANGLES, 3*numFaces, GL_UNSIGNED_INT, 0 );

Кстати, в этом куске кода биндится нулевой буфер. И ведь компилируется, работает и выложено на компакте.


Pa5ha   (2006-03-07 01:24:00) [3]

в смысле в чем разница между этими командами? Какую раньше писать?


XProger   (2006-03-07 01:13:00) [4]

Еррор не вылезает т.к.
// SysUtils,
а в нём как раз прописана обработка этих ошибок :)

VBO проявляет свою истинную силу при > 3000 полигонов.

glActiveTextureARB
glClientActiveTextureARB
Включают текстурирование (обычно мультитекстурирование) при передаче индексов. Т.е. включил 0 блок, передал текстурные координаты для первой текстуры, 1 блок передал для второй и т.д. :)


Pa5ha   (2006-03-07 01:07:00) [5]

Все работает. Мои косяки генерации кривого тора. 3* faces_count вместо прсто faces_count %) Только вот фпс не радует совсем. С выводом через указатели было 250, с вбо 200.

и последний на сегодня вопрос, что же все-таки такое
glActiveTextureARB
glClientActiveTextureARB?


Pa5ha   (2006-03-07 01:03:00) [6]

Блин, меня сегодня глючит конкретно после автомастерской :) Тогда, видно тоже. Спасибо. Но почему ошибка деления на нольне вылезла ни разу?

И, кстати, тот рантайм еррор все равно вылезает :)


XProger   (2006-03-07 00:57:00) [7]

a:=r*sin(2*pi/j*sides);
Если это не понятно, то у тебя j = 0...

Индексов на нормали и текстурные координаты вершины - индексы фейсов.


Pa5ha   (2006-03-07 00:51:00) [8]

Нда, над тором ещё придется поработать :) Красивую синюю линию я уже увидел :) А вот насчет момента передачи намек что-то не понял... Ну пусть там храняться неопределенные значения, а в фейсах? Наверно тоже?

Странно, что sizeof(v) равное 4 байта меня раньше не навело ни на какие мысли :))

И ещё. Я так понял, в буфере индексов нельзя отдельно для каждой вершины задать индекс координат вершины, нормаль и текстурные координаты. Просто я пользуюсь форматом obj, а там в каждом фейсе 9 индексов т.е. на каждую из трех вершин приходится 3 индекса: на координаты вершины, нормаль и текстурные координаты. Придется переписывать конвертер формата?


XProger   (2006-03-06 23:24:00) [9]

Обманываю...
В момент передачи массива, в V хранятся NAN значения ;)
Угадай почему? ;)
     for j:=0 to sides-1 do
       begin
         a:=r*sin(2*pi/j*sides);

Остальное, за тобой ;)


XProger   (2006-03-06 23:15:00) [10]

1) @V @n, @t, @Faces - указатели на описание дин массивов, а не на их содержимое.
Исправить на @V[0] @n[0], @t[0], @Faces[0]

2)
glBegin(GL_TRIANGLES);
for i := 0 to faces_count div 3 - 1 do
 for j := 0 to 2 do
  glVertex3fv(@V[Faces[i * 3 + j]]);
glEnd;

вместо кода отрисовки, рисует тоже самое, что рисуется при исправлении ошибки пункта 1 %)

Вывод: генерируется нечто не хорошее (у меня прямая линия например)... ;)


Pa5ha   (2006-03-06 21:58:00) [11]

Итак, стал разбираться. Написал пример - не работает. Два дня искал багу, сделал последовательность команд, в точности, как у ХПрогер-а. Не работает. Блин, версий, почему не работает больше не осталось. Вылезает рантайм еррор при попытке вывода DrawElements.

Если есть добрый человек, то пример http://sampo.ru/~pashav/others/basicengine.rar45 кб. В исходнике много мусора, много лишнего, много требуещих дописывания моментов.

Карта гф4, остальные примеры работают.

Что значат команды
glActiveTextureARB
glClientActiveTextureARB?

Почему в примере с диска к книге Борескова "Расширения ОпенГЛ" в примере вбо (гл. 10) перед glDrawElements идет строка glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0 ); ? Больше бинда с GL_ARRAY_BUFFER_ARB нету.

Куски моего кода (может, на вскидку ошибка будет выявлена).
var
 vertexId,
 indexId: DWORD;
var
 v: array of tCoord;
 n: array of tCoord;
 t: array of tTexCoord;
 Faces: array of word;
 faces_count:integer;
 v_count: integer;
const
 r:single=1.0;
 rbig:single=1.5;
 RepeatTextureX:single=2.0;
 RepeatTextureY:single=2.0;

procedure GenerateTorus(rings,sides: integer);
var i,j:integer;
a,b,c:Single;
vi,fi:integer;
//tmp: tvert;
tmpv:tCoord;
tmpn:tCoord;
tmpt:tTexCoord;
begin
 faces_count:= rings*sides*2;
 v_count:= rings*sides;
SetLength(V,v_count);
SetLength(n,v_count);
SetLength(t,v_count);
SetLength(Faces,faces_count*3);
vi:=0;fi:=0;
 for i:=0 to rings-1 do
   begin
     c:=2*pi/i*rings;
     for j:=0 to sides-1 do
       begin
         a:=r*sin(2*pi/j*sides);
         b:=r*cos(2*pi/j*sides);
         V[vi].x:=a+rbig;
         V[vi].y:=b;
         V[vi].z:=0;
         t[vi].u:=RepeatTextureX/i*rings;
         t[vi].v:=RepeatTextureY/j*sides;
         n[vi].x:=a;
         n[vi].y:=b;
         n[vi].x:=0;
         // rotating ring
         //tmp:=Vertices[vi];
         tmpv:=v[vi];
         tmpn:=n[vi];
         tmpt:=t[vi];
         V[vi].x := cos(c) * tmpv.x - sin(c) * tmpv.z;
         V[vi].z := sin(c) * tmpv.x + cos(c) * tmpv.z;
         n[vi].x := cos(c) * tmpn.x - sin(c) * tmpn.z;
         n[vi].z := sin(c) * tmpn.x + cos(c) * tmpn.z;
         inc(vi);
       end;
   end;

 for i:=0 to rings-1 do
   for j:=0 to sides-1 do
     begin
       faces[fi]   := i*sides+j;
       faces[fi+1] := i*sides+(j+1) mod sides;
       faces[fi+2] := ((i+1) mod rings)*sides+(j+1) mod sides;

       faces[fi+3] := i*sides+j;
       faces[fi+4] := ((i+1) mod rings)*sides+(j+1) mod sides;
       faces[fi+5] := ((i+1) mod rings)*sides+j;

       fi:=fi+6;
     end;

end;

кусок glDraw();
glActiveTextureARB(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, Texture);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glClientActiveTextureARB(GL_TEXTURE0);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glEnableClientState(GL_VERTEX_ARRAY);

glBindBufferARB(GL_ARRAY_BUFFER_ARB, vertexId);//V_Buff);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, indexId);//F_Buff);

 p_ver:=pointer(0);
 p_tex:=pointer(v_count*sizeof(tCoord)+v_count*sizeof(tCoord));
 p_nor:=pointer(v_count*sizeof(tCoord));
 p_face:=pointer(0);

  glClientActiveTextureARB(GL_TEXTURE0);
     glTexCoordPointer(2, GL_FLOAT, 0, p_tex);
  glVertexPointer(3, GL_FLOAT, 0, p_ver);
  glDrawElements(GL_TRIANGLES, 3*faces_count, GL_UNSIGNED_SHORT, p_face);

glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);

glDisableClientState(GL_VERTEX_ARRAY);

glClientActiveTextureARB(GL_TEXTURE0);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glActiveTextureARB(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);

создание буфера:
   glGenBuffersARB ( 1, @vertexId );
   glBindBufferARB ( GL_ARRAY_BUFFER_ARB, vertexId );
   glBufferDataARB ( GL_ARRAY_BUFFER_ARB, v_count*(sizeof(tCoord)+sizeof(tCoord)+sizeof(tTexCoord)){ * sizeof ( Vertex )}, nil, GL_STATIC_DRAW_ARB );
   glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, v_count*sizeof(tCoord), @V);
   glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, v_count*sizeof(tCoord), v_count*sizeof(tCoord), @n);
   glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, v_count*(sizeof(tCoord)+sizeof(tCoord)), v_count*sizeof(tTexCoord), @t);
   glBindBufferARB ( GL_ARRAY_BUFFER_ARB,         0 );

                                           // create index data VBO
   glGenBuffersARB ( 1, @indexId );
   glBindBufferARB ( GL_ELEMENT_ARRAY_BUFFER_ARB, indexId );
   glBufferDataARB ( GL_ELEMENT_ARRAY_BUFFER_ARB, faces_count*sizeof(word){ * sizeof ( Face )}, @Faces, GL_STATIC_DRAW_ARB );
   glBindBufferARB ( GL_ELEMENT_ARRAY_BUFFER_ARB, 0 );


Pa5ha   (2006-03-04 12:07:00) [12]

Что-то блин иногда не могй зайти на форум. В чем дело?

Спасибо. Кажется, это то, что надо. ХПроггер как всегда на высоте.


ancara   (2006-02-28 12:04:00) [13]

type
 TwglGetProcAddress = function(ProcName: PChar): Pointer; stdcall;
 TglGenBuffersARB = procedure(n: TGLsizei; buffers: PGLuint); stdcall;

var
 LibHandle: DWORD;
 wglGetProcAddress: TwglGetProcAddress;
 glGenBuffersARB: TglGenBuffersARB;

implementation

procedure Init;
begin
 LibHandle := LoadLibrary('OpenGL32.dll');
 wglGetProcAddress := GetProcAddress(LibHandle, 'wglGetProcAddress');
 glGenBuffersARB := TglGenBuffersARB(wglGetProcAddress('glGenBuffersARB');
end;


TWINc   (2006-02-28 00:21:00) [14]

xproger.mirgames.ru :) там есть пример с ландафтом


Pa5ha   (2006-02-27 23:14:00) [15]

ancara, а чего лоадлайбрари? Откуда загрузить?

По ссылке ходил, качал, там вбо нету.

А может у кого-нить слуайно исходничок завалялся? Нагуглить ничего не получилось.


Pa5ha   (2006-02-27 22:54:00) [16]

*встал в угол :)

Спасибо всем!


ancara   (2006-02-26 11:56:00) [17]


> Pa5ha


vbo не в глут находится. Она в nvoglnt.dll у нвидии, у ати не знаю где...
Причем в секции экспорта ее почему-то не видно...
Дело твое конечно, но так нельзя делать, статически...
Всего-то надо написать LoadLibrary да wglGetProcAddress, и если nil - спокойно выходим. Зачем тебе такой изврат со статикой?


Yanis   (2006-02-26 11:11:00) [18]

http://www.soft-gems.net/OpenGL_SG.php


Pa5ha   (2006-02-25 19:21:00) [19]

grismem, ok. %) Там надо не больше десятка функций. Кстати, как называется глут правильно? glut.dll или glut32.dll? И откуда он должен был взяться на моем компьютере. Ибо когда какая-то прога у меня его попросила, то пришлось в нете искать, но прога с ним заработала. ХР поддерживает ведь вроде только гл1.1?


grisme   (2006-02-25 15:00:00) [20]


> Pa5ha   (24.02.06 22:46) [5] Как мне быть?


Ищи ПОЛНОЕ описание функций, которые тебе нужны и линкуй себе на здоровье :) Или ты вообще не знаешь, как линковать статически? Ж)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо