Войти
ПрограммированиеФорумГрафика

Наиболее эффективный путь освоения OpenGL (16 стр)

Страницы: 113 14 15 16 17 18 Следующая »
#225
12:10, 24 авг. 2014

Можете показать пример с линией и треугольником на VBO?


#226
12:23, 24 авг. 2014

8Observer8
> Сейчас этот код изучаю: https://github.com/8Observer8/Icosahedron
90% вызовов OpenGL из этого кода устарели.

8Observer8
> Можете показать пример с линией и треугольником на VBO?
Уроки Кренделя же: https://code.google.com/p/gl33lessons/wiki/Lesson02. Тут всё как полагается в 21-м веке. Код рисования линий такой же, как и для треугольников, только массив вершин будет содержать не по три точки на треугольник, а по две на линию, и в glDrawArrays будет передаваться не GL_TRIANGLES, а GL_LINES.

#227
12:38, 24 авг. 2014

Вот спасибо! Посоветуйте, что-нибудь попроще по поводу камер. Я бы хотел сделать примерчик, где я от первого лица в невесомости могу летать и осматривать несколько каркасных объектов со всех сторон. Что для этого нужно?

#228
12:50, 24 авг. 2014

8Observer8
> Вот спасибо! Посоветуйте, что-нибудь попроще по поводу камер. Я бы хотел
> сделать примерчик, где я от первого лица в невесомости могу летать и
> осматривать несколько каркасных объектов со всех сторон. Что для этого нужно?
Это зависит от того, что ты уже умеешь. Если умеешь работать с матрицами и располагать объекты как угодно, то можно свести камеру к этой задаче. Надо всего лишь составить мировую матрицу камеры в пространстве, как и любого другого объекта. Полученную матрицу надо инвертировать, что даст видовую матрицу. Ну а дальше, всё как в примере уроков, просто передавать эту матрицу в шейдер.

Вот в этом уроке тоже есть камера https://code.google.com/p/gl33lessons/wiki/Lesson04.

#229
13:18, 24 авг. 2014

8Observer8
> P.S. И как я мог взяться за шестое издание СуперБиблии, не прочитав хотя бы
> первые пять глав про "классический OpenGL" из третьего на русском O_o
Тебе тут кажется писали чтобы ты такое не делал. Все эти glBegin - уже устаревшие, не просто устаревшие, а даже недоступные в 3.3 и выше (если не создавать контекст с совместимостью, но тогда никто не гарантирует тебе работоспособность)

>> рисовать "проволочные каркасы"? Кстати, правильное ли название "проволочные каркасы"?
Зачем? Можно включить в растеризаторе и оно само будет рисовать сетку

#230
13:36, 24 авг. 2014

war_zes
>Зачем? Можно включить в растеризаторе и оно само будет рисовать сетку
Вот этот момент вообще непонятен. Я просто до этого не добрался. У меня в голове такая схема:
1) Получаем массив координат вершин и массив индексов. Для этого запускаем Blender, рисуем для каждого объекта сетку, сохраняем массивы (для каждого объекта создаём свой файл)
2) Моё приложение считывает массивы из файлов. Задаёт смещение для каждого объекта относительно начала координат. Для каждого объекта вызывает функцию:

void Scene3D::drawFigure() // построить фигуру
{
    // указываем, откуда нужно извлечь данные о массиве вершин
    glVertexPointer(3, GL_FLOAT, 0, VertexArray);
    // указываем, откуда нужно извлечь данные о массиве цветов вершин
    glColorPointer(3, GL_FLOAT, 0, ColorArray);
    // используя массивы вершин и индексов, строим поверхности
    glDrawElements(GL_TRIANGLES, 60, GL_UNSIGNED_BYTE, IndexArray);
}
#231
13:50, 24 авг. 2014

Добавил возможность колёсиком масштабировать. Вот код, который относится только к масштабированию:

Scene::Scene( QWidget *parent ) :
    QGLWidget( parent ),
    m_scale( 1.0f )
{
}

void Scene::paintGL()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    glScalef( m_scale, m_scale, m_scale );

    // ...
}

void Scene::wheelEvent(QWheelEvent *event)
{
    if ( event->delta() > 0 ) {
        scalePlus();
    } else if ( event->delta() < 0 ) {
        scaleMinus();
    }

    updateGL();
}

void Scene::scalePlus()
{
    m_scale *= 1.1f;
}

void Scene::scaleMinus()
{
    m_scale /= 1.1f;
}

#232
13:59, 24 авг. 2014

8Observer8
> У меня в голове такая схема:
Выбрось ее.

Показ сетки меша делается одной строчкой:
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

Можно показывать сетку точками
glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);

А вернуть как было:
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
В DX аналогично

И вообще перед тем как придумывать всякие умные схемы, стоит все же разобраться в том что уже есть:)

#233
18:15, 24 авг. 2014

8Observer8
> void Scene::scalePlus() { m_scale *= 1.1f; }
> void Scene::scaleMinus() { m_scale /= 1.1f; }
извиняюсь за придирку, но я бы лучше проводил манипуляции в целочисленном виде и уже потом передавал данные в glScalef. Иначе вы рискуете в определенной момент "сломать" картинку из-за потери точности.

#234
22:48, 24 авг. 2014

fullspektr
Я не понял, как в целочисленном виде проделать эти манипуляции?

#235
23:03, 24 авг. 2014

8Observer8
> Я не понял, как в целочисленном виде проделать эти манипуляции?
Очевидно, что-то вроде
scale = 100;

scale += 10;
scale -= 10;

#236
23:11, 24 авг. 2014

-Eugene-
> Очевидно, что-то вроде
> scale = 100;
> scale += 10;
> scale -= 10;
Это же совсем другое. Вместо ряда
100, 110, 121, 133.1, 146.41
будет
100, 110, 120, 130, 140.
Разница есть, но к точности float она никакого отношения не имеет.

#237
23:39, 24 авг. 2014

gammaker
> Это же совсем другое.
А тебе так принципиально? Нуок.
scale = 0;
scale--;
scale++;

k = (scale ^ A * B + C) / C;

Дает. например, вот это:
1.00, 1.10, 1.40, 1.90, 2.50...

Или любое другое по вкусу

#238
23:50, 24 авг. 2014

-Eugene-
> А тебе так принципиально?
Я думал, fullspektr предлагал написать эквивалентный код, а он не эквивалентный. Хотя я конечно не телепат.
Вообще при сильном увеличении будет заметно, что в одном случае оно происходит с одинаковой скоростью, а во втором замедляется.

#239
0:12, 25 авг. 2014

-Eugene-
> k = (scale ^ A * B + C) / C;
k = pow(1.1, scale);
Один в один то, что было изначально.
Только надо не просто scale++, scale--, а еще следить за переполнениями.

Страницы: 113 14 15 16 17 18 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.