2012-03-16 4 views
3

Я создал игру OpenGL ES, которая визуализируется с помощью GLKView на iOS. Я также добавил некоторые пользовательские UIButtons, которые расположены поверх GLKView. В рендеринге я рисую несколько звезд, используя режим рендеринга GL_POINTS. Все делает отлично в симуляторе, но выглядит ужасно на устройстве.OpenGL рендеринга GL_POINTS на устройствах iPhone/iPad выглядит ужасно (но отлично выглядит в симуляторе)

Мне было интересно, есть ли у кого-нибудь советы относительно того, что я должен настраивать/искать на устройстве, которое может потребоваться настроить, чтобы получить правильное изображение.

Вот несколько изображений результатов:

Simulator

Screenshot of game running on iPhone simulator.

Устройство

enter image description here

(Пожалуйста, проигнорируйте разницу в масштабировании пользовательских кнопок - снимок экрана устройства был сделан на iPad).

+0

Используете ли вы 'glClearColor()' и 'glClear()' для инициализации своего пространства чертежа перед рендерингом? Если нет, вы можете собирать ранее существующие артефакты. –

+0

Эй, Брэд, я дважды проверил это, и мой glClearColor/glClear, похоже, называется и делает правильные вещи. Я думаю, что если проблема связана с этим, то я тоже увижу тот же результат в симуляторе, но спасибо за предложение - это было что-то проверить! –

ответ

3

Оказывается, проблема заключалась в том, чтобы не устанавливать gl_PointSize в шейдер для OpenGL ES. Скриншоты на самом деле привели меня к этому решению, потому что звезды (нарисованные с использованием режима рендеринга GL_POINTS) настолько радикально ошибочны на устройстве, что на симуляторе.

Предположительно, для настольной версии OpenGL размер точки устанавливается по умолчанию с помощью функции glPointSize (если только GL_VERTEX_PROGRAM_POINT_SIZE не включен). В OpenGL ES нет функции glPointSize, поэтому значение размера точки всегда должно указываться с использованием встроенной переменной gl_PointSize в вершинном шейдере.

+0

Как это сделать, если я использую GLKBaseEffect из GLKit? – Magnus

+0

Я не думаю, что вы можете - вам нужно написать шейдер. –

+1

Избегайте 'GLKBaseEffect'. Он пытается имитировать конвейер с фиксированной функцией, просто узнайте, как работают шейдеры и используют их напрямую. Честно говоря, я не уверен, почему они построили «GLKBaseEffect» или его производные классы. – bobobobo

Смежные вопросы