Стекло

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

Стекло

Сообщение Courvee 28 окт 2010, 19:27

Всем привет. Прошу небольшой помощи. Шейдеры, увы, писать не умею, а очень нужно стекло. Суть: Текстура в диффузе, с прозрачностью через альфу, и с отражениями из кубмапы. Если есть у кого, скиньте плиз :ympray: ! Нашел такой на офф. форуме, но он не работает. Отражений нет.
Моя специализация: 3D. Моделирую, текстурирую, анимирую.
Аватара пользователя
Courvee
UNIт
 
Сообщения: 91
Зарегистрирован: 19 фев 2010, 08:11
Откуда: Россия, г. Оренбург
  • Сайт
  • ICQ

Re: Стекло

Сообщение gnoblin 28 окт 2010, 21:01

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

Re: Стекло

Сообщение Courvee 28 окт 2010, 21:10

Вот он:

Синтаксис:
Используется 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"
}
 
Аватара пользователя
Courvee
UNIт
 
Сообщения: 91
Зарегистрирован: 19 фев 2010, 08:11
Откуда: Россия, г. Оренбург
  • Сайт
  • ICQ

Re: Стекло

Сообщение gnoblin 07 ноя 2010, 03:28

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

Re: Стекло

Сообщение gerasim 07 ноя 2010, 12:12

да, надо реальные шейдеры. Прямой набор из CG, штоли, не стандартные [unity 3D] :
Стекло, бетон. пластмасса.. Перевод шейдеров, чем вопщемто gnoblin и занимаетца, но он уж очень спецыфичен)
То альфу, то калейдоскоп.
Неследите - и неследимы будете.
Аватара пользователя
gerasim
UNITрон
 
Сообщения: 166
Зарегистрирован: 17 апр 2009, 15:56
Откуда: Самара

Re: Стекло

Сообщение Spike 08 ноя 2010, 00:20

Держи для 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"
}

 
Spike
UNIт
 
Сообщения: 51
Зарегистрирован: 22 сен 2009, 22:40

Re: Стекло

Сообщение arybashov 08 ноя 2010, 16:38

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

Re: Стекло

Сообщение gnoblin 08 ноя 2010, 17:40

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

Re: Стекло

Сообщение gerasim 08 ноя 2010, 23:27

Был ещё шейдер с Френелем - вот тот получше, а здесь только Кубемапа играет, а само стекло просто полуТранспорант.
Неследите - и неследимы будете.
Аватара пользователя
gerasim
UNITрон
 
Сообщения: 166
Зарегистрирован: 17 апр 2009, 15:56
Откуда: Самара

Re: Стекло

Сообщение Spike 09 ноя 2010, 00:29

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

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


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

Re: Стекло

Сообщение gnoblin 09 ноя 2010, 01:18

а в чем отличие от
Код: Выделить всё
half4 reflcol = texCUBE (_Cube, IN.worldRefl);

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

Re: Стекло

Сообщение Spike 09 ноя 2010, 18:40

gnoblin писал(а):а в чем отличие от
Код: Выделить всё
half4 reflcol = texCUBE (_Cube, IN.worldRefl);

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

в данном случае разницы не какой.
В принципе IN.worldRefl даже правильней написать.
Привык, что все самому надо вычислять, а тут уже все посчитано.
Spike
UNIт
 
Сообщения: 51
Зарегистрирован: 22 сен 2009, 22:40

Re: Стекло

Сообщение Spike 13 ноя 2010, 01:45

Первая текстура диффуза (грязь, рисунок на стекле), альфа канал определяет максимальную прозрачность. Вторя текстура кубмапа.

Синтаксис:
Используется 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"
}
Последний раз редактировалось Spike 14 ноя 2010, 16:50, всего редактировалось 1 раз.
Spike
UNIт
 
Сообщения: 51
Зарегистрирован: 22 сен 2009, 22:40

Re: Стекло

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

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

Re: Стекло

Сообщение Spike 14 ноя 2010, 17:04

Вот оно. Пока дела скриншот, заметил багу, шейдер не правильно реагировал на свет. пофиксил :D

prev_Glass_01.png
У вас нет доступа для просмотра вложений в этом сообщении.
Spike
UNIт
 
Сообщения: 51
Зарегистрирован: 22 сен 2009, 22:40

След.

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

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

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