forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Эффекты/Шейдеры (http://forum.boolean.name/forumdisplay.php?f=170)
-   -   Преобразование шейдера на HLSL в ShaderLab (http://forum.boolean.name/showthread.php?t=16185)

listan 12.01.2012 18:36

Преобразование шейдера на HLSL в ShaderLab
 
Здравствуйте) Можете привести пример преобразования шейдера на HLSL в ShaderLab или как будет выглядеть выглядеть этот шейдер стекла на HLSL в ShaderLabе http://webfile.ru/5766281 -файл с кодом шейдера, без виручов, если нужно могу скинуть на другой обменник, только какой? Заранее спасибо)

pax 12.01.2012 20:09

Ответ: Преобразование шейдера на HLSL в ShaderLab
 
это не шейдер, это я так понял проект рендер манки

listan 17.01.2012 17:52

Ответ: Преобразование шейдера на HLSL в ShaderLab
 
Да нет, файл шейдера... Ввопрос все еще в силе, надеюсь на вашу помощь)

moka 17.01.2012 17:59

Ответ: Преобразование шейдера на HLSL в ShaderLab
 
Это файл рендер монкей - как тебе уже сказали. В нём есть шейдер - да, но он форматирован как удобно для рендер манкей.
Ты можешь открыть файл самим рендер монкей, и от туда сохранить в HLSL FX формат. А можешь руками вытянуть от туда само тело функций, и дописать недостающие куски.

Этот файл - не является файлом пригодным для компилятора шейдеров.

pax 17.01.2012 18:17

Ответ: Преобразование шейдера на HLSL в ShaderLab
 
Мне лень ставить рендер манки чтобы вытащить шейдер, лучше сам оттуда вытащи его и выложи сюда, посмотрим.

listan 18.01.2012 03:56

Ответ: Преобразование шейдера на HLSL в ShaderLab
 
http://webfile.ru/5774456 - файл на формат .fx

Вот код код вершинного шейдера.
Код:

float4x4 view_proj_matrix: register(c0);
float4 view_position: register(c4);
struct VS_OUTPUT {
  float4 Pos:    POSITION;
  float3 normal:  TEXCOORD0;
  float3 viewVec: TEXCOORD1;
};

VS_OUTPUT main(float4 Pos: POSITION, float3 normal: NORMAL){
  VS_OUTPUT Out;

  Out.Pos = mul(view_proj_matrix, Pos);
  Out.normal = normal;
  Out.viewVec = view_position - Pos;

  return Out;
}

Это код пиксельного шейдера)

Код:

float refractionScale: register(c2);
float rainbowScale: register(c3);
float rainbowSpread: register(c4);
float4 baseColor: register(c5);
float ambient: register(c6);
float indexOfRefractionRatio: register(c0);
float reflectionScale: register(c1);
sampler Environment: register(s0);
sampler Rainbow: register(s1);
float4 main(float3 normal: TEXCOORD0, float3 viewVec: TEXCOORD1) : COLOR {
  normal = normalize(normal);
  viewVec = normalize(viewVec);

  // Look up the reflection
  float3 reflVec = reflect(-viewVec, normal);
  float4 reflection = texCUBE(Environment, reflVec.xyz);

  // We'll use Snell's refraction law:
  // n  * sin(theta ) = n  * sin(theta )
  //  i            i    r            r

  // sin(theta )
  //          i
  float cosine = dot(viewVec, normal);
  float sine = sqrt(1 - cosine * cosine);

  // sin(theta )
  //          r
  float sine2 = saturate(indexOfRefractionRatio * sine);
  float cosine2 = sqrt(1 - sine2 * sine2);

  // Out of the sine and cosine of the angle between the
  // refraction vector and the normal we can construct the
  // refraction vector itself given two base vectors.
  // These two base vectors are the negative normal and
  // a tangent vector along the path of the incoming vector
  // relative to the surface.
  float3 x = -normal;
  float3 y = normalize(cross(cross(viewVec, normal), normal));

  // Refraction
  float3 refrVec = x * cosine2 + y * sine2;
  float4 refraction = texCUBE(Environment, refrVec.xyz);

  // Colors refract differently and the difference is more
  // visible the stronger the refraction. We'll fake this
  // effect by adding some rainbowish colors accordingly.
  float4 rainbow = tex1D(Rainbow, pow(cosine, rainbowSpread));

  float4 rain = rainbowScale * rainbow * baseColor;
  float4 refl = reflectionScale * reflection;
  float4 refr = refractionScale * refraction * baseColor;

  // There is more light reflected at sharp angles and less
  // light refracted. There is more color separation of refracted
  // light at sharper angles
  return sine * refl + (1 - sine2) * refr + sine2 * rain + ambient;
}

