Работа с OpenGL

Это кусок из программы, написанной в декабре прошлого года, когда ещё только-только начал учить OpenGL. Разумеется, квадраты и треугольники работают быстрее, гораздо быстрее.

glClearColor(single(0.0), single(0.0), single(0.0), single(0.0));

Это должно быть в конструкторе формы. Раз цвет фона не меняется, его нужно устанавливать один раз, а потом glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); очищает экран этим цветом.

glTranslatef(0, 0, 0);

Это перемещение не в точку (0,0,0), а на вектор (0,0,0) относительно текущего положения, то есть эта строчка ничего не делает.

glFlush;
SwapBuffers(_hdc);

Тут нужна только вторая строчка. Объяснять почему?

Дальше:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Как цвета смешиваются? Прозрачность = 1 - ALPHA RGBA - это Красный, зелёный, синий цвет, и прозрачность. Теперь смотрите, как у Вас создана текстура:

glTexImage2D(GL_TEXTURE_2D,0,GL_RGB, tw, th, 0, GL_RGB, GL_UNSIGNED_BYTE, @texture0);

Чернеет из-за того, что в первой строчке прозрачность 50%, у полигона остаётся только половина цвета. Поставьте прозрачность 1.0 - будет светлый полигон, 0.0 - чёрный.

  glColor4f(1, 0, 0, 0.5);
  glBindTexture(GL_TEXTURE_2D,textures[0]);
  glBegin(GL_QUADS);
  glTexCoord2f(0.0,0.0);glVertex3f(-1, -1, -1);
  glTexCoord2f(1.0,0.0);glVertex3f(+1, -1, -1);
  glTexCoord2f(1.0,1.0);glVertex3f(+1, -1, +1);
  glTexCoord2f(0.0,1.0);glVertex3f(-1, -1, +1);
  glEnd;
  glBindTexture(GL_TEXTURE_2D,0);

И ещё, в Texture OpenGL test.pas следет использовать glVertex2f(), раз не меняется z-координата.

заменил glTexImage2D(GL_TEXTURE_2D,0,GL_RGB, tw, th, 0, GL_RGB, GL_UNSIGNED_BYTE, @texture0); на gluBuild2DMipmaps(GL_TEXTURE_2D, 3, tw, th, GL_RGB, GL_UNSIGNED_BYTE, @texture0[0]); терь пашет… вот готовое, оно по крайней мере работает, а там уже под себя настраивайте (22,5 КБ) (аля обращение к правнукам :slight_smile: )

1 лайк

да, а остальное там мелочи, которые я просто не исправил потому что они ничего не делают, по сути твоё же[quote=“FVS13, post:21, topic:1582”] Это кусок из программы, написанной в декабре прошлого года, когда ещё только-только начал учить OpenGL. Разумеется, квадраты и треугольники работают быстрее, гораздо быстрее. [/quote]

мож не в декабре но давно… когда только скепал свою первую прогу из ошмётков с рандомных форумов

Превосходно! А теперь разбираем полиноминальную аппроксимацию, и скелетную анимацию на кватернионах :smiley: Можно ещё обсудить перемещение объекта мышью в пространстве, потому как там есть варианты: потому что координат экрана два, а пространственных - три.

чото типо по умному сказаное “построение модели атомов”, мож нефти, я сильно не искал

квартелионы… Wikipedia Кватернио́ны (от лат. quaterni, по четыре) — система гиперкомплексных чисел, образующая векторное пространство размерностью четыре над полем вещественных чисел. Обычно обозначаются символом H. Предложены Уильямом Гамильтоном в 1843 году.

бл***… не ну я не раз это видел на msdn но… youtube

насчёт последнего… ты имеешь в виду что может быть вращение с полюсами, когда вектор “вверх” всё время [0,1,0] а есть такое что можно поворачивать как угодно? я хотел бы научится пилить второе, научи если умеешь)))

Полиноминальная аппроксимация, это глава из Красной книги:smiley: И весь её смысл в том, чтобы строить гладкие поверхности и линии.

Не читайте Wiki***** никогда. Кватернион - вектор-столбец из четырёх элементов, первый - угол, остальные - пространственные координаты. Они нужны там, где приходится перемножать много матриц поворота. Вот вместо того, чтобы перемножать матрицы, можно складывать кватернионы. Ну, например, чтобы определить угол поворота последней фаланги мизинца руки, нужно знать поворот плеча, локтя, кисти, и предыдущих фаланг.

Больше всего времени я потратил на разборку с камерой:smiley: Вам камеру от первого лица, от третьего, или смешанную?

Вообще, я не вращение имел ввиду, а именно перемещение по экрану, то есть взять объект мышкой, и таскать из сторону в строну

если оттуда то прочитаю, пока руки не дошли 2) ну примерно и так был понятно, что для оптимизации множества матриц, но я хз всё равно как это пашет, и пока мне хватает такой глубины программирования чтоб загрузить голову и достаточно чуствовать код, хотя на асемблере а то и глубже писать дало бы больше чуства языка, но боюсь опыта надо чтоб писать что то такого же маштаба как ща надо будет слишком много, не хочу на это всю жизнь тратить))) 3) ну таскать предмет можно по сфере вокруг камеры и по плоскости перед ней, плоскость тоже можно сделать закреплённую по какой то из координат а то и по всем и просто проекцию на неё центра экрана брать, или даже несколько плоскостей, смотря на какой из сторон экрана мышка если камера не двигается сразу с мышкой, ну это всё надо глубже изучать по нужде, смысла ради прикола это делать не вижу 4) так что же с glFlush не так? ты говорил что пояснишь

