![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
OpenGL Extensions [Delphi, Windows]
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] Как мне быть?
Ищи ПОЛНОЕ описание функций, которые тебе нужны и линкуй себе на здоровье :) Или ты вообще не знаешь, как линковать статически? Ж)