Как этот шейдер будет выглядеть на языке shaderlab? Не понимаю как там объединить вершинный и пиксельный шейдер в один рабочий шейдер...

pax 18.01.2012 20:53

Ответ: Преобразование шейдера на HLSL в ShaderLab
 
Еще бы две текстуры для тестов...

pax 19.01.2012 00:28

Ответ: Преобразование шейдера на HLSL в ShaderLab
 
Но тестировал без текстур, так что может работать не так как ожидалось

PHP код:

Shader "Custom/Glass" {

    
Properties {

        
_Environment ("Environment Cubemap"Cube) = "" TexGen CubeReflect }

        
_Rainbow ("Rainbow"2D) = "white" {}

        
_RefractionScale ("Refraction Scale"Range(0,1)) = 1.0

        _RainbowScale 
("Rainbow Scale"Range(0,1)) = 0.2

        _RainbowSpread 
("Rainbow Spread"Range(0,3)) = 0.18

        _Color
("Main Color"Color) = (0.720.700.761.00)

        
_Ambient("Ambient"Range(0,1)) = 0.2

        _IndexOfRefractionRatio 
("Index Of Refraction Ratio"Range(0,2)) = 1.14

        _ReflectionScale 
("Reflection Scale"Range(0,1)) = 1.0



    
}

    
SubShader {

        
Tags "RenderType"="Opaque" }

        
LOD 200

        

        CGPROGRAM

        
#pragma surface surf Lambert alpha



        
samplerCUBE _Environment;

        
sampler2D _Rainbow;

        
float _RefractionScale;

        
float _RainbowScale;

        
float _RainbowSpread;

        
float4 _Color;

        
float _Ambient;

        
float _IndexOfRefractionRatio;

        
float _ReflectionScale;



        
struct Input {

            
float2 uv_MainTex;

            
float3 viewDir;

        };



        
void surf (Input INinout SurfaceOutput o) {



           
// Look up the reflection

           
float3 reflVec reflect(-IN.viewDiro.Normal);

           
float4 reflection texCUBE(_EnvironmentIN.viewDir);



           
// We'll use Snell's refraction law:

           // n  * sin(theta ) = n  * sin(theta )

           //  i            i     r            r



           // sin(theta )

           //          i

           
float cosine dot(IN.viewDiro.Normal);

           
float sine sqrt(cosine cosine);



           
// sin(theta )

           //          r

           
float sine2 saturate(_IndexOfRefractionRatio sine);

           
float cosine2 sqrt(sine2 sine2);



           
// Out of the sine and cosine of the angle between the

           // refraction vector and the normal we can construct the

           // refraction vector itself given two base vectors.

           // These two base vectors are the negative normal and

           // a tangent vector along the path of the incoming vector

           // relative to the surface.

           
float3 x = -o.Normal;

           
float3 y normalize(cross(cross(IN.viewDiro.Normal), o.Normal));



           
// Refraction

           
float3 refrVec cosine2 sine2;

           
float4 refraction texCUBE(_EnvironmentreflVec);



           
// Colors refract differently and the difference is more

           // visible the stronger the refraction. We'll fake this

           // effect by adding some rainbowish colors accordingly.

           
float4 rainbow tex2D(_Rainbowfloat2(pow(cosine_RainbowSpread),0));



           
float4 rain _RainbowScale rainbow _Color;

           
float4 refl _ReflectionScale reflection;

           
float4 refr _RefractionScale refraction _Color;



           
// There is more light reflected at sharp angles and less

           // light refracted. There is more color separation of refracted

           // light at sharper angles

           
half4 c sine refl + (sine2) * refr sine2 rain _Ambient;

            
o.Albedo c.rgb;

            
o.Alpha c.a;

        }

        
ENDCG

    


    
FallBack "Diffuse"





Часовой пояс GMT +4, время: 13:56.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot