Страница 1 из 1

Texture Bombing

СообщениеДобавлено: 28 ноя 2010, 12:32
Guyver
Bombing.png


вот статья источник : http://steps3d.narod.ru/tutorials/textu ... orial.html

Текстурка, котой будем бомбордировать должна быть Clamp.
Рэндом текстурка должны быть без фильтрации и наверно даже без мипмапов + Repeat.

вот код упрошённой версии бомбинга (пришлось циклы развернуть и чтобы избежать артефактов на границах ячеек извращаться с tex2Dlod и выставлять 3ю шейдерную модель как следствие)

Синтаксис:
Используется glsl
Shader "TextureBombing"
{
        Properties
        {
                _MainTex("Texture (RGB)", 2D) = "black" {}
                _BombTex("Bomb Texture (RGB)", 2D) = "black" {}
                _RandomTex("Random Texture (RGB)", 2D) = "black" {}
                _Scale("Scale", Float) = 10
        }
   
        SubShader
        {
                Tags { "RenderType" = "Opaque" }
                Cull Back
       
                CGPROGRAM
                #pragma surface surf Lambert
                #pragma target 3.0
               
                sampler2D _MainTex;
                sampler2D _BombTex;
                sampler2D _RandomTex;
                uniform float _Scale;

                struct Input {
                        float2 uv_MainTex;
                        float2 uv_BombTex;
                        float2 uv_RandomTex;
        };
               
        void surf (Input IN, inout SurfaceOutput o) {
                        // get diffuse color
                        float3 decalColor = tex2D ( _MainTex, IN.uv_MainTex ).xyz;
                       
                        // get cell no based on texture coordinates
                        float2 tex = IN.uv_MainTex * _Scale;
                        float2 cell = floor ( tex );
                        float2 offs = tex - cell;
                        float3 rnd;
                        float4 decCol;
               
                        //loop1
                        float2 curCell = cell + float2 ( -1, -1 );
                        float2 curOffs = offs - float2 ( -1, -1 );
                        float2 rndOffs = curCell * float2 ( 0.037, 0.119 );
                       
                        //sample 1
                        #if !defined(SHADER_API_OPENGL)
                                rnd = tex2Dlod ( _RandomTex, float4(rndOffs, 0.0, 0.0) ).xyz;
                                decCol = tex2Dlod( _BombTex, float4(curOffs.xy - rnd.xy, 0.0, 0.0));
                        #else
                                rnd = tex2D ( _RandomTex, rndOffs ).xyz;
                                decCol = tex2D ( _BombTex, curOffs.xy - rnd.xy );
                        #endif
                        decalColor += decCol.xyz*decCol.w;
                       
                        //loop2
                        curCell = cell + float2 ( -1, 0 );
                        curOffs = offs - float2 ( -1, 0 );
                        rndOffs = curCell * float2 ( 0.037, 0.119 );
                       
                        //sample 1
                        #if !defined(SHADER_API_OPENGL)
                                rnd = tex2Dlod ( _RandomTex, float4(rndOffs, 0.0, 0.0) ).xyz;
                                decCol = tex2Dlod( _BombTex, float4(curOffs.xy - rnd.xy, 0.0, 0.0));
                        #else
                                rnd = tex2D ( _RandomTex, rndOffs ).xyz;
                                decCol = tex2D ( _BombTex, curOffs.xy - rnd.xy );
                        #endif
                        decalColor += decCol.xyz*decCol.w;                     
                       
                        //loop3
                        curCell = cell + float2 ( 0, -1 );
                        curOffs = offs - float2 ( 0, -1 );
                        rndOffs = curCell * float2 ( 0.037, 0.119 );
                       
                        //sample 1
                        #if !defined(SHADER_API_OPENGL)
                                rnd = tex2Dlod ( _RandomTex, float4(rndOffs, 0.0, 0.0) ).xyz;
                                decCol = tex2Dlod( _BombTex, float4(curOffs.xy - rnd.xy, 0.0, 0.0));
                        #else
                                rnd = tex2D ( _RandomTex, rndOffs ).xyz;
                                decCol = tex2D ( _BombTex, curOffs.xy - rnd.xy );
                        #endif
                        decalColor += decCol.xyz*decCol.w;
                       
                        //loop4
                        curCell = cell;
                        curOffs = offs;
                        rndOffs = curCell * float2 ( 0.037, 0.119 );
                       
                        //sample 1
                        #if !defined(SHADER_API_OPENGL)
                                rnd = tex2Dlod ( _RandomTex, float4(rndOffs, 0.0, 0.0) ).xyz;
                                decCol = tex2Dlod( _BombTex, float4(curOffs.xy - rnd.xy, 0.0, 0.0));
                        #else
                                rnd = tex2D ( _RandomTex, rndOffs ).xyz;
                                decCol = tex2D ( _BombTex, curOffs.xy - rnd.xy );
                        #endif
                        decalColor += decCol.xyz*decCol.w;
                                               
                        o.Albedo = decalColor;
        }
        ENDCG
    }
   
    FallBack "Diffuse"
}
 


