|
12.01.2012, 18:36
|
#1
|
AnyKey`щик
Регистрация: 21.09.2011
Сообщений: 15
Написано 0 полезных сообщений (для 0 пользователей)
|
Преобразование шейдера на HLSL в ShaderLab
Здравствуйте) Можете привести пример преобразования шейдера на HLSL в ShaderLab или как будет выглядеть выглядеть этот шейдер стекла на HLSL в ShaderLabе http://webfile.ru/5766281 -файл с кодом шейдера, без виручов, если нужно могу скинуть на другой обменник, только какой? Заранее спасибо)
|
(Offline)
|
|
12.01.2012, 20:09
|
#2
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Преобразование шейдера на HLSL в ShaderLab
это не шейдер, это я так понял проект рендер манки
|
(Offline)
|
|
17.01.2012, 17:52
|
#3
|
AnyKey`щик
Регистрация: 21.09.2011
Сообщений: 15
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Преобразование шейдера на HLSL в ShaderLab
Да нет, файл шейдера... Ввопрос все еще в силе, надеюсь на вашу помощь)
|
(Offline)
|
|
17.01.2012, 17:59
|
#4
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Преобразование шейдера на HLSL в ShaderLab
Это файл рендер монкей - как тебе уже сказали. В нём есть шейдер - да, но он форматирован как удобно для рендер манкей.
Ты можешь открыть файл самим рендер монкей, и от туда сохранить в HLSL FX формат. А можешь руками вытянуть от туда само тело функций, и дописать недостающие куски.
Этот файл - не является файлом пригодным для компилятора шейдеров.
|
(Offline)
|
|
17.01.2012, 18:17
|
#5
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Преобразование шейдера на HLSL в ShaderLab
Мне лень ставить рендер манки чтобы вытащить шейдер, лучше сам оттуда вытащи его и выложи сюда, посмотрим.
|
(Offline)
|
|
18.01.2012, 03:56
|
#6
|
AnyKey`щик
Регистрация: 21.09.2011
Сообщений: 15
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Преобразование шейдера на 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? Не понимаю как там объединить вершинный и пиксельный шейдер в один рабочий шейдер...
|
(Offline)
|
|
18.01.2012, 20:53
|
#7
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Преобразование шейдера на HLSL в ShaderLab
Еще бы две текстуры для тестов...
|
(Offline)
|
|
19.01.2012, 00:28
|
#8
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Преобразование шейдера на HLSL в ShaderLab
Но тестировал без текстур, так что может работать не так как ожидалось
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.72, 0.70, 0.76, 1.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 IN, inout SurfaceOutput o) {
// Look up the reflection
float3 reflVec = reflect(-IN.viewDir, o.Normal);
float4 reflection = texCUBE(_Environment, IN.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.viewDir, o.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 = -o.Normal;
float3 y = normalize(cross(cross(IN.viewDir, o.Normal), o.Normal));
// Refraction
float3 refrVec = x * cosine2 + y * sine2;
float4 refraction = texCUBE(_Environment, reflVec);
// 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(_Rainbow, float2(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 + (1 - sine2) * refr + sine2 * rain + _Ambient;
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:04.
|