Opengl example c linux

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Some code examples for opening windows for various purposes in very few bytes

blackle/Linux-OpenGL-Examples

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

Here are examples of rendering a shader full screen on linux. All of these examples do it in less than 2 kilobytes thanks to vondehi and copious amounts of ELF stripping.

There are three examples, each using a different library to open a window and get an opengl context.

Vanilla xlib is the largest of the bunch and the most brittle. It is highly not recommended to use xlib in a demo unless you cannot assume these other libraries will be on the system. (note, unlike all the other programs that close with the window manager’s quit key combination, this program must be closed with ESC.)

Читайте также:  Linux mint драйвер wifi адаптера

GTK is a step up from xlib, being both smaller and more robust. If the compo you are entering doesn’t allow using SDL2, GTK is an ok alternative. Before switching to GCC 8.3.0, this was 100 bytes smaller than it is now. I am not sure why it is larger, but this likely means it can be sizecoded/stripped further.

Using SDL2 will give you very small binaries. Use SDL2 whenever you can, as it also has a few other useful subsystems at minimal cost (for example, audio.)

About

Some code examples for opening windows for various purposes in very few bytes

Источник

Opengl example c linux

Библиотека сайта rus-linux.net

glColor3f(. ) . Команда glColor3f(. ) принимает три параметра, которые представляют RGB-составляющие желаемого цвета.

Изменение перспективы:

Вы можете изменить перспективу сцены с помощью следующих команд:

glRotatef(rX, 1.0, 0.0, 0.0); glRotatef(rY, 0.0, 1.0, 0.0);

Угол перспективы меняется в соответствии с тем, как пользователь нажимает клавиши со стрелками.

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

После того, как вы получите корректные координаты треугольников, их рисование не будет представлять особых сложностей. Рисование каждого треугольника должно начинаться с вызова команды glBegin(GL_TRIANGLES) и заканчиваться вызовом команды glEnd() . GL_TRIANGLES является идентификатором примитива OpenGL. Существуют и другие идентификаторы примитивов: GL_POINTS , GL_LINES , GL_LINE_STRIP , GL_LINE_LOOP , GL_TRIANGLE_STRIP , GL_TRIANGLE_FAN , GL_QUADS , GL_QUAD_STRIP и GL_POLYGON . При этом в конечном счете каждый из примитивов OpenGL формируется из одного или нескольких треугольников.

Если вы рисуете фигуры с помощью треугольников ( GL_TRIANGLES ), порядок рисования вершин не важен. Если же вы рисуете фигуры с помощью прямоугольников ( GL_POLYGON ), рисование четырех вершин должно осуществляться в корректной последовательности, причем не важно, будет ли осуществляться обход вершин по часовой стрелке или против часовой стрелки. В том случае, если порядок рисования вершин будет нарушен, ваш прямоугольник не будет целостным.

Использование клавиш со стрелками:

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

void keyboard(int key, int x, int y) < if (key == GLUT_KEY_RIGHT) < rY += 15; >else if (key == GLUT_KEY_LEFT) < rY -= 15; >else if (key == GLUT_KEY_DOWN) < rX -= 15; >else if (key == GLUT_KEY_UP) < rX += 15; >// Запрос обновления изображения glutPostRedisplay(); >

Функция обратного вызова keyboard(. ) зарегистрирована в рамках функции main(. ) с помощью следующей строки кода:

Читайте также:  Repo yandex browser linux

Автоматическое вращение куба

В качестве бонуса давайте рассмотрим пример автоматического вращения куба (Рисунок 7).

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

Примечание: любой объект может быть разделен на отдельные треугольники, но треугольник не может быть разделен на что-либо, кроме треугольников.

Графический вывод приложения на основе исходного кода из файла rotateCube.cc

Рисунок 7. Графический вывод приложения на основе исходного кода из файла rotateCube.cc

В Листинге 3 приведен исходный код приложения из фала rotateCube.cc

Листинг 3. rotateCube.cc

