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

Шейдеры из GTA 4

СообщениеДобавлено: 22 сен 2011, 18:27
PetkaGtA
Конвертирую шейдеры из gta4 на юнити и столкнулся с проблемой: нужно помножить текстуру спекуляра на некоторые значения маски то есть если зеленый то флоат3 будет выглядеть так - 0,1,0 и т.п. , но в оригинальном шейдере значится так: dp3 r2.x, r2, c73 что значит - mul(SpecSamp, specMapIntMask) в юнити же выдает огромное количество ошибок как с этим бороться может я что-то неправильно делаю?

Re: Шейдеры из GTA 4

СообщениеДобавлено: 22 сен 2011, 18:53
gnoblin
просто умножить *

Re: Шейдеры из GTA 4

СообщениеДобавлено: 22 сен 2011, 20:11
PetkaGtA
пробовал проблема в том что получается спекуляр с цветом этой маски(если 0,0,1 то цвет будет синим а не белым) вообще работает mul но не в юнити а в RenderMonkey

Re: Шейдеры из GTA 4

СообщениеДобавлено: 23 сен 2011, 07:54
Guyver
как там было ... хохо! ..

а кто вам сказал что dp float, vec3, vec3 = mul vec, vec?

вы знаете чем отличается скалярное произведение векторов от векторного ? )

Re: Шейдеры из GTA 4

СообщениеДобавлено: 23 сен 2011, 16:20
PetkaGtA
собственно вот код:
Синтаксис:
Используется glsl
//   sampler2D BumpSampler;
//   sampler2D SpecSampler;
//   sampler2D StippleTexture;
//   sampler2D TextureSampler;
//   float bumpiness;
//   float4 globalScalars;
//   float3 specMapIntMask;
//   float specularColorFactor;
//   float specularFactor;
//   float4 stencil;
//
//
// Registers:
//
//   Name                Reg   Size
//   ------------------- ----- ----
//   globalScalars       c39      1
//   stencil             c52      1
//   specularFactor      c66      1
//   specularColorFactor c72      1
//   specMapIntMask      c73      1
//   bumpiness           c74      1
//   TextureSampler      s0       1
//   BumpSampler         s1       1
//   SpecSampler         s2       1
//   StippleTexture      s10      1
//

    ps_3_0
    def c0, -1, 0, 1, 0
    def c1, -0.5, 9.99999975e-006, 0.5, 0.001953125
    def c2, 3.99600005, 4, 0.125, 0.25
    dcl_texcoord v0.xy
    dcl_texcoord1 v1.xyz
    dcl_texcoord4 v2.xyz
    dcl_texcoord5 v3.xyz
    dcl_color v4.xw
    dcl vPos.xy
    dcl_2d s0
    dcl_2d s1
    dcl_2d s2
    dcl_2d s10
    texld r0, v0, s0
    mul r0.w, r0.w, v4.w
    mul r0.w, r0.w, c39.x
    mov_sat r1.x, r0.w
    mul r1.x, r1.x, c2.x
    frc r1.y, r1.x
    mul r1.z, r1.y, c2.y
    frc r1.w, r1.z
    add r2.xy, r1.zxzw, -r1.wyzw
    mul r1.xy, c2.z, vPos
    frc r1.xy, r1_abs
    cmp r1.xy, vPos, r1, -r1
    mul r1.xy, r1, c2.w
    mad r1.xy, r2, c2.w, r1
    texld r1, r1, s10
    cmp r1, -r1.y, c0.x, c0.y
    texkill r1
    texld r1, v0, s1
    add r1.z, -r1.w, c0.z
    add r1.z, -r1.x, r1.z
    cmp r1.z, r1.z, c0.w, c0.z
    lrp r2.xy, r1.z, r1, r1.wyzw
    add r1.xy, r2, c1.x
    mul r1.xy, r1, c74.x
    dp2add r1.z, r2, -r2, c0.z
    rsq r1.z, r1.z
    rcp r1.z, r1.z
    mul r2.xyz, r1.x, v2
    mad r1.xzw, v1.xyyz, r1.z, r2.xyyz
    mad r1.xyz, r1.y, v3, r1.xzww
    add r1.xyz, r1, c1.y
    dp3 r1.w, r1, r1
    rsq r1.w, r1.w
    texld r2, v0, s2
    mul r2.w, r2.w, c66.x
    dp3 r2.x, r2, c73
    mul r2.x, r2.x, c72.x
    mad r1.xyz, r1, r1.w, c0.z
    mul oC1.xyz, r1, c1.z
    mul oC2.x, r2.x, c1.z
    mul r1.x, r2.w, c1.w
    rsq r1.x, r1.x
    rcp oC2.y, r1.x
    mov oC0, r0
    mov oC1.w, r0.w
    mov oC2.z, v4.x
    mov oC2.w, r0.w
    mov r0.zw, c0
    mul oC3, r0.zwww, c52.x

