Проблемы с glext.h - PullRequest
       12

Проблемы с glext.h

5 голосов
/ 09 августа 2011

Я только что просматривал обновления OpenGL для OS X Lion, когда обнаружил что-то, что теперь мне страшно использовать glext.h.

Итак, вот ошибка.Lion's OpenGL.framework имеет glext.h со следующим определением.

typedef void *GLhandleARB;

Но вместо glext.h из реестра OpenGL есть следующее.

typedef unsigned int GLhandleARB;

Теперь проблемав том, что при сборке для x86_64 на Lion у нас есть sizeof(void*)==8, но sizeof(unsigned int)==4.Так чему ты доверяешь?Голова льва?Или заголовок реестра OpenGL?Ну, конечно, вы доверяете системным заголовкам, потому что, очевидно, они утверждают, что знают, что ABI на 64-битном Lion имеет 64-битный тип GLhandleARB.

Теперь, это вызывает некоторые проблемы в моей головео различных платформах:

  1. Если вы должны использовать glext.h от Apple, но glext.h от Apple не предоставляет доступ ни к чему более позднему, чем OpenGL 2.1, то какВы получаете 3.0+ функций на новых картах?

  2. Не опасно ли использовать реестр OpenGL glext.h в Linux?Или вы должны использовать системный glext.h там же?В этом случае вопрос № 1 также применим и здесь.

  3. Как, черт возьми, вы справляетесь с Windows, где никогда a glext.h насистема?Вы явно не можете использовать драйвер поставщика glext.h, потому что разные поставщики могут не соглашаться с размерами различных типов.(Или это не правда?) Что здесь за дело?

Ответы [ 2 ]

2 голосов
/ 12 августа 2011

Не вижу проблем. Просто используйте OS / драйверы, предоставленные заголовки. Или лучше использовать мультиплатформенный загрузчик расширений OpenGL, который поможет вам. (например, GLEW )

С другой стороны, в коде вы будете использовать только GLhandleARB, а не другие вещи, поэтому на Mac это будет недействительно * - нет проблем, в Linux - что-то другое - нет проблем, в Linux с заголовком AMD - что-то совершенно другое - нет проблем.

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

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

2) Это зависит. Если вы нацелены на OpenGL 2.1 и ниже, драйверы с открытым исходным кодом поддерживают его, но более высокие версии поддерживаются только проприетарными драйверами, поэтому вам следует использовать их заголовки. Но в коде вы просто помещаете "#include", а затем делаете ссылку на соответствующий заголовок и библиотеку .so.

3) Не знаю, как обстоят дела на Win. Но, вероятно, производители используют glext из реестра OpenGL.

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

0 голосов
/ 10 августа 2011

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

Что касается типа, который вы должны использовать, я думаю, на этот вопрос уже ответили Apple.списки рассылки: http://lists.apple.com/archives/mac-opengl/2005/Nov/msg00182.html

Оба;спецификация не делает никаких заявлений о том, что такое GLhandleARB, кроме того, что он имеет ширину не менее 32 бит.Обратите внимание, что в API языка затенения OpenGL 2.0 нет типа GLhandle, он использует GLuint как текстуры.Также обратите внимание, что GLuint - это не неподписанное целое в Mac OS X, это длинное число без знака, так что вы все еще в замешательстве:)

...