Былобы здорово избавиться от 3й шейдерной модели и tex2Dlod как следствие...

Re: Texture Bombing (нужна помощ)

СообщениеДобавлено: 28 ноя 2010, 13:56
Battle Angel Alita
очевидно что артефакт возникает тут: float3 rnd = tex2D ( _RandomTex, rndOffs ).rgb;

У тебя радеон? Попробуй так - float3 rnd = tex2Dlod(_RandomTex, float4(rndOffs, 0.0 0.0)).rgb;

Re: Texture Bombing (нужна помощ)

СообщениеДобавлено: 28 ноя 2010, 14:13
Guyver
у меня жифорсик 8800

попробовал вставить
#if !defined(SHADER_API_OPENGL)
float3 rnd = tex2Dlod ( _RandomTex, float4(rndOffs, 0.0, 0.0) ).xyz;
#else
float3 rnd = tex2D ( _RandomTex, rndOffs ).xyz;
#endif

артефакт не вылечился =(

Re: Texture Bombing (нужна помощ)

СообщениеДобавлено: 28 ноя 2010, 15:54
Battle Angel Alita
Значит так - float4 decCol = tex2Dlod(_BombTex, float4(offs.xy - rnd.xy, 0.0, 0.0));
Вообще, если мне не изменяет память, баг на самом деле из-за floor.

Re: Texture Bombing (нужна помощ)

СообщениеДобавлено: 28 ноя 2010, 20:32
Guyver
Афигеть! ... вкатило )) ииха ... чёж я не додумался попробовать ещё и 2ю выборку так завернуть....
сейчас доделаю TextureBombing и выложу шейдер с картинкой.

поправил 1й пост..

Re: Texture Bombing

СообщениеДобавлено: 28 ноя 2010, 22:04
Battle Angel Alita
Для чтения _RandomTex tex2Dlod вообще ненужно использовать, а для _BombTex можно просто выключит мип-мапы.

Re: Texture Bombing

СообщениеДобавлено: 28 ноя 2010, 23:13
gnoblin
$-)

Re: Texture Bombing

СообщениеДобавлено: 28 ноя 2010, 23:43
Paul Siberdt
А теперь Гноблин, вместо моргания капиталистическими глазами, наваяет бомбинг картами нормалей и последующим дистортом основной тектсуры :p ... и с картинками!

Re: Texture Bombing

СообщениеДобавлено: 29 ноя 2010, 05:44
Guyver
Battle Angel Alita писал(а):Для чтения _RandomTex tex2Dlod вообще ненужно использовать, а для _BombTex можно просто выключит мип-мапы.


да я уже холодной головой подумал и допёр до этого ....
так или иначе под 2ю модель не завернуть т.к. там очень много выборок ... как это называется ... с непрямыми текс. координатами ... =)


п.с. про дисторт и прочее. могу сделать шейдер кругов от капель воды на поверхности (как в статье), но круги будут белые (максимум полупрозрачные). Чтобы было с бампом, нужно видимо круги сделать градиентными + посчитать нормали от этих градиентов в тангент базисе и передать в процедуру освещения сурф шейдера ... дисторт очевидно делается выборкой из рефракт текстуры по отражённому ветору нормали + можно френеля приделать + рефлект от енв кубемапы.
так или иначе самое сложное это градиент разводов + нормали из карты высот получить.

п.п.с. мне то бомбинг нужен был немного с дургой целью. убедившись что он не влезет во 2ю модель, я к нему немного остыл )))
хотел сделать генерацию планет: фракталы из текстурного шума + градиент текстура для раскраски в зависимости от высоты + текстурный бомбинг кратеров по поверхности...
всё это в зависимости от Seed и чтобы во 2ю модель влезло хотябы в несколько проходов.
например столкнулся с ещё одной проблемой .. юнити не приемлет 3д текстуры нивкаком виде, что тоже огорчает.

Re: Texture Bombing

СообщениеДобавлено: 29 ноя 2010, 12:35
gnoblin
насчет 3д текстур ошибочка :D.

Я раскладываю текстуру 128х128х128 в две по 1024х1024, и потом просто хитро выбираю нужный кадр... И ок :).