Glu-less пример рисования куба?

Я пытаюсь вернуться в OpenGL, но мои знания и математика уже заржавели. Раньше я использовал C++, но теперь предпочитаю C#... пробую OpenTK. По-видимому, Glu устарел с GL 3.1, поэтому я пытаюсь найти пример рисования куба на экране без Glu на C# или C++ (я могу его перевести).

Часть, которую я нахожу сложной, - это настройка окна просмотра/угла обзора/камеры/перспективы/инициализации. Я в порядке с очисткой буфера и размещением точек в 3D-пространстве, но другие вещи я забываю!

В частности, мне нужны замены для Glu.Perpsective и Glu.LookAt.


person mpen    schedule 24.12.2011    source источник
comment
Если вы пытаетесь использовать ядро ​​GL 3.1 и выше, вам нужны шейдеры. Вам необходимо твердое понимание того, как OpenGL работает в мире, основанном на шейдерах. Я бы посоветовал одно из руководств по OpenGL 3.0+ на этой странице   -  person Nicol Bolas    schedule 24.12.2011
comment
Также прочтите это. Формулы и методология для выполнения всех необходимых вам матричных расчетов.   -  person Lalaland    schedule 24.12.2011
comment
О... кажется, сейчас у нас 4.1?? Или 4.2? В прошлый раз, когда я играл в это, мы все еще были в двойках, я думаю. Можно также использовать последнюю стабильную версию.   -  person mpen    schedule 24.12.2011
comment
Вам не нужно заботиться о 4.x, если вам не нужны 64-битные числа с плавающей запятой и тесселяция.   -  person stativ    schedule 25.12.2011
comment
@stativ: Спасибо. Только что понял, что моя карта даже не поддерживает его.   -  person mpen    schedule 28.12.2011


Ответы (3)


Предлагаю взглянуть на http://openglbook.com/ Там написано, что это OpenGL 4, но всё описано здесь ( пока только основы) напрямую относится и к OpenGL 3. Я думаю, что это лучший ресурс для быстрого начала работы с последними версиями OpenGL. Другим очень хорошим ресурсом является Learning Modern 3D Graphics Programming, который чуть более углубленно.

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

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

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

person stativ    schedule 24.12.2011
comment
Спасибо, что нашли время объяснить некоторые различия! Я просто смотрел на пример OpenGL 3, и они делали именно это... создавали VAO и Shader Program... новые концепции для меня. Думаю, мне нужно кое-что прочитать, прежде чем я смогу прыгнуть. - person mpen; 26.12.2011
comment
Я был немного скептичен после прочтения первой главы книги OpenGL... казалось, что это действительно тривиальные вещи, которые не требовали стольких подробностей для объяснения, но я рад, что они нашли время, чтобы подробно остановиться на последующих главах. . Хорошее обновление по линейной алгебре! - person mpen; 31.12.2011

В OpenTK есть свои математические классы, включая матрицу 4x4 — Matrix4. Он включает в себя как метод ортогональной проекции, так и метод перспективной проекции - Matrix4.CreateOrthographic(...); и Matrix4.CreatePerspectiveFieldOfView(...);. Также есть метод lookAt: Matrix4.LookAt(...);

Привязки OpenTK для OpenGL принимают Matrix4 для таких методов, как GL.LoadMatrix(), GL.UniformMatrix4() и т. д.

person Robert Rouhani    schedule 30.12.2011
comment
Да! Я обнаружил это совсем недавно во время своего исследования. Спасибо! Кажется немного забавным помещать их на Matrix4 близко, хотя... эти матрицы недостаточно универсальны для приложений за пределами OpenGL, поэтому кажется, что они должны быть частью какого-то класса GL.... но неважно, они работают. - person mpen; 31.12.2011
comment
Core OpenGL удалил все, что связано с матрицами, и ожидает, что пользователи будут выполнять свои собственные математические операции с матрицами. Причина, по которой он не является частью пространства имен OpenTK.Graphics, заключается в том, что математические классы используются для привязок OpenAL и определенно будут использоваться в будущих привязках OpenCL. - person Robert Rouhani; 31.12.2011
comment
Ах... так у них есть приложения для аудио и... для чего бы ни использовался OpenCL? Тогда достаточно справедливо! - person mpen; 01.01.2012
comment
OpenCL (Open Compute Language) использует графическую карту для выполнения задач, обычно выполняемых на процессоре, но это выиграет от распараллеливания и векторизации, поскольку современный графический процессор имеет › 500 ядер с в основном инструкциями для работы с векторами. - person Robert Rouhani; 01.01.2012
comment
Я понял это, но я не уверен, как CreatePerspectiveFieldOfView будет полезен для таких вещей. - person mpen; 01.01.2012
comment
Справедливости ради стоит отметить, что уроки математики определенно ориентированы на OpenGL. Привязки OpenGL существуют дольше всех. - person Robert Rouhani; 01.01.2012

Из Ch4 книги OpenGL GLu.Perspective больше или менее эквивалентно:

98  Matrix CreateProjectionMatrix(
99      float fovy,
100     float aspect_ratio,
101     float near_plane,
102     float far_plane
103 )
104 {
105     Matrix out = { { 0 } };
106  
107     const float
108         y_scale = Cotangent(DegreesToRadians(fovy / 2)),
109         x_scale = y_scale / aspect_ratio,
110         frustum_length = far_plane - near_plane;
111  
112     out.m[0] = x_scale;
113     out.m[5] = y_scale;
114     out.m[10] = -((far_plane + near_plane) / frustum_length);
115     out.m[11] = -1;
116     out.m[14] = -((2 * near_plane * far_plane) / frustum_length);
117  
118     return out;
119 }
person mpen    schedule 28.12.2011