3D-объект в OpenGL

Я сделал 3D-объект в OpenGL. Но я думаю, что мой код очень плохой, и теперь я хочу улучшить свой код.

Вот мой код:

#include <GL/glut.h>

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_POLYGON);
    glColor3f(0.5, 0.5, 0.5);
    glVertex2f(0.0, 0.0);
    glVertex2f(0.5, 0.0);
    glVertex2f(0.5, 0.5);
    glVertex2f(0.0, 0.5);
    glVertex2f(0.75, 0.75);
    glVertex2f(0.25, 0.75);
    glVertex2f(0.0, 0.5);
    glVertex2f(0.5, 0.0);
    glVertex2f(0.75, 0.25);
    glVertex2f(0.75, 0.75);
    glEnd();
    glBegin(GL_LINES);
    glColor3f(1.0, 1.0, 1.0);
    glVertex2f(0.0, 0.0);
    glVertex2f(0.5, 0.0);
    glVertex2f(0.5, 0.0);
    glVertex2f(0.5, 0.5);
    glVertex2f(0.5, 0.5);
    glVertex2f(0.0, 0.5);
    glVertex2f(0.0, 0.5);
    glVertex2f(0.0, 0.0);
    glVertex2f(0.5, 0.0);
    glVertex2f(0.75, 0.25);
    glVertex2f(0.75, 0.25);
    glVertex2f(0.75, 0.75);
    glVertex2f(0.75, 0.75);
    glVertex2f(0.5, 0.5);
    glVertex2f(0.75, 0.75);
    glVertex2f(0.25, 0.75);
    glVertex2f(0.25, 0.75);
    glVertex2f(0.0, 0.5);
    glEnd();
    glFlush();
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE);
    glutCreateWindow("OpenAdventrue");
    glutDisplayFunc(display);
    glutFullScreen();
    glutMainLoop();
}

(Скомпилировать с gcc -lGL -lglut file.c -o file)

2 ответа
2

Не так много кода для проверки.

  1. GLUT устарел. Оригинальный GLUT прекратил поддержку более 20 лет назад. FreeGLUT — альтернатива с открытым исходным кодом, но я не уверен в ее статусе, поскольку последний выпуск был 18 месяцев назад. Используйте что-нибудь современное, например GLFW или SDL2.

  2. glBegin() и glEnd() устарели. API немедленного режима устарел в версии 3.0 (сейчас у нас версия 4.6). Вам следует использовать Modern OpenGL (массивы вершин, буферные объекты). Любой производительный код OpenGL не должен использовать API немедленного режима. См. Этот ТАК ответ, почему.

  3. glVertex2f по существу устанавливает z-координату вершины равной 0,0. Таким образом, функция рисует 2D-точку, а не 3D-точку. Так что это не трехмерный объект.

    Код мне почему-то нравится — очень минимальный (кроме glutFullScreen()), и он работает.

    Это также поднимает фундаментальный вопрос: что такое 3D-объект? Можно ли посмотреть на него без специального 3D-оборудования?

    Вы жестко запрограммировали перспективу. И не случайно вы выбрали классический вид куба — отличная демонстрация того, что можно делать с контурами и линиями, имея только координаты XY 0, 0,25, 0,5, 0,75.

    Но что, если вы хотите изменить точку зрения? Или добавить куб впереди, или вы хотите нарисовать другую форму? Ваша программа плохая (как вы говорите), потому что это тупиковая улица.

    Куб легче определить с помощью координат XYZ. Угловые точки (вершины):

    0,0,0
    0,1,0
    1,0,0
    1,1,0
    0,0,1
    0,1,1
    1,0,1
    1,1,1
    

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

    Для базового трехмерного просмотра вам также необходимо определить угол и расстояние. С помощью геометрических правил вы можете определить окончательные координаты XY. Вы позволяете пользователю менять точку обзора и, возможно, добавлять направление света — это моя идея 3D объект в OpenGL.

    Проблема только в том, что с «современным» OpenGL (т.е. не с фиксированным конвейером, а с «динамическим») вы в конечном итоге работаете с проекционные матрицы на языке затенения GL. Либо ручка и бумага с синусом, косинусом и т. Д., Либо графическая карта с буферами вершин, текстурами и шейдерами.

    glut сам по себе не поможет в этом направлении, если только икосаэдры и чайники — это не все, что вам нужно.


    С чего вы начали?

    У вас есть идеи, что вы хотите, чтобы ваша программа делала? По крайней мере, вы доказали, что знаете плохой код когда ты это увидишь.


    На webglfundamentals.org я нашел статью, в которой говорилось, что WebGL на самом деле механизм растеризации, а не 3D-библиотеку.

    Вы должны предоставить ему координаты пространства клипа, которые представляют то, что вы хотите нарисовать. Конечно, вы указываете ax, y, z, w, и он делится на W перед рендерингом, но этого вряд ли достаточно, чтобы квалифицировать WebGL как 3D-библиотеку. В 3D-библиотеках вы предоставляете 3D-данные, библиотеки заботятся о вычислении точек пространства клипа из 3D.

    Но современный OpenGL такой же: он дает вам доступ к шейдерам и т. Д., Поэтому вы можете эффективно заполнить окно пикселями.

    Вот и хороший ответ (6 лет назад):

    Вы должны знать, что современный рабочий стол OpenGL не использует glLight, glRotate и т. д., это считается плохой практикой в ​​течение очень долгого времени (10 лет или более), и поэтому современный OpenGL имеет ту же « проблему » нет решение многих геометрия и алгоритмические проблемы для вас.

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

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