Что нужно знать перед изучением opengl
Перейти к содержимому

Что нужно знать перед изучением opengl

  • автор:

Программирование в Open Gl

Что такое OpenGL? / Ravesli https://ravesli.com/urok-1-vvedenie-v-opengl/ Россия и Беларусь начали и продолжают войну против целого народа Украины! Ravesli Ravesli • C++ • OpenGL • Linux • Python • SQL • Другие туториалы • Купить .PDF  Урок №1. Что такое. Показать больше

Что такое OpenGL? / Ravesli https://ravesli.com/urok-1-vvedenie-v-opengl/ Россия и Беларусь начали и продолжают войну против целого народа Украины! Ravesli Ravesli • C++ • OpenGL • Linux • Python • SQL • Другие туториалы • Купить .PDF  Урок №1. Что такое OpenGL?  Юрий | • Уроки OpenGL | |  Обновл. 30 Окт 2021 |  36365 ǀ  8 Перед началом нашего путешествия мы должны определиться с тем, что такое OpenGL. Оглавление: 1. Что такое OpenGL? 2. Core-profile vs. Непосредственный режим 3. Расширения в OpenGL 4. Состояния в OpenGL 5. Объекты в OpenGL 6. Заключение 7. Дополнительные ресурсы Что такое OpenGL? OpenGL (англ. «Open Graphics Library») рассматривается как API (англ. «Application Programming Interface» = «Интерфейс прикладного программирования»), 1 of 10 04.03.2023, 15:59 Спрятать

  • Больше от этого издателя
  • Поделиться
  • Код вставки
  • Добавить в избранное
  • Комментарии

Unick-soft

Статья будет интересна тем, кто ещё не начал или начал недавно изучать OpenGL. В статье сделана попытка указать правильный путь изучения OpenGL, на какие вещи стоит обратить внимание, а на какие не стоит, так как они уже устарели, какие знания необходимо иметь, чтобы не возникли трудности. Статья не содержит справок по функциям или информацию по настройке среды разработки, но в конце статьи вы можете найти полезные ссылки.

Что такое OpenGL

OpenGL — кросс-платформенная библиотека для 2D и 3D графики. В настоящее время используется для разработки приложений для Mac OS X, iOS, Android, Linux, конкурирует с DirectX для Windows. OpenGL используют не только для разработки игр, но и для приложений, работающих с 3D-графикой: СAD-системы, 3D редакторы, обучающие ПО, медицинские системы.

Свою популярность библиотека получила не только из-за кросс-платформенности, но и из-за возможности использования в проектах на различных языках программирования. И самое главное, OpenGL поддерживается производителями видеокарт, благодаря чему библиотека получает аппаратное ускорение видеокарт. Когда я только начинал работать с OpenGL, у меня возник вопрос: Как установить OpenGL? Где взять дистрибутив? Ответ прост: OpenGL устанавливается вместе с драйверами видеокарты, так как и список расширений и различные константы разнятся в зависимости от видеокарты (правда, Windows может иметь встроенный OpenGL старой версии без поддержки аппаратного обеспечения).

Для использования OpenGL, конечно, необходимо иметь библиотеку для линковки (gl.lib, glu.lib) и заголовочный файлы. Они входят в Visual Studio, но и их не трудно найти в Интернете.

Какие именно возможности вам предоставит OpenGL?

OpenGL предоставляет средства для рендера 3D сцены. OpenGL также позволяет гибко настраивать отрисовку. OpenGL поддерживает аппаратное ускорение, так как большинство команд выполняется на видеокарте.

Какими знаниями необходимо обладать?

Если вы захотели изучить OpenGL, то скорее всего, вы владеете языком программирования, если нет, то вам необходимо начать с этого.

Так как при работе с OpenGL, вы будете работать с графикой, вам необходимо понимать базовые понятия компьютерной графики, например: пиксель, хранение цвета в формате RGBA, принцип хранения изображений, альфа смешивание, графические примитивы и другие.

Позиционирование объектов — серьёзный вопрос, связанный с 3D сценами. Объекты позиционируются с помощью аффинных преобразований: перемещение, вращение и увеличение размера. С математической точки зрения эти преобразования записываются соответствующими матрицами. Если вы плохо разбираетесь в этом, то обязательно почитайте специализированную литературу, посвященную данному вопросу.

С чего начать?

Начать изучение я бы посоветовал с хорошей книги, при этом постоянно практикуясь. На русском языке не так много хороших книг, так как большинство из них уже устарели. Я бы посоветовал следующую книгу: «OpenGL. Руководство по программированию». При начальном обучении книга может показаться довольно сложной. Параллельно с ней можно изучать статьи с примерами http://nehe.gamedev.net (перевод статей на русский http://pmg.org.ru/nehe).

Для работы с окном можно использовать glut или взять инициализацию окна из готового примера. Небольшой совет, если вы будете брать код из готовых примеров, то изучите каждую функцию, так как простое копирование не поможет вам выучить OpenGL.

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

Об устаревших и современных методах и расширениях

Стоит отметить, что OpenGL уже развивается на протяжении 10 лет. В течение этого времени многие функции успели устареть, а новые появлялись. Доступ к большинству современных функций производится через расширения, то есть вам необходимо запросить указатель на функции (wglGetProcAddress).

Когда вы начнёте читать книгу, то обнаружите, что в первых примерах объекты (треугольники или квадраты) вы будете строить по точкам с помощью функции glVertex*, первое освещение вы будете включать, используя glLight, задавать цвет материала функцией glMaterialf. Многие из них не используются в современных проектах. Например, вершины объектов не задаются по одной, а передаются все вместе с помощью Vertex Buffer Object (VBO). Это намного быстрее, так как вершины необходимо передать на видеокарту и намного быстрее передать все сразу, чем по одной. Стандартное освещение тоже не используется, все реализуется в шейдерах. Другими словами, объекты всегда отрисовываются с помощью шейдеров. В шейдеры передаются все необходимые параметры: освещение, материалы, матрицы. И когда вы освоите азы, вам необходимо переключаться на изучение шейдеров (GLSL).

Изучая каждую функцию OpenGL, стоит задуматься как вызов этой функции выполняется и сколько времени он может занять. Например, если вы создаёте и загружаете данные текстуры в видеопамять, это значит что пока все данные не будут пересланы программа дальше не будет выполняться. Многие операции могут выполняться параллельно, то есть вы даёте команду видеокарте и она её выполняет, и ваша программа исполняется дальше.

На будущее

Когда вы освоите OpenGL вас могут заинтересовать вопросы работы видеокарты, эффективная реализация тех или иных эффектов. Для этого могу вам порекомендовать:

Программирование OpenGL: Рендеринг простых многоугольников

Это первая статья в серии, посвященной OpenGL, который стал промышленным стандартом в 2D/3D графике (смотрите так же Что такое OpenGL?). Мы предполагаем, что читатель знаком со своей платформой для разработки программ на языке С, и немного знаком с библиотекой GLUT (в противном случае, ознакомьтесь с серией статей посвященных программированию GLUT в нашем журнале). Под Линуксом мы рекомендуем пользоваться библиотекой Mesa, которая является великолепной бесплатной реализацией стандарта OpenGL. В настоящее время есть даже аппаратная поддержка Mesa (смотрите графические карты 3Dfx).

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

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

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

Рисование точек

OpenGL имеет всего лишь несколько геометрических примитивов: точки, линии и многоугольники. Все они описываются в терминах их соответствующих вершин. Вершина характеризуется двумя или тремя числами в формате с плавающей запятой, которые представляют собой Декартовы координаты этой вершины, (x,y) в двух- и (x, y, z) в трехмерном пространстве. Хотя Декартовы координаты являются наиболее общеупотребимыми, в компьютерной графике зачастую используется Гомогенная система координат , в которой каждая точка описывается четырьмя числами в формате с плавающей запятой, (x, y, z, w). Мы вернемся к системам координат после того, как опишем некоторые элементарные понятия трехмерного рендеринга.

