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

Стекло

СообщениеДобавлено: 28 окт 2010, 19:27
Courvee
Всем привет. Прошу небольшой помощи. Шейдеры, увы, писать не умею, а очень нужно стекло. Суть: Текстура в диффузе, с прозрачностью через альфу, и с отражениями из кубмапы. Если есть у кого, скиньте плиз :ympray: ! Нашел такой на офф. форуме, но он не работает. Отражений нет.

Re: Стекло

СообщениеДобавлено: 28 окт 2010, 21:01
gnoblin
Прикладывайте тот который не работает (только оригинальный, до импорта в тройку - она вставляет комменты).

Re: Стекло

СообщениеДобавлено: 28 окт 2010, 21:10
Courvee
Вот он:

Синтаксис:
Используется glsl
Shader "Glass Shader" {
        Properties {
                _Color ("Main Color", Color) = (1,1,1,1)
                _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
                _ReflectColor ("Reflection Color", Color) = (1,1,1,0.5)
                _Cube ("Reflection Cubemap", Cube) = "_Skybox" { TexGen CubeReflect }
                _ReflectStrength( "Reflection Strength" , Range(0,1)) = 0.5
        }
       
Category {
        Tags {Queue=Transparent}
        Alphatest Greater 0
        ZWrite Off
        ColorMask RGB
       
        // ------------------------------------------------------------------
        // ARB fragment program
       
        SubShader {
                // Ambient pass
                Pass {
                        Name "BASE"
                        Tags {"LightMode" = "PixelOrNone"}
                        Fog { Color [_AddFog] }
                        Blend SrcAlpha OneMinusSrcAlpha
                        Color [_PPLAmbient]
                        SetTexture [_MainTex] {constantColor [_Color] Combine texture * primary DOUBLE, texture * primary}
                }
                // Vertex lights
                Pass {
                        Name "BASE"
                        Tags {"LightMode" = "Vertex"}
                        Fog { Color [_AddFog] }
                        Blend SrcAlpha OneMinusSrcAlpha
                        Lighting On
                        Material {
                                Diffuse [_Color]
                                Emission [_PPLAmbient]
                        }
                        SetTexture [_MainTex] {combine texture * primary DOUBLE, texture * primary}
                }
                // Pixel lights
                Pass { 
                        Name "PPL"
                        Tags { "LightMode" = "Pixel" }
                        Blend SrcAlpha One
                        Fog { Color [_AddFog] }

CGPROGRAM
#pragma fragment frag
#pragma vertex vert
#pragma multi_compile_builtin_noshadows
#pragma fragmentoption ARB_fog_exp2
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
#include "AutoLight.cginc"

struct v2f {
        V2F_POS_FOG;
        LIGHTING_COORDS
        float2  uv;
        float3  normal;
        float3  lightDir;
        float3    reflection;
};

uniform float4 _MainTex_ST;

v2f vert (appdata_base v)
{
        v2f o;
        PositionFog( v.vertex, o.pos, o.fog );
        o.normal = v.normal;
        o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
        o.lightDir = ObjSpaceLightDir( v.vertex );
        float3 viewDir = ObjSpaceViewDir( v.vertex );
        float3 reflection = reflect( -viewDir,v.normal);
        o.reflection = mul( (float3x3)_Object2World , reflection);
        TRANSFER_VERTEX_TO_FRAGMENT(o);
        return o;
}

uniform sampler2D _MainTex;
uniform float4 _Color;
uniform samplerCUBE _Cube;
uniform float4 _ReflectColor;
uniform float _ReflectStrength;

float4 frag (v2f i) : COLOR
{
        half4 texcol = tex2D( _MainTex, i.uv );
        half4 c = DiffuseLight( i.lightDir, i.normal, texcol, LIGHT_ATTENUATION(i) );
        c.a = texcol.a * _Color.a;
       
        half4 reflectCol = texCUBE( _Cube , i.reflection );
        reflectCol *= _ReflectColor;
        reflectCol *= _ReflectStrength;
       
        c.rgb *= reflectCol.rgb;
       
        return c;
}
ENDCG

                        SetTexture [_MainTex] {combine texture}
                        SetTexture [_LightTexture0] {combine texture}
                        SetTexture [_LightTextureB0] {combine texture}
                }
        }
}
       
        FallBack "Transparent/Diffuse"
}
 

