Programming and Animation
Programming and animation ideas, articles, tutors, scripts, plugins in the 3d-
GLSL шейдеры: NVidia и AMD
Дата: Май 29th, 2010 Neill Комментариев нетИз личного опыта работы с шейдерами и адаптацией под AMD.
Именно адаптацией, потому что по другому этот процесс не назовешь после их создания под NVidia.
1) AMD не любит ARB_draw_buffers флаг в шейдере. Причем если не указывать никакой флаг вовсе, шейдер компилируется без проблем. А вот NVidia выдает мне предупреждение, что необходимо включать MRT с помощью данного флага.
Когда на Cg шейдеры, там отдельная песня, нужен флаг ATI_draw_buffers
http://developer.nvidia.com/forums/index.php?showtopic=2572
http://developer.nvidia.com/forums/index.php?showtopic=2703&st=0&gopid=7686&#entry7686
http://www.gpgpu.org/forums/viewtopic.php?t=4161
2) AMD ругается на наличие sampler2DRect и sampler2D в одном шейдере. Тоже из разряда «не обращать внимание».
http://www.pouet.net/topic.php?which=5788
Графика, Разное GLSL, OpenGL, shaders, Tips -
Заметки к GLSL шейдерам и их совместимости
Дата: Ноябрь 9th, 2009 Neill Комментариев нетВ ходе работы с шейдерами возникли следующие полезные заметки по совместимости:
1) #version 120 – строка с указанием версии шейдера должна быть самой первой в коде, иначе ATI ругается при компиляции. У меня такая ошибка появилась в результате сборки шейдера из частей.
2) старые ATI и большинство карт INTEL не поддерживают glsl шейдеры, вместо этого у них есть расширения только GL_ARB_VERTEX_PROGRAM, GL_ARB_FRAGMENT_PROGRAM. Выход здесь есть и весьма лаконичный – скачать библиотеку CG от NVidia и перекомпилировать шейдеры в arb программы.
Например: cgc -glsl shader.glsl -profile arbvp1 -o vertex.vp
В данном случае профиль arbvp1 для вершинных программ, а arbfp1 – для фрагментных.
3) В появлением glsl шейдеров, команда glGetString дополнилась новым возможным аргументом GL_SHADING_LANGUAGE_VERSION, который возвращает версию glsl шейдера.
4) У NVidia есть весьма полезная утилита ShaderPerf – анализ шейдера на количество инструкций и скорость выполнения, а также прогонка выполнения шейдера под разные видеокарты и семейства графических чипсетов NVidia. Имеется также возможность сравнить выполнение двух разных шейдеров между собой.
5) не следует указывать вещественные числа с f в конце как 1.0f, достаточно просто написать 1.0. Также ATI очень привередливы к указанию вещественного числа без дробной части.
6) Полезная утилита OpenGL Extension Viewer с базой данных по поддерживаемым расширением для большинства видеокарт. http://www.realtech-vr.com/glview/
Программирование, Графика GLSL, OpenGL, Tips -
GLSL ошибка – pre-mature EOF
Дата: Сентябрь 25th, 2009 Neill Комментариев нетНа ATI видео картах шейдеры отказываются компилироваться ссылаясь на данную ошибку. Причина – комментарии на русском языке.
Программирование, Графика GLSL, OpenGL, Tips -
GLSL: поиск юниформа безуспешен
Дата: Сентябрь 9th, 2009 Neill Комментарии (2)Столкнулся с такой особенностью компилятора GLSL. Если переменная не используется в шейдере, то найти её расположение не будет никакой возможности, она просто урезается из шейдера.
Функция поиска позиции юниформа по имени.
int loc = glGetUniformLocationARB( , );Причем попался даже случай коварней: вроде переменная используется, но результат дальнейшего вычисления – нет, а отчего опять-таки найти исконную переменную нет возможности.
Программирование, Графика C++, GLSL, OpenGL -
GLSL ошибка C7549
Дата: Январь 17th, 2009 Neill Комментарии (2)Решил намедне запустить свое приложение тюнинга автомобилей и оказалось что шейдеры не хотят компилироваться. Видимо за последние два года что-то поменялось, все таки драйвера NVidia переписывают, уже 3 ОГЛ на дворе.
Ошибку выдал шейдер размытия, который используется для bloom эффекта.
Проблемный момент во фрагментном шейдере вот здесь
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21float weights[] = float[](
1.0000,
0.9394,
0.7788,
0.5697,
0.3678,
0.2096,
0.1053,
0.0467,
0.0183
);Теперь же для того чтобы заставить заработать данный массив, нужно указывать версию #version 120 в самом начале шейдера и переписать массив следующим образом
Графика GLSL, OpenGL1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21float weights[] = float[](
1.0000,
0.9394,
0.7788,
0.5697,
0.3678,
0.2096,
0.1053,
0.0467,
0.0183
);



Свежие комментарии