Поскольку все геометрические объекты в OpenGL в конечном счете описываются как упорядоченный набор вершин, есть целый набор функций для объявления вершин. Синтаксис функций таков:

void glVertex [v](TYPE coords);

Разберитесь хорошенько с приведенной записью. (Фигурные скобки представляют набор возможных и обязательных значений, например означает 2 или 3 или 4, в то время как значение в квадратных скобках опционально и может быть опущено — Прим. Пер.) Фигурные скобки показывают часть имени функции. Функции могут иметь 2, 3 или 4 параметра в форматах: короткое целое, длинное целое, число с плавающей запятой или число с двойной точностью. Эти параметры опционально могут быть представлены в векторной форме, и в этом случае мы будем пользоваться функциями v -типа. Вот несколько примеров:

void glVertex2s(1, 3);
void glVertex2i(23L, 43L);
void glVertex3f(1.0F, 1.0F, 5.87220972F);

float vector[3];
void glVertex3fv(vector);

Для простоты все приведенные функции имеют общее имя glVertex* .

Любая последовательность вершин интерпретируется OpenGL в соответствии с контекстом. Контекст объявляется парой функций glBegin(GLenum mode ) и glEnd() , любая функция glVertex* между приведенными выше функциями контекста интерпретируется в соответствии со значением режима — mode , например:
glBegin(GL_POINTS);
glVertex2f(0.0, 0.0);
glVertex2f(1.0, 0.0);
glVertex2f(0.0, 1.0);
glVertex2f(1.0, 1.0);
glVertex2f(0.5, 0.5);
glEnd();

нарисует нам 5 точек в двухмерном пространстве с указанными координатами. Константа GL_POINTS наряду с другими объявлена в заголовочном файле . Есть много других режимов, но мы будем рассматривать их по мере необходимости

Каждая точка рисуется цветом, хранящимся в переменной состоянии OpenGL, ассоциированной с буфером цветов. Чтобы изменить текущий цвет, используйте набор функций glColor* ; о выборе цвета и манипуляции с ним можно говорить долго (этому будет посвящена отдельная статья). Пока же мы будем использовать три числа в формате с плавающей точкой в диапазоне от 0,0 до 1,0 в кодировке RGB (Red-Green-Blue, Красный-Зеленый-Синий);
glColor3f(1.0, 1.0, 1.0); /* Белый */
glColor3f(1.0, 0.0, 0.0); /* Красный */
glColor3f(1.0, 1.0, 0.0); /* Сиреневый */
итд. Скачайте: ../../common/January1998/Makefile, ../../common/January1998/../../common/January1998/example1.c, ../../common/January1998/../../common/January1998/example2.c

У нас уже достаточно материала, чтобы написать два первых примера. Первый — простая программа OpenGL для рисования множества орбит в так называемой хаотической карте (стандартной карте). Если читатель не знаком с картами, и в особенности со стандартной картой , не волнуйтесь. Проще говоря, карта берет точку и генерирует новую, используя широко известную формулу:

y n+1 = y n + K sin(x n )
x n+1 = x n + y n+1

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

Перед вами код первого примера ../../common/January1998/../../common/January1998/example1.c :

 #include #include const double pi2 = 6.28318530718; void NonlinearMap(double *x, double *y)< static double K = 1.04295; *y += K * sin(*x); *x += *y; *x = fmod(*x, pi2); if (*x < 0.0) *x += pi2; >; void winInit()< /* Установка системных координат */ gluOrtho2D(0.0, pi2, 0.0, pi2); >; void display(void)< const int NumberSteps = 1000; const int NumberOrbits = 100; const double Delta_x = pi2/(NumberOrbits-1); int step, orbit; glColor3f(0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); for (orbit = 0; orbit < NumberOrbits; orbit++)< double x, y; y = 3.1415; x = Delta_x * orbit; glBegin(GL_POINTS); for (step = 0; step < NumberSteps; step++)< NonlinearMap(&x, &y); glVertex2f(x, y); >; glEnd(); >; for (orbit = 0; orbit < NumberOrbits; orbit++)< double x, y; x = 3.1415; y = Delta_x * orbit; glBegin(GL_POINTS); for (step = 0; step < NumberSteps; step++)< NonlinearMap(&x, &y); glVertex2f(x, y); >; glEnd(); >; >; int main(int argc, char **argv) 