Re: Стекло

СообщениеДобавлено: 07 ноя 2010, 03:28
gnoblin
Надо будет сделать, забыл про него.

Re: Стекло

СообщениеДобавлено: 07 ноя 2010, 12:12
gerasim
да, надо реальные шейдеры. Прямой набор из CG, штоли, не стандартные [unity 3D] :
Стекло, бетон. пластмасса.. Перевод шейдеров, чем вопщемто gnoblin и занимаетца, но он уж очень спецыфичен)
То альфу, то калейдоскоп.

Re: Стекло

СообщениеДобавлено: 08 ноя 2010, 00:20
Spike
Держи для 3 - ки.

Синтаксис:
Используется glsl
Shader "Glass Shader" {
        Properties {
                _Color ("Main Color", Color) = (1,1,1,1)
                _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
                _ReflectColor ("Reflection Color", Color) = (1,1,1,0.5)
                _Cube ("Reflection Cubemap", Cube) = "_Skybox" { TexGen CubeReflect }
                _ReflectStrength( "Reflection Strength" , Range(0,1)) = 0.5
        }
       
     
       
SubShader {
           
Tags { "Queue"="Transparent"  "RenderType" = "Transparent" }   


CGPROGRAM
#pragma surface surf Lambert alpha

struct Input  {

        float2 uv_MainTex;
                float3 worldRefl;
};

uniform sampler2D _MainTex;
uniform float4 _Color;
uniform samplerCUBE _Cube;
uniform float4 _ReflectColor;
uniform float _ReflectStrength;

void surf (Input IN, inout SurfaceOutput o)
{
               
        float4 texcol = tex2D(_MainTex, IN.uv_MainTex);
        texcol.a = texcol.a * _Color.a;
       
        float4 reflectCol = texCUBE( _Cube , WorldReflectionVector (IN, o.Normal) );
               
        reflectCol *= _ReflectColor;
        reflectCol *= _ReflectStrength;
       
        texcol.rgb *= reflectCol.rgb ;

        o.Albedo = texcol;
        o.Alpha = texcol.a;
}
ENDCG

 }
       
        FallBack "Transparent/Diffuse"
}

 

Re: Стекло

СообщениеДобавлено: 08 ноя 2010, 16:38
arybashov
Чтобы стекло выглядело реалистично - нужно ввести функцию зависимости силы отражения и прозрачности от нормали полигона к оси камеры т.е. если мы смотрим на полигон прямо - он максимально прозрачен и отражения на нем минимальны - а если полигон развернут к нам ребром то он не прозрачен и отражения на нем максимальны - если при этом используется и рефракция то следует еще изменять коэффициент рефракции. Я пока еще не ковырял шейдера - поэтому - если вы могли бы внести эти изменения в шейдер - был бы очень благодарен вам! Тогда у всех был бы нормальный шейдер стекла!

Re: Стекло

СообщениеДобавлено: 08 ноя 2010, 17:40
gnoblin
маленькое замечание по предыдущему шейдеру - насколько я знаю WorldReflectionVector используется только для объектов с нормалмапой, тут бампа нету - поэтому операция лишняя. Не? :)

Re: Стекло

СообщениеДобавлено: 08 ноя 2010, 23:27
gerasim
Был ещё шейдер с Френелем - вот тот получше, а здесь только Кубемапа играет, а само стекло просто полуТранспорант.

Re: Стекло