// Разработчик: Mihalis Tsoukalos // Дата: Среда, 04 Июня 2014 // // Простая программа на основе OpenGL, которая рисует // автоматически вращающийся куб. // // g++ rotateCube.cc -lm -lglut -lGL -lGLU -o rotateCube #include #include // должно осуществляться корректное связывание библиотек GLUT и OpenGL #ifdef __APPLE__ #include #include #else #include #endif using namespace std; // Координаты вершин куба double x = 0.6; double y = 0.6; double z = 0.6; float angle = 0.0; void drawCube() < glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Сброс значений параметров преобразований glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0, 0.0, -5.0); // Добавление рассеянного освещения GLfloat ambientColor[] = ; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientColor); // Добавление точечного освещения GLfloat lightColor0[] = ; GLfloat lightPos0[] = ; glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor0); glLightfv(GL_LIGHT0, GL_POSITION, lightPos0); glTranslatef(0.5, 1.0, 0.0); glRotatef(angle, 1.0, 1.0, 1.0); glRotatef( angle, 1.0, 0.0, 1.0 ); glRotatef( angle, 0.0, 1.0, 1.0 ); glTranslatef(-0.5, -1.0, 0.0); // Создание трехмерного куба // Задняя поверхность glBegin(GL_POLYGON); glColor3f(0.5, 0.3, 0.2); glVertex3f(x, -y, z); glVertex3f(x, y, z); glVertex3f(-x, y, z); glVertex3f(-x, -y, z); glEnd(); // Передняя поверхность glBegin(GL_POLYGON); glColor3f(0.0, 0.5, 0.0); glVertex3f(-x, y, -z); glVertex3f(-x, -y, -z); glVertex3f(x, -y, -z); glVertex3f(x, y, -z); glEnd(); // Левая поверхность glBegin(GL_POLYGON); glColor3f(0.5, 0.5, 0.5); glVertex3f(-x, -y, -z); glVertex3f(-x, -y, z); glVertex3f(-x, y, z); glVertex3f(-x, y, -z); glEnd(); // Правая поверхность glBegin(GL_POLYGON); glColor3f(0.0, 0.0, 0.0); glVertex3f(x, -y, -z); glVertex3f(x, -y, z); glVertex3f(x, y, z); glVertex3f(x, y, -z); glEnd(); // Верхняя поверхность glBegin(GL_POLYGON); glColor3f(0.6, 0.0, 0.0); glVertex3f(x, y, z); glVertex3f(-x, y, z); glVertex3f(-x, y, -z); glVertex3f(x, y, -z); glEnd(); // Нижняя поверхность glBegin(GL_POLYGON); glColor3f(0.3, 0.0, 0.3); glVertex3f(-x, -y, -z); glVertex3f(-x, -y, z); glVertex3f(x, -y, z); glVertex3f(x, -y, -z); glEnd(); glFlush(); glutSwapBuffers(); > // Функция для плавного увеличения значения переменной угла поворота, // которыое находится в диапазоне 360) < angle -= 360; >glutPostRedisplay(); glutTimerFunc(25, update, 0); > // Инициализация системы вывода трехмерной графики void initRendering() < glEnable(GL_DEPTH_TEST); glEnable(GL_COLOR_MATERIAL); // Установка цвета фона glClearColor(0.7f, 0.8f, 1.0f, 1.0f); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_NORMALIZE); >// Вызывается при изменении размера окна void handleResize(int w, int h) < glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0, (double)w / (double)h, 1.0, 200.0); >int main(int argc, char **argv) < glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(700, 700); glutInitWindowPosition(100, 100); glutCreateWindow("OpenGL - Rotating a Cube"); initRendering(); glutDisplayFunc(drawCube); glutReshapeFunc(handleResize); // Добавление таймера, при срабатывании которого будет вызываться функция update(. ) glutTimerFunc(25, update, 0); glutMainLoop(); return 0; >

Обратите внимание на то, что реализации функции main(. ) в файлах исходного кода triangle.cc, cube.cc и rotateCube.cc очень схожи, несмотря на то, что три программы предназначены для выполнения различных задач.

Читайте также:  Linux memory usage details

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

Заключение

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

Благодарности

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

Дополнительные ресурсы

Книга «Learning Modern 3D Graphics Programming»: http://www.arcsynthesis.org/gltut

Книга «OpenGL Superbible, 6th edition, Graham Sellers, Richard S. Wright and Nicholas Haemel, Addison Wesley, ISBN: 0321902947»

Источник

Оцените статью
Adblock
detector