Любая идея, почему glVertexPointer () не будет ничего рисовать при использовании GL_FLOAT? - PullRequest
0 голосов
/ 15 декабря 2009

Используя GLfixed в качестве моего номера вершины, следующий код рисует текстуры, как и ожидалось:

GLfixed vertices[] = 
{
    (int)point.x,           (int)point.y + size.height,
    (int)point.x + size.width,  (int)point.y + size.height,
    (int)point.x,           (int)point.y,
    (int)point.x + size.width,  (int)point.y
};

glVertexPointer(2, GL_FIXED, 0, vertices);

Я прочитал в документации OpenGL, что GLfixed является наименее эффективным типом, и вместо этого я должен использовать GLfloat. Но когда я переключил свой код на float, ничто не прорисовывалось.

GLfloat vertices[] = 
{
    point.x,        point.y + size.height,
    point.x + size.width,   point.y + size.height,
    point.x,        point.y,
    point.x + size.width,   point.y
};

glVertexPointer(2, GL_FLOAT, 0, vertices);

Есть ли еще один флаг, который мне нужно установить в автомате OpenGL, чтобы заставить его вести себя как положено?

Ответы [ 2 ]

2 голосов
/ 16 декабря 2009

Когда я смотрю на документацию, это выглядит так: GL_FIXED - это формат с фиксированной точкой 16:16. Это означает, что 16 старших бит GLfixed представляют целую часть, а дробь - младшие 16 бит, разделенные на 65536 (1 << 16).

Чтобы преобразовать это в число с плавающей точкой, просто разделите число на 65536:

const float scale = 1.0f / 65536.0f;
GLfloat vertices[] = 
{
        point.x * scale               , (point.y + size.height) * scale,
        (point.x + size.width) * scale, (point.y + size.height) * scale,
        point.x * scale               , point.y * scale,
        (point.x + size.width) * scale, point.y * scale
};

glVertexPointer(2, GL_FLOAT, 0, vertices);

Если вы используете координаты вершин и т. Д., Также в формате GL_FIXED, вам также придется их масштабировать.

Надеюсь, это поможет.

1 голос
/ 16 декабря 2009

Исправлено в формате 16:16. Когда вы приводите значение к «fixed», компилятор не знает, что этот формат особенный, поэтому он такой же, как если бы вы приводили к int.

Например, если point.x равен единице, то:

(int)point.x -> 0x00000001
(GLfixed)point.x -> 0x00000001

Когда OpenGL интерпретирует 0x00000001 как значение GLfixed, OpenGL фактически видит 1/65536. Если вы хотите, чтобы OpenGL читал 1.0, тогда правильная кодировка - 0x00010000.

Когда вы переключились на float, OpenGL фактически получал 1.0.

Таким образом, вам не нужно масштабировать значения с плавающей запятой, проблема в том, что вы УЖЕ масштабируете свои фиксированные значения, а остальная часть вашего приложения уже настроена для компенсации этого. Когда используется float, этот существующий масштабный коэффициент теперь не делает то, что вы хотите.

Например, приведите ваше приложение в рабочее состояние, выполнив правильное преобразование в фиксированное (int << 16, если ваши точки хранятся в целых числах), и вы увидите ту же ошибку. Как только вы найдете это преобразование и исправите его, тогда «правильное исправление» и float должны вести себя одинаково. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...