// approximately 50 instruction slots used (4 texture, 46 arithmetic)

я не очень разбираюсь в векторах и mul(Tex2D,Float3) я вывел не просто ради смеха потому что там есть dp3 что значит некоторая функция с matrix1x3 пробовал эту штуку в RenderMonkey и как не странно работает причем как надо в общем ассембли код в RenderMonkey выглядит так:
Синтаксис:
Используется glsl
//
// Generated by Microsoft (R) HLSL Shader Compiler 9.22.949.2248
//
// Parameters:
//
//   sampler2D BumpSampler;
//   sampler2D SpecSampler;
//   sampler2D baseMap;
//   float bumpiness;
//   float4 fvAmbient;
//   float4 fvDiffuse;
//   float3 specMapIntMask;
//   float specularColorFactor;
//   float specularFactor;
//
//
// Registers:
//
//   Name                Reg   Size
//   ------------------- ----- ----
//   fvAmbient           c0       1
//   fvDiffuse           c1       1
//   bumpiness           c2       1
//   specMapIntMask      c3       1
//   specularColorFactor c4       1
//   specularFactor      c5       1
//   baseMap             s0       1
//   BumpSampler         s1       1
//   SpecSampler         s2       1
//

    ps_2_0
    def c6, 2, -1, 0, 0
    dcl t0.xy
    dcl t1.xyz
    dcl t2.xyz
    dcl_2d s0
    dcl_2d s1
    dcl_2d s2
    texld r0, t0, s1
    texld r1, t0, s2
    texld r2, t0, s0
    mad r0.xyz, r0, c6.x, c6.y
    nrm r3.xyz, r0
    mul r3.xy, r3, c2.x
    nrm r0.xyz, t2
    dp3 r0.w, r3, r0
    mul r3.xyz, r3, r0.w
    mul r4, r0.w, c1
    mad r0.xyz, r3, c6.x, -r0
    nrm r3.xyz, r0
    nrm r0.xyz, t1
    dp3 r1.w, r3, r0
    max r0.x, r1.w, c6.z
    pow r1.w, r0.x, c5.x
    <span style="text-decoration: underline">dp3 r0.x, r1, c3</span>
    mul r0.x, r0.x, c4.x
    mul r3, r2, r4
    mad r2, c0, r2, r3
    mad_sat r0, r0.x, r1.w, r2
    mov oC0, r0

// approximately 32 instruction slots used (3 texture, 29 arithmetic)
 

в юнити это сделать мне не удается. пока буду дорабатывать то что сделал до этого и ждать вашего ответа ну и заодно вопрос : появилась проблема с повершинной альфой вот скрин

Re: Шейдеры из GTA 4