СообщениеДобавлено: 09 ноя 2010, 00:29
Spike
Была просьба перенести шейдер на 3- ку, про френель ни кто не чего не говорил. Сделать его не проблема. Как только найду время, сделаю.

gnoblin писал(а):маленькое замечание по предыдущему шейдеру - насколько я знаю WorldReflectionVector используется только для объектов с нормалмапой, тут бампа нету - поэтому операция лишняя. Не? :)


В шейдере все правильно, worldRefl возвращает отраженный вектор на основе нормали модели, а если дописать INTERNAL_DATA
тогда с помощью WorldReflectionVector (IN, o.Normal) можно вернуть вектор отражения с учетом бампа, если перед этим в o.Normal рассчитали нормаль с использованием карты нормалей.

Re: Стекло

СообщениеДобавлено: 09 ноя 2010, 01:18
gnoblin
а в чем отличие от
Код: Выделить всё
half4 reflcol = texCUBE (_Cube, IN.worldRefl);

как сделано в built-in reflective diffuse шейдере?

Re: Стекло

СообщениеДобавлено: 09 ноя 2010, 18:40
Spike
gnoblin писал(а):а в чем отличие от
Код: Выделить всё
half4 reflcol = texCUBE (_Cube, IN.worldRefl);

как сделано в built-in reflective diffuse шейдере?

в данном случае разницы не какой.
В принципе IN.worldRefl даже правильней написать.
Привык, что все самому надо вычислять, а тут уже все посчитано.

Re: Стекло

СообщениеДобавлено: 13 ноя 2010, 01:45
Spike
Первая текстура диффуза (грязь, рисунок на стекле), альфа канал определяет максимальную прозрачность. Вторя текстура кубмапа.

Синтаксис:
Используется glsl


Shader "Glass Shader" {
        Properties {
                _Color ("Main Color", Color) = (1,1,1,1)
                _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
                _ReflectColor ("Reflection Color", Color) = (1,1,1,0.5)
                _Cube ("Reflection Cubemap", Cube) = "_Skybox" { TexGen CubeReflect }
                _ReflectStrength( "Reflection Strength" , Range(0,1)) = 0.5
                _Fresnel( "Fresnel " , Range(0,5)) = 1.0
        }
       
     
       
SubShader {
           
Tags { "Queue"="Transparent"  "RenderType" = "Transparent" }   


CGPROGRAM
#pragma surface surf Lambert alpha

struct Input  {

        float2 uv_MainTex;
        float3 viewDir;
                float3 worldRefl;
};

uniform sampler2D _MainTex;
uniform float4 _Color;
uniform samplerCUBE _Cube;
uniform float4 _ReflectColor;
uniform float _ReflectStrength;
uniform float _Fresnel;

void surf (Input IN, inout SurfaceOutput o)
{
               
        float4 texcol = tex2D(_MainTex, IN.uv_MainTex);
        texcol.rgb *=_Color.rgb;
        texcol.a = texcol.a * _Color.a;
       
        float4 reflectCol = texCUBE( _Cube , IN.worldRefl );
               
        reflectCol *= _ReflectColor;
        reflectCol *= _ReflectStrength;
       
        float3 view = normalize( IN.viewDir );
        float fresnel = pow(1.0 - saturate ( dot ( view, o.Normal )), _Fresnel);
       
        texcol.rgb += reflectCol.rgb * fresnel ;
       
                o.Albedo = texcol.rgb;
                o.Alpha = texcol.a +  fresnel ;
}
ENDCG

 }
       
        FallBack "Transparent/Diffuse"
}

Re: Стекло

СообщениеДобавлено: 13 ноя 2010, 02:02
gnoblin
ещё бы скриншот O:-)

Re: Стекло

СообщениеДобавлено: 14 ноя 2010, 17:04
Spike
Вот оно. Пока дела скриншот, заметил багу, шейдер не правильно реагировал на свет. пофиксил :D

prev_Glass_01.png