Вопросы по использованию OpenGL в Lazarus ...
Модератор: Модераторы
Вопросы по использованию OpenGL в Lazarus ...
Хотелось бы обратиться к форумчанам со следующим вопросом:
Наверное многие пробовали работать с библиотекой OpenGL средствами FPC или Lazarus, - быть может кто-то использовал режим полноэкранного сглаживания (MULTISAMPLE), если да, то как?
P.S. И еще, бы может кто-то работал с расширениями OpenGL ,.. как их задействовать?
Наверное многие пробовали работать с библиотекой OpenGL средствами FPC или Lazarus, - быть может кто-то использовал режим полноэкранного сглаживания (MULTISAMPLE), если да, то как?
P.S. И еще, бы может кто-то работал с расширениями OpenGL ,.. как их задействовать?
1. http://pmg.org.ru/nehe/nehe46.htm
а вообще в Google много есть по теме
2. модуль GLext тебе в помощь. Чтобы проверить например наличие расширения GL_ARB_texture_compression и загрузить его просто вызываеш Load_GL_ARB_texture_compression и проверяеш результат - если true, то можеш использовать функции расширения (они уже будут загружены)
а вообще в Google много есть по теме
2. модуль GLext тебе в помощь. Чтобы проверить например наличие расширения GL_ARB_texture_compression и загрузить его просто вызываеш Load_GL_ARB_texture_compression и проверяеш результат - если true, то можеш использовать функции расширения (они уже будут загружены)
FedeX писал(а):1. http://pmg.org.ru/nehe/nehe46.htm
Я уже перечитал эту статью в обоих направлениях (причем много раз)... но задействовать сглаживание в Lazarus пока так и не получилось!
Работаю под Linux. После инициализации вызываю функцию Load_GL_ARB_MULTISAMPLE, а для сглаживаемых объектов glEnable(GL_Multisample_ARB), но никакого результата не наблюдается!
- NXP
- постоялец
- Сообщения: 187
- Зарегистрирован: 02.01.2008 15:11:56
- Откуда: Воронеж
- Контактная информация:
Andreich писал(а):Работаю под Linux.
А у вас не Radeon? Вдруг дрова глючал
Andreich писал(а):Load_GL_ARB_MULTISAMPLE
Andreich писал(а):glEnable(GL_Multisample_ARB)
проверьте, описаны ли эти методы в источнике (файл gl??.pas), вдруг она Load_GL_ARB_MULTISAMPLE = nil и загружается ли она.
ps Проходил мимо...
NXP писал(а):А у вас не Radeon?
Vendor: Tungsten Graphics, Inc.
Renderer: Mesa DRI Intel(R) 945GM 20061017 x86/MMX/SSE2
Version: 1.3 Mesa 7.0.3-rc2
Добавлено спустя 2 минуты 24 секунды:
NXP писал(а):проверьте, описаны ли эти методы в источнике (файл gl??.pas), вдруг она Load_GL_ARB_MULTISAMPLE = nil
Проверил, все в порядке... описание присутствует!
Добавлено спустя 3 часа 10 минут 5 секунд:
Думаю, стоит привести исходный код примера, который (если я все правильно понимаю) должен работать со сглаживанием. Из текста программы выбросил все лишнее, просто рисуется сфера в режиме wire.
Код: Выделить всё
program multisampling;
{$mode objfpc}{$H+}
uses gl, glu, glut, glext;
const FSMode = '640x480:32@60';
procedure InitializeGL;
begin
glClearColor(0.5, 0.5, 0.5, 0.5);
glEnable(GL_DEPTH_TEST);
end;
procedure DrawGLScene; cdecl;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glEnable(GL_Multisample_ARB);
glutWireSphere(40,15,15);
glDisable(GL_Multisample_ARB);
glutSwapBuffers;
end;
procedure ReSizeGLScene(Width, Height: Integer); cdecl;
begin
if Height = 0 then
Height := 1;
glViewport(0, 0, Width, Height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(45, Width / Height, 0.1, 1000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
gluLookAt(0, 200, 300, 0, 0, 0, 0, 1, 0);
end;
procedure GLKeyboard(Key: Byte; X, Y: Longint); cdecl;
begin
if Key = 27 then
begin
glutLeaveGameMode;
Halt(0);
end;
end;
procedure glutInitPascal(ParseCmdLine: Boolean);
var
Cmd: array of PChar;
CmdCount, I: Integer;
begin
if ParseCmdLine then
CmdCount := ParamCount + 1
else
CmdCount := 1;
SetLength(Cmd, CmdCount);
for I := 0 to CmdCount - 1 do
Cmd[I] := PChar(ParamStr(I));
glutInit(@CmdCount, @Cmd);
end;
begin
glutInitPascal(False);
glutInitDisplayMode(GLUT_DOUBLE or GLUT_RGB or GLUT_DEPTH);
glutGameModeString(FSMode);
glutEnterGameMode;
glutSetCursor(GLUT_CURSOR_NONE);
InitializeGL;
Load_GL_ARB_MULTISAMPLE;
glutDisplayFunc(@DrawGLScene);
glutReshapeFunc(@ReSizeGLScene);
glutKeyboardFunc(@GLKeyboard);
glutIdleFunc(@DrawGLScene);
glutMainLoop;
end.
Первый раз пробую использовать gl-расширения, так что если какая глупость в коде - сразу приношу свои извинения.
Конечно не верно
Хоть я сам с полноэкранным сглаживанием никогда не имел дела, но с первого взгляда на статью и на твой код видно ошибку.
Вот урывок из статьи:
А где в твоём коде сбор сведений о форматах пикселей и уничтожение временного окна?
К томуже я думал, что ты работаеш с OGL напрямую, а раз ты используеш ГЛУТ, то там должен быть встроенный механизм инициализации сглаживания.
[*проверил*]
да - так и есть, в ГЛУТ достаточно добавить флаг GLUT_MULTISAMPLE в glutInitDisplayMode. Только как управлять уровнем сглаживания непонятно. Видимо в ГЛУТ - никак
Хоть я сам с полноэкранным сглаживанием никогда не имел дела, но с первого взгляда на статью и на твой код видно ошибку.
Вот урывок из статьи:
Наш процесс выглядит следующим образом:
· Создается обычное окно
· Собираем возможные значения форматов пикселей для последующего сглаживания (InitMultisample)
· Если сглаживание возможно, то уничтожаем окно и создаем его заново, с новым форматом пикселя.
· Для частей, которые мы хотим сгладить, просто вызываем функцию glEnable(GL_ARB_MULTISAMPLE).
А где в твоём коде сбор сведений о форматах пикселей и уничтожение временного окна?
К томуже я думал, что ты работаеш с OGL напрямую, а раз ты используеш ГЛУТ, то там должен быть встроенный механизм инициализации сглаживания.
[*проверил*]
да - так и есть, в ГЛУТ достаточно добавить флаг GLUT_MULTISAMPLE в glutInitDisplayMode. Только как управлять уровнем сглаживания непонятно. Видимо в ГЛУТ - никак
FedeX писал(а):А где в твоём коде сбор сведений о форматах пикселей и уничтожение временного окна?
Вот то-то я и думаю... Хотя в примерах которые я брал за основу, про формат пикселя нет ни слова! Ладно, будем копать...
FedeX писал(а):в ГЛУТ достаточно добавить флаг GLUT_MULTISAMPLE в glutInitDisplayMode. Только как управлять уровнем сглаживания непонятно
И что, работает!? У меня после добавления как все было, так и осталось!
Добавлено спустя 3 минуты 39 секунд:
P.S. Если не сложно, киньте в меня каким-нибудь рабочим примером по OpenGL для FreePascal, в котором есть реализация настройки формата пикселя.
>И что, работает!?
да, проверил на твоём примере (только в оконном режиме, а не "game mode" - там у меня даже сфера почем-то не появилась), работает. Хотя странно немного (как-то оно выглядит больше как размытие). Возможно у тебя и вправду видеокарта или дрова не поддерживают... А ещё кстати, чтоб ты зря время не терял скажу - в глут ты сам никак не можеш оперировать с форматами пикселей и процессом создания окна, так что ещё раз советую либо писать на чистом системном АПИ+OpenGL либо пользоваться ИМХО хоть немного более гибким SDL.
да, проверил на твоём примере (только в оконном режиме, а не "game mode" - там у меня даже сфера почем-то не появилась), работает. Хотя странно немного (как-то оно выглядит больше как размытие). Возможно у тебя и вправду видеокарта или дрова не поддерживают... А ещё кстати, чтоб ты зря время не терял скажу - в глут ты сам никак не можеш оперировать с форматами пикселей и процессом создания окна, так что ещё раз советую либо писать на чистом системном АПИ+OpenGL либо пользоваться ИМХО хоть немного более гибким SDL.
FedeX писал(а):как-то оно выглядит больше как размытие
У меня вообще не сглаживается. (может и правда с драйверами непорядки)
Поэтому еще вопрос... имеется код:
Код: Выделить всё
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glutSolidSphere(60,20,20);
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);Должна ли быть выводимая сфера прозрачной?
P.S. Возможно это уже оффтоп, но посмотрев по форуму, я нашел огромное количество тем по программированию графики и OpenGL средствами FreePascal и Lazarus! Отсюда, вполне уместное на мой взгляд предложение/пожелание к администраторам: почему бы не создать под это направление отдельную ветку на форуме?!
Должна ли быть выводимая сфера прозрачной?
вроде бы да, если отключена текстура и выставлен текущий цвет с прозрачностью (напр. glColor(1,1,1,0.5)- последнее число значение прозрачности)
