Рендеринг OpenGL GL_POINTS на устройствах iPhone/iPad выглядит ужасно (но в симуляторе выглядит совершенно нормально)

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

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

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

Симулятор

Скриншот игры, работающей на симуляторе iPhone.

Устройство

введите здесь описание изображения

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


person James Bedford    schedule 16.03.2012    source источник
comment
Используете ли вы glClearColor() и glClear() для инициализации области рисования перед рендерингом? Если нет, возможно, вы собираете ранее существовавшие артефакты.   -  person Brad Larson    schedule 18.03.2012
comment
Эй, Брэд, я дважды проверил это, и мой glClearColor/glClear, кажется, вызывается и делает правильные вещи. Я думаю, что если бы проблема была связана с этим, я бы увидел тот же результат и в симуляторе, но спасибо за предложение - было что проверить!   -  person James Bedford    schedule 18.03.2012


Ответы (1)


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

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

person James Bedford    schedule 19.03.2012
comment
Как мне это сделать, если я использую GLKBaseEffect из GLKit? - person Magnus; 24.03.2012
comment
Я не думаю, что вы можете - вы должны написать шейдер. - person Steve O'Connor; 06.07.2012
comment
Избегайте GLKBaseEffect. Он пытается имитировать фиксированный конвейер функций, просто изучите, как работают шейдеры, и используйте их напрямую. Честно говоря, я не уверен, почему они построили GLKBaseEffect или его производные классы. - person bobobobo; 16.09.2012