Borderlands (EdgeDetection поверх текстуры)

Для экспериментальных разработок и тем "я нашел чужой исходник, почему он не работает?"

Re: Borderlands (EdgeDetection поверх текстуры)

Сообщение gnoblin 05 ноя 2010, 02:44

Добавил в название последней версии шейдера "+" чтобы потом не путаться :).
Скриншот для "BorderLands2+":
borderlands2+.jpg


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

Re: Borderlands (EdgeDetection поверх текстуры)

Сообщение gnoblin 05 ноя 2010, 02:50

Battle Angel Alita писал(а):Вот такая зависимость хорошо смотрится

Синтаксис:
Используется glsl
        o.Normal = half3(0.0, 0.0, 1.0);
        float NdotV = dot(o.Normal, normalize(IN.viewDir));
       
        edgeSqr = (edgeSqr - _thr * NdotV) * _tweak;
        edgeSqr = saturate(edgeSqr);
 


Да, смотрится просто очешуенно!
borderlands2++.jpg


Код шейдера:
Синтаксис:
Используется glsl
Shader "BorderLands2++"
{
        Properties
        {
                _MainTex ("Texture", 2D) = "white" {}
                _thr("threshold", Float) = 0.15
                _tweak("???", Float) = -20.0
        }
        SubShader
        {
                Tags { "RenderType" = "Opaque" }
CGPROGRAM
#include "UnityCG.cginc"
#pragma surface surf Lambert
#pragma target 3.0

sampler2D _MainTex;
float2 _MainTex_TexelSize;
float _thr;
float _tweak;

struct Input
{
        float2 uv_MainTex;
        float3 viewDir;
};

void surf (Input IN, inout SurfaceOutput o)
{
        float2 off = _MainTex_TexelSize;
       
        // Sample the neighbor pixels
        float s00 = Luminance(tex2D(_MainTex, IN.uv_MainTex + float2(-off.x, -off.y)).rgb);
        float s01 = Luminance(tex2D(_MainTex, IN.uv_MainTex + float2( 0, -off.y)).rgb);
        float s02 = Luminance(tex2D(_MainTex, IN.uv_MainTex + float2( off.x, -off.y)).rgb);
        float s10 = Luminance(tex2D(_MainTex, IN.uv_MainTex + float2(-off.x, 0)).rgb);
        float s12 = Luminance(tex2D(_MainTex, IN.uv_MainTex + float2( off.x, 0)).rgb);
        float s20 = Luminance(tex2D(_MainTex, IN.uv_MainTex + float2(-off.x, off.y)).rgb);
        float s21 = Luminance(tex2D(_MainTex, IN.uv_MainTex + float2( 0, off.y)).rgb);
        float s22 = Luminance(tex2D(_MainTex, IN.uv_MainTex + float2( off.x, off.y)).rgb);
        // Sobel filter in X and Y direction
        float sobelX = s00 + 2 * s10 + s20 - s02 - 2 * s12 - s22;
        float sobelY = s00 + 2 * s01 + s02 - s20 - 2 * s21 - s22;
        // Find edge using a threshold of 0.07 which works generally
        // well for general edge detection.
        float edgeSqr = (sobelX * sobelX + sobelY * sobelY);
       
                o.Normal = half3(0.0, 0.0, 1.0);
        float NdotV = dot(o.Normal, normalize(IN.viewDir));
       
        edgeSqr = (edgeSqr - _thr * NdotV) * _tweak;
        edgeSqr = saturate(edgeSqr);
       
        //edgeSqr = (edgeSqr - _thr) * _tweak;
        //edgeSqr = saturate(edgeSqr);
       
        o.Emission = tex2D(_MainTex, IN.uv_MainTex);
        o.Emission = o.Emission * edgeSqr;

        /*
        o.Normal = half3(0.0, 0.0, 1.0);
        float NdotV = dot(o.Normal, normalize(IN.viewDir));
        //mad with NdotV
        NdotV = saturate(NdotV * 1.5);
        NdotV = pow(NdotV, 2.0);
        NdotV = clamp(NdotV, 0.0, 0.9);
       
        o.Emission = lerp(o.Emission * edgeSqr, o.Emission, NdotV);
        */

}
ENDCG

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

Re: Borderlands (EdgeDetection поверх текстуры)

Сообщение Battle Angel Alita 05 ноя 2010, 14:42

вот шейдер который влазиет в шейдеры-2.0, плюс настройка цвета граней
к сожалению у меня не получается передать текстурные координаты из вершинного шейдера в пиксельный, поэтому сделала просто немного другой едж-детекшн
bo.png

зы. я цвет в Емиссион кидаю исключительно для простоты разработки, правильно было-бы кидать его в Альбедо
Синтаксис:
Используется glsl
Shader "BorderLands2+++"
{
        Properties
        {
                _MainTex ("Texture", 2D) = "white" {}
                _BumpMap ("Normalmap", 2D) = "bump" {}
                _TintColor("Tint(RGB), Intensity(A)(0-4)", Color) = (0.0, 0.0, 0.0, 0.0)
                _thr("threshold", Float) = 0.2
                _tweak("???", Float) = -40.0
        }
        SubShader
        {
                Tags { "RenderType" = "Opaque" }
CGPROGRAM
#include "UnityCG.cginc"
#pragma surface surf Lambert

sampler2D _MainTex;
sampler2D _BumpMap;
float4 _TintColor;
float2 _MainTex_TexelSize;
float _thr;
float _tweak;

struct Input
{
        float2 uv_MainTex;
        float2 uv_BumpMap;
        float3 viewDir;
};

void surf (Input IN, inout SurfaceOutput o)
{
        float2 off = _MainTex_TexelSize;
       
        // Rotated Grid Roberts Cross
        float s_ul = Luminance(tex2D(_MainTex, IN.uv_MainTex + float2(-off.x * 1.5, -off.y * 0.5)).rgb);
        float s_ur = Luminance(tex2D(_MainTex, IN.uv_MainTex + float2(+off.x * 0.5, -off.y * 1.5)).rgb);
        float s_dl = Luminance(tex2D(_MainTex, IN.uv_MainTex + float2(-off.x * 0.5, +off.y * 1.5)).rgb);
        float s_dr = Luminance(tex2D(_MainTex, IN.uv_MainTex + float2(+off.x * 1.5, +off.y * 0.5)).rgb);

        float robertX = abs(s_ul - s_dr);
        float robertY = abs(s_ur - s_dl);
        float edge = robertX + robertY;
       
        o.Normal = float3(0.0, 0.0, 1.0);
        float NdotV = dot(o.Normal, normalize(IN.viewDir));
       
        edge = (edge - _thr * NdotV) * _tweak;
        edge = saturate(edge);
       
        o.Emission = tex2D(_MainTex, IN.uv_MainTex);
        //o.Emission = o.Emission * edge;
        o.Emission = lerp(o.Emission * _TintColor.rgb * _TintColor.a * 4.0, o.Emission, edge);
       
        o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
}
ENDCG

        }
Fallback "Diffuse"
}
 
У вас нет доступа для просмотра вложений в этом сообщении.
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

Re: Borderlands (EdgeDetection поверх текстуры)

Сообщение gnoblin 05 ноя 2010, 15:35

так нормально передавать ув?

Синтаксис:
Используется glsl
Shader "VertUV2Pix" {
        Properties {
                _MainTex ("Base (RGB)", 2D) = "white" {}
                _S ("S", Float) = 0.078125
        }
        SubShader {
                Tags { "RenderType"="Opaque" }
                LOD 200
               
                CGPROGRAM
                #pragma surface surf Lambert vertex:vert

                sampler2D _MainTex;
                float _S;
               
                struct Input {
                        float2 uv_MainTex;
                        float2 customUV;
                };
               
            void vert (inout appdata_full v, out Input o) {
                        o.customUV = v.texcoord + half2(_S, 0);
                }
               
                void surf (Input IN, inout SurfaceOutput o) {
                        half4 c = tex2D (_MainTex, IN.customUV);
                        o.Albedo = c.rgb;
                        o.Alpha = c.a;
                }
                ENDCG
        }
        FallBack "Diffuse"
}
 
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Borderlands (EdgeDetection поверх текстуры)

Сообщение Battle Angel Alita 05 ноя 2010, 16:18

gnoblin
Тут либо я туплю, либо компиллер сюрфейс-шейдеров...

Вот что у меня было и не работало
Код: Выделить всё
struct Input
{
   float2 uv_MainTex;
   float2 uv_BumpMap;
   float2 uv_robert[4];
   float3 viewDir;
};


Оказывается
1. float2 uv_robert[4] вот так вот писать нельзя, надо писать float2 robert[4]
2. массивы компиллер не понимает, поэтому вместо float2 robert[4] - float2 robert1, float2 robert2, float2 robert3, float2 robert4
3. теперь оказывается мы невлазием во вторые шейдеры по кол-ву интерполяторов, пришлось включать ручки и показывать компилятору как надо -
Код: Выделить всё
***
   float4 robert01;
   float4 robert23;
***
   o.robert01.xy = v.texcoord + ...
   o.robert01.zw = v.texcoord + ...
   o.robert23.xy = v.texcoord + ...
   o.robert23.zw = v.texcoord + ...
***

4. Теперь вроде-бы всё нормально... НО, не работает тайлинг/оффсет. Попытка сделать так o.robert01.xy = o.uv_MainTex + ... ни к чему не привела.

шаг влево, шаг вправо - расстрел. прыжок на месте расцениваю как попытку улететь

:смайлик бьющийся головой об стену:
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

Re: Borderlands (EdgeDetection поверх текстуры)

Сообщение gnoblin 05 ноя 2010, 16:53

если
Код: Выделить всё
o.robert01.xy = o.uv_MainTex +


это про вершинный шейдер, то у меня там работает только в таком виде:

Код: Выделить всё
o.robert01.xy = v.texcoord +
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Borderlands (EdgeDetection поверх текстуры)

Сообщение gnoblin 05 ноя 2010, 16:57

вот такая структура влазит во вторые шейдеры:

struct Input {
float2 uv_MainTex;
float4 robert1;
float4 robert2;
float2 uv_BumpMap;
float3 viewDir;
};

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

Re: Borderlands (EdgeDetection поверх текстуры)

Сообщение Battle Angel Alita 13 ноя 2010, 08:37

Надо было умножить координаты на текстурную матрицу.

Синтаксис:
Используется glsl
Shader "BorderLands3"
{
        Properties
        {
                _MainTex ("Texture", 2D) = "white" {}
                _BumpMap ("Normalmap", 2D) = "bump" {}
                _TintColor("Tint(RGB), Intensity(A)(0-4)", Color) = (0.0, 0.0, 0.0, 0.0)
                _thr("threshold", Float) = 0.2
                _tweak("???", Float) = -40.0
        }
        SubShader
        {
                Tags { "RenderType" = "Opaque" }
CGPROGRAM
#include "UnityCG.cginc"
#pragma surface surf Lambert vertex:vert

sampler2D _MainTex;
sampler2D _BumpMap;
float4 _TintColor;
float2 _MainTex_TexelSize;
float _thr;
float _tweak;

struct Input
{
        float2 uv_MainTex;
        float2 uv_BumpMap;
        float4 robert01;
        float4 robert23;
        float3 viewDir;
};


void vert (inout appdata_full v, out Input o)
{
        float2 uv = mul(UNITY_MATRIX_TEXTURE0, v.texcoord);
        o.robert01.xy = uv + float2(-_MainTex_TexelSize.x * 1.5, -_MainTex_TexelSize.y * 0.5);
        o.robert01.zw = uv + float2(+_MainTex_TexelSize.x * 0.5, -_MainTex_TexelSize.y * 1.5);
        o.robert23.xy = uv + float2(-_MainTex_TexelSize.x * 0.5, +_MainTex_TexelSize.y * 1.5);
        o.robert23.zw = uv + float2(+_MainTex_TexelSize.x * 1.5, +_MainTex_TexelSize.y * 0.5);
}


void surf (Input IN, inout SurfaceOutput o)
{
        // Rotated Grid Roberts Cross
        float s_ul = Luminance(tex2D(_MainTex, IN.robert01.xy).rgb);
        float s_ur = Luminance(tex2D(_MainTex, IN.robert01.zw).rgb);
        float s_dl = Luminance(tex2D(_MainTex, IN.robert23.xy).rgb);
        float s_dr = Luminance(tex2D(_MainTex, IN.robert23.zw).rgb);

        float robertX = abs(s_ul - s_dr);
        float robertY = abs(s_ur - s_dl);
        float edge = robertX + robertY;
       
        o.Normal = float3(0.0, 0.0, 1.0);
        float NdotV = dot(o.Normal, normalize(IN.viewDir));
       
        edge = (edge - _thr * NdotV) * _tweak;
        edge = saturate(edge);
       
        o.Albedo = tex2D(_MainTex, IN.uv_MainTex);
        o.Albedo = lerp(o.Albedo * _TintColor.rgb * _TintColor.a * 4.0, o.Albedo, edge);
        //o.Emission = tex2D(_MainTex, IN.uv_MainTex);
        //o.Emission = lerp(o.Emission * _TintColor.rgb * _TintColor.a * 4.0, o.Emission, edge);
       
        o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
}
ENDCG

        }
Fallback "Bumped Diffuse"
}

 
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

Re: Borderlands (EdgeDetection поверх текстуры)

Сообщение S_L_A_V_A 24 дек 2010, 01:16

По мойму в бордерлендс нет едж детекшена поверх текстур, только объекты через ворлд спейс карту нормалей камеры.
На текстурах все рисуется художником. Описано в Behind Borderlands' 11th-hour style change - http://www.gdcvault.com/play/1012480/Bo ... -11th-Hour
S_L_A_V_A
UNец
 
Сообщения: 3
Зарегистрирован: 24 дек 2010, 01:00

Re: Borderlands (EdgeDetection поверх текстуры)

Сообщение NOVA 27 июл 2012, 21:56

S_L_A_V_A писал(а):По мойму в бордерлендс нет едж детекшена поверх текстур, только объекты через ворлд спейс карту нормалей камеры.
На текстурах все рисуется художником. Описано в Behind Borderlands' 11th-hour style change - http://www.gdcvault.com/play/1012480/Bo ... -11th-Hour

Они могут писать что угодно, но как делали не скажут. Лично я придерживаюсь мнения, что эффект краски отрисован в текстурах, а вот грани ложаться программно, иначе при отдалении их бы просто не было видно. Соответственно с нормалями они тоже что-то мутят в зависимоти от угла наклона карты нормалей. Как-то так.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

Re: Borderlands (EdgeDetection поверх текстуры)

Сообщение alex4x 20 апр 2017, 12:21

(3A4OT)
Подскажите, а в UNITY есть возможность получить текстуру, в которой цвет будет нормалью в данной точке к направлению камеры ? [curved_hands]
И еще текстуру глубины точки - тоже можно получить?

Изображение
alex4x
UNец
 
Сообщения: 11
Зарегистрирован: 29 июн 2016, 15:12

Re: Borderlands (EdgeDetection поверх текстуры)

Сообщение jetyb 21 апр 2017, 08:01

Да, см мануалы на английском.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Пред.

Вернуться в Шейдерная кузня

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

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