Прочтите статью Программирование GLUT для понимания функций glut* , код в основном взят из той статьи. Графическое окно открывается в режиме одиночного буфера и RGB-палитры. Вызываемая функция с именем display() рисует карту: вначале мы выбираем черный цвет для фона; glClear(GL_COLOR_BUFFER_BIT) сбрасывает буфер цветов, устанавливая текущий цвет (черный), затем после выбора белого цвета с помощью glColor, запускает NonlinearMap() (Нелинейная Карта) множество раз и рисует точки функциями glVertex* в режиме GL_POINTS. Очень просто. 🙂

Заметьте, что функция инициализации окна winInit() содержит всего один вызов функции набора утилит OpenGL (GLUT), gluOrtho2D() . Эта функция устанавливает двухмерную прямоугольную систему координат. Параметрами функции являются «минимум x, максимум x, минимум y, максимум y».

Я выбрал режим одиночного окна и большое количество точек, чтобы у Вас был шанс посмотреть, как изображение прорисовывается. Обычно в режиме одиночного окна с большими изображениями, которые требуют много времени для построения, детали появляются на экране в том порядке, как вызываются функции OpenGL.

По окончании работы примера вы увидите такое изображение:

Давайте перейдем ко второй программе, ../../common/January1998/../../common/January1998/example2.c :

 #include #include const double pi2 = 6.28318530718; const double K_max = 3.5; const double K_min = 0.1; static double Delta_K = 0.01; static double K = 0.1; void NonlinearMap(double *x, double *y)< /* Стандартная карта */ *y += K * sin(*x); *x += *y; /* Angle x is module 2Pi */ *x = fmod(*x, pi2); if (*x < 0.0) *x += pi2; >; /* Вызываемая функция: Что будет происходить в отсутствие действий пользователя */ void idle(void) < /* Увеличиваем хаотическую составляющую */ K += Delta_K; if(K >K_max) K = K_min; /* Перерисовываем экран */ glutPostRedisplay(); >; /* Инициализация графического окна */ void winInit(void)< gluOrtho2D(0.0, pi2, 0.0, pi2); >; /* Вызываемая функция: Что будет происходить, когда экран нуждается в перерисовке */ void display(void)< const int NumberSteps = 1000; const int NumberOrbits = 50; const double Delta_x = pi2/(NumberOrbits-1); int step, orbit; glColor3f(0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); for (orbit = 0; orbit < NumberOrbits; orbit++)< double x, y; y = 3.1415; x = Delta_x * orbit; glBegin(GL_POINTS); for (step = 0; step < NumberSteps; step++)< NonlinearMap(&x, &y); glVertex2f(x, y); >; glEnd(); >; for (orbit = 0; orbit < NumberOrbits; orbit++)< double x, y; x = 3.1415; y = Delta_x * orbit; glBegin(GL_POINTS); for (step = 0; step < NumberSteps; step++)< NonlinearMap(&x, &y); glVertex2f(x, y); >; glEnd(); >; glutSwapBuffers(); >; int main(int argc, char **argv) < /* Инициализация GLUT */ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(5,5); glutInitWindowSize(300,300); /* Открываем окно */ glutCreateWindow("Order to Chaos"); /* Инициализируем окно */ winInit(); /* Регистрируем вызываемые вункции */ glutDisplayFunc(display); glutIdleFunc(idle); /* Запускаем обработчик событий */ glutMainLoop(); return 0; > 

Эта программа основана на первом примере, ../../common/January1998/../../common/January1998/example1.c , и главные отличия заключаются в том, что окно открывается в режиме двойного буфера, а параметр К меняется в течение работы программы. Есть так же новая вызываемая функция idle() , которая регистрируется в обработчике событий GLUT функцией glutIdleFunc() . У этой функции особое назначение — она вызывается каждый раз, как обработчик событий по завершению своего цикла не нашел никаких действий со стороны пользователя. Вызываемая функция idle() идеально подходит для создания анимации. Во втором примере, ../../common/January1998/example2, назначением функции является небольшое изменение параметра карты. В конце функции idle() присутствует вызов другой часто употребляемой функции, glutPostResDisplay() , которая перерисовывает окно, сохраняя предыдущую инициализацию. В общем, это более эффективно, чем простой повторный вызов функции display() .