СообщениеДобавлено: 24 сен 2011, 17:46
PetkaGtA
У меня таки получилось :ymparty: спасибо майкрософту (http://msdn.microsoft.com/en-us/library ... 57(v=VS.85).aspx) выкладываю первую версию шейдера gta_normal_spec а на счет того что dp3(и dp4) и есть mul то mul это просто упрощенная формула но в юнити она работает только с матрицами
вот собственно сам шейдер:
Синтаксис:
Используется glsl
Shader "gta_normal_spec"
{
        Properties
        {
BumpSampler("Bump Texture", 2D) = "normalmap" {}
SpecSampler("Specular Texture", 2D) = "specularmap" {}
TextureSampler("Diffuse Texture", 2D) = "" {}
globalScalars("globalScalars", Vector) = (1,1,1,1)
bumpinnes("Bumpiness", Float) = 0.2
specMapIntMask("SpecularMapIntensityMask", Vector) = (1,0,0,0)
specularColorFactor("Specular Intensity", Float) = (0.1,0,0,0)
specularFactor("Specular Falloff", Float) = 0.1
        }
       
        SubShader
        {
                Tags
                {
"Queue"="Geometry"
"IgnoreProjector"="False"
"RenderType"="Opaque"

                }

               
Cull Off
Blend SrcAlpha OneMinusSrcAlpha
Fog{
}


                CGPROGRAM
#pragma surface surf BlinnPhongEditor  vertex:vert
#pragma target 2.0

sampler2D BumpSampler;
sampler2D SpecSampler;
sampler2D TextureSampler;
float bumpinnes;
float4 globalScalars;
float3 specMapIntMask;
float4 specularColorFactor;
float specularFactor;

                        struct EditorSurfaceOutput {
                                half3 Albedo;
                                half3 Normal;
                                half3 Emission;
                                half3 Gloss;
                                half Specular;
                                half Alpha;
                                half4 Custom;
                        };
                       
                        inline half4 LightingBlinnPhongEditor_PrePass (EditorSurfaceOutput s, half4 light)
                        {
half3 spec = light.a * s.Gloss;
half4 c;
c.rgb = (s.Albedo * light.rgb + light.rgb * spec);
c.a = s.Alpha;
return c;

                        }

                        inline half4 LightingBlinnPhongEditor (EditorSurfaceOutput s, half3 lightDir, half3 viewDir, half atten)
                        {
                                half3 h = normalize (lightDir + viewDir);
                               
                                half diff = max (0, dot ( lightDir, s.Normal ));
                               
                                float nh = max (0, dot (s.Normal, h));
                                float spec = pow (nh, s.Specular*128.0);
                               
                                half4 res;
                                res.rgb = _LightColor0.rgb * diff;
                                res.w = spec * Luminance (_LightColor0.rgb);
                                res *= atten * 2.0;

                                return LightingBlinnPhongEditor_PrePass( s, res );
                        }
                       
                        struct Input {
                                float2 uvTextureSampler;
                                float4 color : COLOR;
                        };

                        void vert (inout appdata_full v, out Input o) {
float4 VertexOutputMaster0_0_NoInput = float4(0,0,0,0);
float4 VertexOutputMaster0_1_NoInput = float4(0,0,0,0);
float4 VertexOutputMaster0_2_NoInput = float4(0,0,0,0);
float4 VertexOutputMaster0_3_NoInput = float4(0,0,0,0);


                        }
                       

                        void surf (Input IN, inout EditorSurfaceOutput o) {
                                o.Normal = float3(0.0,0.0,1.0);
                                o.Alpha = 1.0;
                                o.Albedo = 0.0;
                                o.Emission = 0.0;
                                o.Gloss = 0.0;
                                o.Specular = 0.0;
                                o.Custom = 0.0;
                               
float4 Tex2D0=tex2D(TextureSampler,(IN.uvTextureSampler.xyxy).xy);
Tex2D0 *= IN.color;
float4 SpecSamp=tex2D(SpecSampler,(IN.uvTextureSampler.xyxy).xy);
float4 Tex2DNormal0=float4(UnpackNormal( tex2D(BumpSampler,(IN.uvTextureSampler.xyxy).xy)).xyz, 1.0 );
Tex2DNormal0.xy *= bumpinnes;
SpecSamp.x = SpecSamp.y = SpecSamp.z = SpecSamp.w =
  (SpecSamp.x * specMapIntMask.x) + (SpecSamp.y * specMapIntMask.y) + (SpecSamp.z * specMapIntMask.z);
o.Albedo = Tex2D0;
o.Normal = Tex2DNormal0;
o.Specular = specularFactor;
o.Gloss = specularColorFactor.xxxx * SpecSamp;
o.Alpha = Tex2D0.a;

                                o.Normal = normalize(o.Normal);
                        }
                ENDCG
        }
        Fallback "Diffuse"
}


пока еще не решил проблему с альфой никто не знает почему она такая баганутая?
потом выложу другие шейдеры из GTA4(когда доработаю)

Re: Шейдеры из GTA 4

СообщениеДобавлено: 24 сен 2011, 18:05
gnoblin
зачем портировать обычный бампед спек, если он уже поставляется с юнити?

Re: Шейдеры из GTA 4

СообщениеДобавлено: 24 сен 2011, 18:11
Neodrop
Ну как же - "..и Опыт, сын ошибок трудных".
Пожалуй, только за этим. Но это немало ;) :ymparty:

