Texture Bombing

Шейдеры и все-все-все.

Texture Bombing

Сообщение Guyver 28 ноя 2010, 12:32

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 как следствие...
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось Guyver 28 ноя 2010, 21:02, всего редактировалось 2 раз(а).
Xcombat: 3D шутер на летающих тарелках!
Аватара пользователя
Guyver
UNIверсал
 
Сообщения: 392
Зарегистрирован: 21 июл 2010, 08:04
Откуда: Челябинск

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

Сообщение Battle Angel Alita 28 ноя 2010, 13:56

очевидно что артефакт возникает тут: float3 rnd = tex2D ( _RandomTex, rndOffs ).rgb;

У тебя радеон? Попробуй так - float3 rnd = tex2Dlod(_RandomTex, float4(rndOffs, 0.0 0.0)).rgb;
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

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

Сообщение Guyver 28 ноя 2010, 14:13

у меня жифорсик 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

артефакт не вылечился =(
Xcombat: 3D шутер на летающих тарелках!
Аватара пользователя
Guyver
UNIверсал
 
Сообщения: 392
Зарегистрирован: 21 июл 2010, 08:04
Откуда: Челябинск

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

Сообщение Battle Angel Alita 28 ноя 2010, 15:54

Значит так - float4 decCol = tex2Dlod(_BombTex, float4(offs.xy - rnd.xy, 0.0, 0.0));
Вообще, если мне не изменяет память, баг на самом деле из-за floor.
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

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

Сообщение Guyver 28 ноя 2010, 20:32

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

поправил 1й пост..
Xcombat: 3D шутер на летающих тарелках!
Аватара пользователя
Guyver
UNIверсал
 
Сообщения: 392
Зарегистрирован: 21 июл 2010, 08:04
Откуда: Челябинск

Re: Texture Bombing

Сообщение Battle Angel Alita 28 ноя 2010, 22:04

Для чтения _RandomTex tex2Dlod вообще ненужно использовать, а для _BombTex можно просто выключит мип-мапы.
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

Re: Texture Bombing

Сообщение gnoblin 28 ноя 2010, 23:13

$-)
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Texture Bombing

Сообщение Paul Siberdt 28 ноя 2010, 23:43

А теперь Гноблин, вместо моргания капиталистическими глазами, наваяет бомбинг картами нормалей и последующим дистортом основной тектсуры :p ... и с картинками!
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Texture Bombing

Сообщение Guyver 29 ноя 2010, 05:44

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


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


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

п.п.с. мне то бомбинг нужен был немного с дургой целью. убедившись что он не влезет во 2ю модель, я к нему немного остыл )))
хотел сделать генерацию планет: фракталы из текстурного шума + градиент текстура для раскраски в зависимости от высоты + текстурный бомбинг кратеров по поверхности...
всё это в зависимости от Seed и чтобы во 2ю модель влезло хотябы в несколько проходов.
например столкнулся с ещё одной проблемой .. юнити не приемлет 3д текстуры нивкаком виде, что тоже огорчает.
Xcombat: 3D шутер на летающих тарелках!
Аватара пользователя
Guyver
UNIверсал
 
Сообщения: 392
Зарегистрирован: 21 июл 2010, 08:04
Откуда: Челябинск

Re: Texture Bombing

Сообщение gnoblin 29 ноя 2010, 12:35

насчет 3д текстур ошибочка :D.

Я раскладываю текстуру 128х128х128 в две по 1024х1024, и потом просто хитро выбираю нужный кадр... И ок :).
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт


Вернуться в Shader Lab

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2