Другим заслуживающим внимания отличием является использование glutSwapBuffers() в конце display() . Окно было проинициализировано в режиме двойного буфера, поэтому все операции по рисованию применяются к спрятанному буферу, и пользователь не видит, как прорисовывается изображение. По завершению отрисовки изображения (кадра), оно становится видимым переключением спрятанного и видимого буферов функцией glutSwapBuffers() . Без этой техники невозможно добиться плавной анимации.

Перед Вами некоторые из кадров, отображаемых во время анимации:

ВАЖНОЕ ЗАМЕЧАНИЕ: вызываемая функция display() всегда вызывается как минимум один раз перед функцией idle(). Принимайте этот факт во внимание при написании собственных анимационных программ, для того, чтобы решить, какие команды поместить в функцию display() а какие — в idle().

Рисование линий и многоугольников

  • GL_POINTS Точки. Рисует точку в каждой из n вершин
  • GL_LINES Линии. Рисует набор несоединенных друг с другом линий. Отрезки рисуются между парами вершин v 0 и v 1 , v 2 и v 3 . итд. Если n — нечетное число, то v n-1 игнорируется
  • GL_POLYGON Многоугольник. Рисует многоугольник, используя v 0 , v 1 . v n-1 как вершины. n должно быть равно минимум 3 чтобы что-либо было нарисовано, кроме того, многоугольник не может пересекаться сам с собой и должен быть выпуклым (из-за ограничений алгоритмов, реализованных аппаратно).
  • GL_TRIANGLES Треугольники. Рисует серию треугольников, используя тройки вершин v 0 , v 1 и v 2 , затем v 3 , v 4 и v 5 итд. Если n не кратно 3, оставшиеся точки игнорируются
  • GL_LINE_STRIP Ломанная или полоса. Рисует линию из v 0 в v 1 , затем из v 1 в v 2 итд. Наконец, из v n-2 в v n-1 , всего n-1 отрезков ломанной. Какие-либо ограничения на расположения вершин ломанной не накладываются, линии могут произвольно пересекаться
  • GL_LINE_LOOP Замкнутая ломанная. То же, что и ломанная GL_LINE_STRIP, за исключением того, что последний отрезок рисуется между v n-1 и v 0 , замыкая круг
  • GL_QUADS Четырехугольники. Рисует серию четырехугольников, используя по четыре вершины v 0 , v 1 , v 2 , v 3 затем v 4 , v 5 , v 6 , v 7 итд.
  • GL_QUAD_STRIP Полоса четырехугольников. Рисует серию четырехугольников, используя вершины v 0 , v 1 , v 3 , v 2 затем v 2 , v 3 , v 5 , v 4 итд.
  • GL_TRIANGLE_STRIP Полоса треугольников. Рисует серию треугольников, используя вершины в следующем порядке: v 0 , v 1 , v 2 , затем v 2 , v 1 , v 3 , затем v 2 , v 3 , v 4 , итд. Порядок вершин должен гарантировать, что треугольники имеют правильную ориентацию, и полоса может использоваться для формирования части поверхности.
  • GL_TRIANGLE_FAN Похоже на GL_TRIANGLE_STRIP, но треугольники используют вершины в таком порядке: v 0 , v 1 , v 2 , затем v 0 , v 2 , v 3 , затем v 0 , v 3 , v 4 , итд. Все треугольники имеют общую вершину v 0

