В спецификации OpenGL есть определенные параметры, которые принимают набор значений от GL_OBJECTENUMERATIONi
с i от 0 до некоторого числа, обозначенного чем-то вроде GL_MAX_OBJECT
. (Горит как «объект», как один пример.) Кажется очевидным, что указанное число должно быть передано через верхнюю границу через функцию glGet, обеспечивающую некоторую косвенность.Каков наилучший способ подписи числовых параметров для OpenGL?
Однако, согласно буквальному толкованию спецификации OpenGL параметр «текстуры» для glActiveTexturemust be one of GL_TEXTUREi, where i ranges from 0 (GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1)
означает, что множество принятых констант должно быть GL_TEXTURE0
к GL_TEXTURE35660
, поскольку константа является константой значения 35661.
Language-адвокатская практика в сторону, эта установка означает, что подтип может быть не только не пересекаются, но из того, как хорошо, так что следующий C-иш отображение будет действительным:
#define GL_TEXTURE0 0x84C0
#define GL_TEXTURE1 0x84C1
#define GL_TEXTURE2 0x84C2
#define GL_TEXTURE3 0x84A0
#define GL_TEXTURE4 0x84A4
#define GL_TEXTURE5 0x84A5
#define GL_TEXTURE6 0x84A8
#define GL_TEXTURE7 0x84A2
Во-первых, это проблема на самом деле проблема или константы всегда выложено как GL_OBJECTi
= GL_OBJECTi-1
+1?
Если это соотношение справедливо, то есть возможность использования функции подтипа Ады, чтобы избежать передачи в недопустимых параметров ...
В идеале, что-то вроде:
-- This is an old [and incorrect] declaration using constants.
-- It's just here for an example.
SubType Texture_Number is Enum Range
GL_TEXTURE0..Enum'Max(
GL_MAX_TEXTURE_COORDS - 1,
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1);
Но, если максимум определяется динамически, то мы должны сделать некоторые monkeying о:
With GL_Constants;
Generic
GL_MAX_TEXTURE : Integer;
-- ...and one of those for EACH maximum for the ranges.
Package Types is
Use GL_Constants;
SubType Texture_Number is Enum Range
GL_TEXTURE0..GL_MAX_TEXTURE;
End Types;
с конкретизации Package GL_TYPES is new Types( GL_MAX_TEXTURE => glGet(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS));
, а затем использовать этот новый GL_TYPES
пакет ... немного больше работы и немного более громоздкий, чем простой подтипирование.
Большая часть этого происходит от того, чтобы быть совершенно новым для OpenGL и не полностью знать/понимать его; но он вызывает интересные вопросы о том, как лучше всего приступить к построению хорошей, толстой привязки Ады.
Hat подскажите вам, задав этот вопрос, вместо того, чтобы просто игнорировать проблему, как это было в моей привязке OpenGLAda. – flyx