Комментарий к Статье Введение в GLSL
Введение в язык высокого уровня GLSL (OpenGL Shading Language), используемого для создания фрагментных и вершинных шейдеров. В статье описан синтаксис GLSL, приведены примеры вершинного и пиксельного шейдеров. Статья демонстрируется примером на Delphi.
Поразительное сходство с Cg. Я бы даже назвал ГЛСЛ тем чем должен был бы стать Cg. Даже форма использования, бинды, загрузка, сэмплеры, юниформ, вариинг и т.д. почти один в один совпадают. Если бы в Cg были бы циклы, и другие фичи шейдеров 2.0 я был бы рад. И чем мне Cg особенно симатичен так тем что он и для ДХ и ГЛ, так сказать мультиапи рулит. Короче ничего революционного я не увидел в ГЛСЛ, или там ничего такого не должно быть ?
З.Ы. Делфи мастдай.
>> юниформ, вариинг
Тут как раз значительная разница. В частности, биндинг параметров шейдеров осуществляется совсем по-разному.
>>Если бы в Cg были бы циклы, и другие фичи шейдеров 2.0 я был бы рад.
Так есть там все... В тех профилях, которые поддерживают динамический бранчинг, тот самый динамический бранчинг и есть. А циклы типа for(int i=0;i<n;i++) для заранее известного n компилятор раскрутит. Бранчинг по предикатам, которые известны на этапе компиляции, тоже будет раксручен (см. HL2).
А динамический бранчинг, во-первых, выходит за спецификации пиксельных шейдеров 2.0. А, во-вторых, динамический бранчинг в VS медленен на картах э... ведущего вендора.
>>Короче ничего революционного я не увидел в ГЛСЛ, или там ничего такого не должно быть ?
Было пару лет назад.
PS. Cg масдай, HLSL рулезы.
Короче надо писать компилер абстрактного языка, который компилирует и в GLSL и HLSL. И будет нам счастье :-)
Код пиксельного шейдера я бы писал компактнее... Вот так, к примеру:
void main() { vec4 texColor = texture2D(u_texture, vec2(gl_TexCoord[0]))*gl_Color; vec4 gryColor = vec4(dot(texColor.xyz,vec3(0.2125, 0.7154, 0.0721))); gl_FragColor = mix(texColor,gryColor,v_t); }
Статья хорошая. А когда я говорю хорошая, то это значит-супер!!!
Только я не пойму: чё лучше имплементировать в игру GLSL, CG или ARBшные программы???
Картинок по тексту маловато :-(.
Sark7
>>Компиляция GLSL-шейдеров возложена на драйвер, поэтому не требуются внешние библиотеки (как в Cg).
В драйверах 3dlabs (создателя GLSL всё-таки) компилятор находиться в отдельной библиотеке, поставляемой с драйвером. Кажется, у NVidia схема похожая. :-).
>>Из-за высокоуровневости языка можем получить более оптимизированный код, чем при использовании ассемблероподобных шейдеров, так как у компилятора в этом случае больше простора для творчества ;)
а можем и получить обратный результат (проверялось на компиляторе ATI Ashli(GLSL -> ARB_vp/fp), который, похоже, как раз и входит в состав драйверов 3.10).
viv
>>Короче надо писать компилер абстрактного языка, который компилирует и в GLSL и HLSL.
Короче, все к RenderManу, от которого произошли и Cg, и GLSL и HLSL. И который сам имел С в качестве предтеча :-).
ЗЫ: у меня мх440(как я понял, эти фичи она не поддерживает). так вот прога просто виснет:) неужели никаких проверок нету?
Вполне читаемая статья, эт хорошо что хоть кто-то взялся расписать на русский язык такую вещь. Огромная благодарность. Повезло, что шейдерный код пишется на С, а то разбирали бы тут Дельфи :))
IronPeter
Я думаю он прав был, что написал НЕКОМПАКТНО. Людям надо все полностью пояснить - что к чему, а если он сделал как ты, то было бы много вопросов. После этапа разброрки того, как все устроено нужно уже писать так, как ты привел пример, но на начальном этапе думаю пускай будет громоздко, но понятно :))
//В GLSL fs умеет читать из framebuffer'а цвет (но не альфу) и знает позицию обрабатываемого фрагмента.
А возможно ли прочитать весь framebuffer с Альфой. ??
и как это зделать..
IronPeter
>>Код пиксельного шейдера я бы писал компактнее...
Да, конечно. Я старался запихнуть максимум фишек языка на квадратный метр шейдера ;)
Ilyasim
Ну, спасиба ;)
azazello
>>Картинок по тексту маловато :-(.
Гм ;)
>>В драйверах 3dlabs (создателя GLSL всё-таки) компилятор находиться в отдельной библиотеке, поставляемой с драйвером. Кажется, у NVidia схема похожая. :-).
Ключевые слова здесь - поставляемой с драйвером. Я таки и имел в виду, что компиляция возложена на вендора ;)
>>а можем и получить обратный результат (проверялось на компиляторе ATI Ashli(GLSL -> ARB_vp/fp), который, похоже, как раз и входит в состав драйверов 3.10).
Ну, вообще это говорит о качестве Ashli ;) Тем более, что для ARB и GLSL в железе могут быть разные path.
IROV..
Я тут ошибся немного. В последней редакции GLSL запретили читать из фреймбуфера.
P.S. А вот вам бонус ;) - http://www.gamedev.ru/download/?id=399
Sark7
Thanks за статью!
Я перед Новым годом выкроил малость времени на маханький перевод на Delphi примера из 3DLabs OpenGL2.0 SDK (у меня на страничке)
Спасибо за статью,
некотрый коммент:
Cg и GLSL сильно напоминают Аду с С подобным синтаксом.
Вообще,видимо ада лучше всего и подошла бы.
(ада - язык программирования с паскаль-подобным синтаксом,разработан по поддержке USA DOD и предназначен для использования в военно-космической области,имеет развитые средства проверки правильности кода)
Например, позволяет(опционально) описывать структуры и вызовы на уровне битов, так-же имеет in , out , in out параметры ,итп, все что только нужно для работы в железе(в ракете или в видеокарте).
Имеет несколько плохих вещей типа дурацкого вида "определить a=b" как "a=>b"
(в константах-структурах) ,но это терпеть можно.
(все мастдай, прилетает ракета с прогой на аде)
Мдя, на первый взгляд GLSL не шибко похож на RenderMan.
Философский вопрос, насколько сложно написание компилятора RenderMan SL -> GLSL/hw shaders?
И такой вопрос. Каким образом можно поиграться с GLSL сейчас (т.е. какие либы, железо, драйверы нужны)?
hoknamahn
Ты статью читал? Нужна поддержка трёх расширений.. Если твоя карточка может а драйвер умеет, то вперёд.
Тема в архиве.