Если вкратце, SwapBuffers - это двойная буферизация. Она переключает цветовые буферы - задний и передний. Рисуются все фигуры по умолчанию в заднем, и после переключения выводятся на экран. glFlush - это просто приказ завершить рисование. Если, например, поставить на событие клика мыши функцию рисования квадрата в конце которой будет glFlush, то с каждым новым кликом будет выводиться новый квадрат, в тот же буфер. Если того требует задача - ладно, но переключение буферов работает быстрее, и полностью заменяет собой glFlush.

то есть glFlush это чтоб дорисовать какой то маленький кусочек поверх того что было а SwapBuffers это перерисовка с 0?

:slight_smile: glFlush - чтобы перерисовать маленький кусочек, а SwapBuffers, чтобы вывести всё нарисованное

OpenGL поддерживает как 2D, так и 3D текстуры, Вы не понимаете принцип. 2D-текстуры — это битовые плоскости, которые как раз и можно накладывать на объемную геометрию, делая перспективно-корректную интерполяцию. 3D-текстуры — это текстурные объемы, т.е. набор битовых плоскостей с интерполяцией сэмплирвоания, производимой по всем трем измерениям. Они бывают полезны при создании, например, эффектов объемного освещения. Их вообще никуда не “накладывают” а сэмплируют в шейдерах, моделирующих эффект

OpenGL ничего не рисует мгновенно. Вместо этого комманды рисования кэшируются драйвером и исполняются с задержкой. Как и когда именно они будут исполнены определяется реализацией драйвера. glFlush рекоммендует драйверу выполнить все комманды, находящиеся на данный момент времени в кэше.

то есть подгоняет? в каких случаях это может помоч или помешать? ведь в нормальных драйвер и так будет успевать 60 или сколько там монитор даст раз в сек

нет, не будет. В современных приложениях количество операций отрисовок настолько велико, что возникает CPU overhead, иными словами в том виде, в котором вы операции передаете OpenGL их исполнять “не выгодно”: CPU не успевает их обработать. Вместо этого все операции кэшируются, разделяются на независящие друг от друга куски и исполняются в параллельной lock-free очереди. К тому же, OpenGL изначально проектировался с разделением клиента (приложение) и сервера (отрисовщик). Теоретически, это могут быть разный компьютеры, объединенные в сеть. glFlush очищает сетевой кэш OpenGL, требуя немедленно передать все операции на сервер. На самом деле, в сегодняшний графических приложениях использование glFlush редко бывает оправданным.

Ещё проблема, я делал прогу RoomCreate и вроде всё было в порядке пока я не обнаружил что когда я подключаю текстуру - все цвета изменяются, точнее их значение делится на ~2… я стал тестировать - оказалось когда ставишь белые пиксели остальные цвета тоже становятся светлее… кто знает что с этим делать? в файле Data в функции GetFloorBytes есть закомментированые строчки, если раскомментировать то часть пола красится в белый и все цвета становятся светлее. клавиша ~/ё включает режим полёта камерой, в нём управление пробел, Shift, Ctrl и wasd RC.zip (34,6 КБ)

спустя много времени я сделал OpenGL Graph 3D.zip (7,5 КБ) включающую файлы:

TData.pas - модуль загружающий из TData.dll(готовому exe он не нужен, только компилятору) несколько знаков, цифры, русские и английские буквы для текстур, взятые из шрифта консоли :3 GData.pas - модуль имеющий примитивы для окна и графики, в том числе тип Texture, но он ещё будет дорабатываться Data.pas - заготовка основной программы(предполагается что туда в подпрограммы будут дописывать код) GraphTest.pas - программа для теста Data.pas “не отходя от кассы” TextTest.pas - программа для теста, а так же добавления новых букв и знаков в TData.dll

GData.pas подробно: -WTF(WriteToFile, не придумал лучше) - функция, работает так же как writeln только записывает в файл, это для дебага -Camera - тип, имеет несколько внешних переменных для работы с точкой обзора -WW, WH - размеры экрана -MW - переменная для работы с колёсиком мыши -GetKeyState - msnd, примеры использования есть в программе -несколько функций для работы с 2D точкой(точками) -Texture - класс текстуры -gr - тип, имеет несколько внешних процедур и функций для графики(по 5 на 2D и 3D)

Data.pas подробно: -строчка {apptype windows}, если поставить $ перед apptype то консоль не появится -MouseStay - в 3D обрабатывает всё что нужно для управления камерой -OnMouseWheel - срабатывает при прокрутки колёсика мыши -Redrawing - перерисовка, добавлять 3D процедуры на строчке 90 и 2D на строчке 103(если надо какой то отладочный текст или т.п. поверх всего нарисовать) -FormInit - сюда добавлять создание текстур и что должно произойти между созданием окна и его запуском -FormExit - срабатывает когда окно закрывается(Alt+F4 или когда в программе где то было вызвано MF.Close) -Init - инициализация

я далеко не со всем всё ещё разобрался в OpenGL(сейчас ищу выведение текста виндовскими шрифтами, у NeHe используется много функций которые придётся подключать с external и типов которые придётся написать от руки, а остальные ресурсы что я нашёл рассказывают не то что я хочу), в общем если в программе есть ещё какие то совершенно лишние строчки или есть что подсказать - пишите пожалуйста, эту библиотеку я ещё буду обновлять

1 лайк