Re: Шейдеры из GTA 4

СообщениеДобавлено: 24 сен 2011, 18:21
PetkaGtA
gnoblin писал(а):зачем портировать обычный бампед спек, если он уже поставляется с юнити?

ну во первых в GTA4 есть настройка силы бампа и в одной карте спекуляра может быть три-четыре текстуры которые можно регулировать (SpecMapIntMask) ну и в GTA4 есть какая-то текстура пунктира(скорее всего только из за нее в GTA4 используются 3 шейдеры) заодно в GTA4 есть повершинное освещение(заранее нужно сделать в 3ds max-е) и повершинная альфа которая очень нужна для грязи например ну или чтобы некоторые объекты были не такими непрозрачными (напр. граффити). вот сейчас сделаю еще несколько шейдеров(еммисивы,спекуляры,скины,деколи и т. п.)

Re: Шейдеры из GTA 4

СообщениеДобавлено: 24 сен 2011, 18:56
Neodrop
Вероятно, проще прикрепить демку, чем пальцы загибать считая (popcorn)
Нэ? :-?

Re: Шейдеры из GTA 4

СообщениеДобавлено: 24 сен 2011, 19:31
gnoblin
PetkaGtA писал(а):ну во первых в GTA4 есть настройка силы бампа

это можно добавить в существующий юнити шейдер.

PetkaGtA писал(а):и в одной карте спекуляра может быть три-четыре текстуры которые можно регулировать (SpecMapIntMask)

а зачем это? не совсем понял.

PetkaGtA писал(а):ну и в GTA4 есть какая-то текстура пунктира(скорее всего только из за нее в GTA4 используются 3 шейдеры)

этот пункт для меня загадка :)

PetkaGtA писал(а):заодно в GTA4 есть повершинное освещение(заранее нужно сделать в 3ds max-е)

речь про лайтмапинг?

PetkaGtA писал(а):и повершинная альфа которая очень нужна для грязи например ну или чтобы некоторые объекты были не такими непрозрачными (напр. граффити).

:ympeace:

Re: Шейдеры из GTA 4

СообщениеДобавлено: 24 сен 2011, 19:50
PetkaGtA
Neodrop писал(а):Вероятно, проще прикрепить демку

к сожалению пока не могу да и честно говоря толку от этого не много
gnoblin писал(а):речь про лайтмапинг?

нет речь про по-вешинное а не по-пиксельное освещение однако оно должно быть сделано в 3ds max
gnoblin писал(а):это можно добавить в существующий юнити шейдер

ну вообще-то я почти так и сделал

Re: Шейдеры из GTA 4

СообщениеДобавлено: 24 сен 2011, 21:49
gnoblin
PetkaGtA писал(а):нет речь про по-вешинное а не по-пиксельное освещение однако оно должно быть сделано в 3ds max


нормалмапинг не работает при вертексном освещении,
какое такое освещение можно сделать в 3ds max?

А для тренировки конечно круто, я согласен :-bd

Re: Шейдеры из GTA 4

СообщениеДобавлено: 24 сен 2011, 22:41
Neodrop
Я так понимаю, имеется в виду расчёт освещения в шейдере на базе цвета вершин меша. Нэ ? :-?

Re: Шейдеры из GTA 4

СообщениеДобавлено: 24 сен 2011, 22:47
gnoblin
я и спрашиваю, это как - повертексный лайтмапинг?