Как и прежде, присутствует вызываемая функция idle() целью которой в данном случае является поддержание хода часов (изменением переменной time ). Функция display() рисует два объекта: отвес (шнурок) и диск (белым и красным цветами соответственно). Движение маятника сокрыто в формулах для xcenter и ycenter:

 void display(void)< static double radius = 0.05; const double delta_theta = pi2/20; double xcenter , ycenter; double x, y; double theta = 0.0; double current_angle = cos(omega * time); glColor3f(0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); /* Рисуем отвес */ glColor3f(1.0, 1.0, 1.0); glBegin(GL_LINES); glVertex2f(0.0, 0.0); xcenter = -cord_length * sin(current_angle); ycenter = -cord_length * cos(current_angle); glVertex2f(xcenter, ycenter); glEnd(); /* Рисуем диск */ glColor3f(1.0, 0.0, 0.0); glBegin(GL_POLYGON); while (theta ; glEnd(); glutSwapBuffers(); >;  

Упражнения

  • В первом примере, ../../common/January1998/../../common/January1998/example1.c попробуйте другие карты. Возьмите в библиотеке любую книгу по Фракталам, в которой Вы несомненно найдете множество примеров. Поэкспериментируйте, изменяя параметры, систему координат, применяя последовательно несколько карт перед отрисовкой точек. Получите удовольствие от игры с примером. 🙂
  • Во втором примере, ../../common/January1998/../../common/January1998/example2.c , вы можете добавить цвет к каждой точке. Например, очень интересное цветовое кодирование может быть основано на присвоении каждой точке цвета в соответствии с локальной стабильностью орбиты. (Из обзора Physics Review Letters Vol 63, (1989) 1226) , когда траектория проходит через хаотический регион, она становится более красной. Например, вблизи островков стабильности орбита может становиться более синей. Если Вы воплотите этот эффект, фрактальная природа карты из нашего примера станет очевидной. Это немного сложно для тех из Вас, кто не имел дела с дифференциальными уравнениями, но заслуживает изучения, если Вы хотите использовать карты и фракталы в своей компьютерной графике.
  • В третьем примере, ../../common/January1998/../../common/January1998/example3.c , попробуйте изменить тип линий, используемых для рисования диска. Используйте GL_LINES, GL_TRIANGLES, итд.. Посмотрите, что получится. Попробуйте оптимизировать рисование диска, нет необходимости каждый раз вычислять синусы и косинусы для рисования одного и того же диска в каждом кадре, Вы можете сохранить значения в массиве. Используйте многоугольники, чтобы нарисовать коробку, алмаз, или что еще придет в голову вместо диска на конце маятника. Нарисуйте два маятника в кадре, качающихся независимо или даже бьющихся друг об друга.

В следующий раз.

На сегодня все. Есть еще много недосказанного о многоугольниках. В следующем выпуске (Март 1998) мы продолжим изучение многоугольников, моделирования и опишем более детально некоторые из команд, с которыми Вы уже успели познакомиться.

Перевод: Vladas Lapinskas

  • Прочтите Обзор железа: Графические карты 3Dfx.
  • Посетите http://www.opengl.org/.
  • Прочтите другие статьи этого же автора: Что такое OpenGL?, Программирование GLUT: Окна и анимация.

© 1998 Miguel Angel Sepúlveda
This website is mantained by Miguel A Sepulveda .

Что нужно знать перед изучением opengl

МЕРОПРИЯТИЯ

Data Fusion Contest 2024

15 февраля Онлайн Бесплатно

Цифровые двойники городов: опыт и перспективы

27 февраля Онлайн Бесплатно

Cinimex DATA meetup

15 февраля Санкт-Петербург Онлайн Бесплатно

Комментарии

Популярные По порядку
Не удалось загрузить комментарии.

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ

13 лучших книг по Python для начинающих и продолжающих

Представляем вам подборку лучших книг по Python для начинающих программистов, опытных питонистов и детей, с реальными рецензиями.

Книги по программированию: как читать и что именно

Начинающие программисты часто спрашивают, какие книги по программированию читать и как, чтобы лучше усвоился материал. Отвечаем на эти вопросы.

6 книг по Java для программистов любого уровня

Подборка материалов по Java. Если вы изучаете его, то обязательно найдете для себя что-то полезное и неважно на какой стадии изучения вы находитесь.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *