среда, 9 января 2013 г.

Некоторые особенности OpenGL

 За время использования OpenGL последних версий (3.3 и выше) накопилось не мало особенностей в его использовании, а так же отличия реализаций от nVidia и AMD, поэтому сформировал небольшой (пока) сборник.


Texture Buffer RGB.
Несмотря на поддержку расширения GL_ARB_texture_buffer_object_rgb32, RGB формат может не работать, а проверить это можно только в шейдере, добавив строку:
 #extension GL_ARB_texture_buffer_object_rgb32 : enable


Const в шейдере.
На видеокартах nVidia для больших константных данных в шейдере лучше использовать ключевое слово uniform вместо const, иначе возможно заметное снижение производительности. Видеокарты от AMD сами оптимизируют этот момент.


Размер uniform buffer с модификатором layout(std140).
Модификатор layout(std140) для блока юниформ предназначен для передачи целых структур данных без получения индексов для отдельных компонентов. Как оказалось реализация от nVidia и AMD отличаются. А отличаются они размером юниформ блока - на nVidia он всегда кратен 16 байтам (в соответствии со спецификацией), а на AMD не происходит выравнивание для последней строчки из-за чего размер может быть 12, 20 и так далее. Особо этот момент я не изучал, так как проблем не возникало, только в отладочной сборке сыпались предупреждения о несовпадении размеров.


Баг с ARB_separate_shader_objects на AMD видеокартах.
При линковке шейдера возникает ошибка: использование не объявленной переменной gl_Position или других встроенных переменных. Устраняется этот баг явным определением встроенных переменных:
out gl_PerVertex {
 vec4 gl_Position;
};


Не передаются значения юниформ на AMD.
Если передать значения юниформ в шейдер, затем без вызова отрисовки забиндить другой шейдер, то значения юниформ не установятся - не самая удачная оптимизация драйверописателей из AMD...

 
Сборник будет пополняться...

Комментариев нет:

Отправить комментарий