Да я предыдущий пример привёл к тому что слои в процедуре не обязательно сначала разбирать, а потом собирать, писать можно сразу все каналы, причём с учётом изначальной текстуры. А сглаживание - это как дополнительный эффект. При общем блуре будут размываться границы там где этого не должно быть, хотя здесь оно не сильно заметно. Заметно будет, когда у тебя будут заполнены все слои, например размоет границы тропинки или резкого обрыва.
А что с освещением? Какое ты хочешь освещение-то? В оригинале на ландшафт была налеплена теневая текстура.
А, вон оно что, ты хотел встроенный шейдер пиксельного освещения повесить. Здесь не получится, он заменяется кастомным, который у тебя с текстурами работает. Его придётся расширить примерно как-то так:
Код
//Cg // //Cg profile arbvp1 arbfp1
void vshader( in float4 vtx_position : POSITION, in float2 vtx_texcoord0 : TEXCOORD0, in float4 vtx_normal : NORMAL, in uniform float4x4 mat_modelproj, in uniform float3 light_vec, in uniform float ambient, in uniform float scale, out float l_brightness, out float4 l_position : POSITION, out float2 l_texcoord0 : TEXCOORD0, out float2 l_detail1 : TEXCOORD1, out float2 l_detail2 : TEXCOORD2, out float2 l_detail3 : TEXCOORD3, out float2 l_detail4 : TEXCOORD4 ) { l_position = mul(mat_modelproj,vtx_position); l_texcoord0 = vtx_texcoord0;
//detail texture coordinates scaled, we must get the correct scale fator to make terrain look like in EarthSculptor l_detail1 = vtx_texcoord0 * 9.3; //27.365000 in EarthSculptor l_detail2 = vtx_texcoord0 * 12.8; //20.000000 in EarthSculptor l_detail3 = vtx_texcoord0 * 7.9; //32.340000 in EarthSculptor l_detail4 = vtx_texcoord0 * 11.5; //22.389999 in EarthSculptor
А, вон оно что, ты хотел встроенный шейдер пиксельного освещения повесить. Здесь не получится, он заменяется кастомным, который у тебя с текстурами работает. Его придётся расширить примерно как-то так:
А если тени? эт так и дописывать придется
Проверил свой вариант.
Только края блур порвал в квадраты, нужно будет попробовать фильтр с обводкой перед блуром.
Да ты в курсе. Ведь она в мануале. Но почему то по ссылкам можно кликать до третьей страницы. А дальше с 3-х поменять постепенно до 12-ти или 13-ти, точно не помню.
Может где изначально и есть ссылки, но попал на ни я только через поисковик.
С тенями сложнее. Надо либо как-то изворачиваться генерировать теневую карту отдельно. Из плюсов - можно хорошее разрешение, из минусов - статичность, не будет меняться в зависимости от положения источника света. Либо делать динамические тени - тут уже что-то из стандартных подходов брать.
Я, если честно, не помню - мануал по диагонали смотрел - только интересующие куски.
С тенями сложнее. Надо либо как-то изворачиваться генерировать теневую карту отдельно. Из плюсов - можно хорошее разрешение, из минусов - статичность, не будет меняться в зависимости от положения источника света. Либо делать динамические тени - тут уже что-то из стандартных подходов брать.
Похоже одним словом на жирный минус панды. Какой-то тупик получается при использовании шейдеров, ты вынужден переводить обычные вещи для движка в шейдер, свет, тени, и еще хз что придется. ООП -
Сообщение отредактировал serg-kkz - Суббота, 30.08.2014, 12:21
Эти "обычные вещи" реализованы всё теми же шейдерами, просто это скрыто от пользователя для упрощения. Насколько я понимаю работу шейдеров - такое поведение будет в любом движке. Если ты переписываешь стандартные шейдеры на кастомные, то естественно стандартные на данном объекте работать не будут. Кстати, с тенями можешь попробовать стандартный шейдер, возможно прокатит. Зависит от реализации. Если тень накладывается на объект, то эффекта не будет, если же это будет постпроцессом на отрендеренную картинку, то должно работать
Я все рассуждаю, про обычные вещи не ужели MultiTexture в панде понимается просто слои, думаю можно было бы доделать маски для слоев. В чем проблема? Ведь глядя на эти примеры Примеры очевидно что это реализуемо. ООП -
"Обычные" - не значит наиболее простые. Хотя раз уж хочешь немножко извращений, можешь посмотреть в сторону TextureStage.setCombineAlpha. С помощью него можно попробовать обойтись без шейдеров. Но лично я бы рассматривал этот вариант в последнюю очередь, либо при жёсткой установке, что мол шейдеры использовать нельзя.
Шейдеры использовать можно, но когда их осваивать? или из пальца высосать. Мне как то кажется в этом направлении в панде не доделка. А выход новой версии как то все не появляется. Я тут на ночь глядя сделал заключение, перед этим повертел еще один двиг вдоль и поперек. Так вот пришел к выводу что панда еще не дотягивает до уровня движка(стоит оговорится игрового), как - бы библиотека классов где классы до ума как - бы доведены и как - бы нет, а если доводятся с новыми релизами и то очень долго.
Вот в архиве пример еще одной реализации тераайна по маскам. (конечно шейдерный вариант) И он не поддается освещению.
Насчёт того что панда - не движок - я бы поспорил, впрочем каждый под этим делом понимает своё. Огр, например, принято считать движком, хотя он от движка куда как дальше чем Панда. Для кого-то движок - это конструктор, для кого-то - связка нужных библиотек.
Насчёт шейдеров - это опять же не часть движка, а общий инструментарий видеокарт, поэтому в мануале дано только представление о том какие средства панда имеет для связки с шейдерами. Шейдеры - отдельная большая тема, причём часто зависимая от производителя железа, на тему шейдеров написана куча материала (к сожалению в основном на английском) и объять всё это в мануале движка думаю просто нереально. Если есть мануал к другому движку о том как писать шейдеры, особенно на русском - поделись, с удовольствием почитаю.
Никто не говорит что Панда идеальный вылизанный двиг, своих проблем там хватает. Плюс Панды в том, что если тебя что-то не устраивает, то при наличии определённых знаний ты можешь взять и сам это исправить ибо исходники открыты. -----------------
Теперь к примеру. 1. В шейдере не учтено масштабирование террайна и не совсем понятно зачем минус перед нормалью.
Код
// lighting float3 N = normalize( float3(vtx_normal.x*30, vtx_normal.y*30, vtx_normal.z) ); float3 L = normalize( k_lightvec.xyz ); l_brightness = (max( dot( N, L ), 0.0f )*k_lightcolor)+k_ambientlight;
2. Входящие параметры не совсем, точне совсем не корректны
Во-первых: для всех трёх достаточно трехкомпонентного вектора Во-вторых: вектор освещения - нулевой, т.е. он ниоткуда не светит. Цвет освещения - чёрный О_о. Окружающее освещение на максимум о_О откуда уж тут теням взяться?