Shader khusus - Unity - Diffuse+Lightmap+normal+cubemap

Saya telah mengerjakan shader khusus untuk proyek menggunakan Unity 4.6 karena shader Unity menawarkan beragam pilihan tetapi bukan yang saya cari. Saya telah melihat Stackoverflow tentang masalah shader saya, tetapi setiap pertanyaan adalah tentang masalah rumit dan sangat teknis menggunakan shader. Menurut saya, milik saya cukup sederhana (untuk pengembang berpengalaman) tetapi belum diposting.

Inilah masalahnya: Saya ingin menggabungkan 2 shader untuk mendapatkan shader "Diffuse+normal+cubemap+lighmap".

Jadi, di satu sisi saya memiliki shader "Diffuse + NormalMap + LightMap" yang terlihat seperti ini (ini adalah legacy/lighmap bumpedspec a dengan sedikit penyesuaian untuk mendapatkan kilau specular):

 Shader "Legacy Shaders/Lightmapped/Custom/BumpedSpec" {
Properties {
    _Color ("Main Color", Color) = (1,1,1,1)
    _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)
    _Shininess ("Shininess", Range (0.03, 1)) = 0.078125
    _MainTex ("Base (RGB)", 2D) = "white" {}
    _BumpMap ("Normalmap", 2D) = "bump" {}
    _LightMap ("Lightmap (RGB)", 2D) = "black" {}
}

SubShader {
    LOD 200
    Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf BlinnPhong
struct Input {
  float2 uv_MainTex;
  float2 uv_BumpMap;
  float2 uv2_LightMap;
};
sampler2D _MainTex;
sampler2D _LightMap;
sampler2D _BumpMap;
float4 _Color;
float _Shininess;

void surf (Input IN, inout SurfaceOutput o)
{
  half4 tex = tex2D (_MainTex, IN.uv_MainTex);
  o.Albedo = tex.rgb * _Color;
  half4 lm = tex2D (_LightMap, IN.uv2_LightMap);
  o.Emission = lm.rgb*o.Albedo.rgb;
  o.Gloss = tex.a;
  o.Alpha = lm.a * _Color.a;
  o.Specular = _Shininess;
  o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
}
ENDCG
}
FallBack "Legacy Shaders/Lightmapped/VertexLit"
}

Dan di sisi lain, saya punya shader dengan "Diffuse+cubemap+Lightmap" yang terlihat seperti ini :

Shader "Custom/CubeLightmap" {
Properties {
    _Color ("Main Color", Color) = (1,1,1,1)
    _ReflectColor ("Reflection Color", Color) = (1,1,1,0.5)
    _MainTex ("Base (RGB) RefStrength (A)", 2D) = "white" {}
    _Cube ("Reflection Cubemap", Cube) = "_Skybox" { TexGen CubeReflect }
    _LightMap ("Lightmap (RGB)", 2D) = "lightmap" { LightmapMode }
}
SubShader {
    LOD 200
    Tags { "RenderType"="Opaque" }

CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
samplerCUBE _Cube;
sampler2D _LightMap;
fixed4 _Color;
fixed4 _ReflectColor;
struct Input {
    float2 uv_MainTex;
    float3 worldRefl;
    float2 uv2_LightMap;
};
void surf (Input IN, inout SurfaceOutput o) {
    fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
    fixed4 c = tex * _Color;
    o.Albedo = c.rgb;   
    half4 lm = tex2D(_LightMap,IN.uv2_LightMap);   
    fixed4 reflcol = texCUBE (_Cube, IN.worldRefl);
    reflcol *= tex.a;
    o.Emission = lm.rgb * reflcol.rgb * _ReflectColor.rgb;
    o.Alpha = reflcol.a * _ReflectColor.a * lm.a;
}
ENDCG
}   
FallBack "Reflective/VertexLit"
}

Jadi saya ingin menggabungkan keduanya (alias menyertakan peta kubus di yang pertama atau menyertakan peta normal di yang kedua) dan saya tidak dapat memahaminya untuk saat ini.

Jadi saya membutuhkan saran atau bantuan untuk mencapainya.

Terima kasih sebelumnya, Salam


person Nicolas GREVERIE    schedule 16.01.2015    source sumber
comment
Pengembang berpengalaman tidak berkata apa-apa, apakah Anda berpengalaman dalam menulis shader? Atau lebih dari seorang pemula dalam shader, dan untuk tujuan apa Anda menginginkan shader ini. Mungkin ada shader sederhana yang menghasilkan efek yang sama.   -  person MX D    schedule 17.01.2015
comment
Saya baru dalam penyesuaian shader tetapi saya sudah terbiasa dengan Unity3D dan skrip. Tujuan dari shader ini adalah untuk menambahkan banyak efek untuk rendering yang realistis. Saya menggunakan lightmap dari render Vray dan saya memerlukan peta normal dan refleksi kubus dalam shader yang sama agar material berperilaku benar secara real time. Akhirnya saya menggunakan diffuse untuk mendapatkan tekstur standar yang bisa saya alihkan untuk mendapatkan berbagai visual.   -  person Nicolas GREVERIE    schedule 19.01.2015


Jawaban (1)


Bagi saya sepertinya Anda ingin membuat shader pemetaan normal radiositas. Ini mengharuskan Anda setidaknya mengetahui dasar-dasar C++, dan HSLSmasukkan deskripsi gambar di sini

Masalah terbesar yang akan Anda temui adalah cara menghitung peta normal radiositas, karena hal ini memerlukan pembuat peta cahaya yang dibuat khusus. Satu-satunya perangkat lunak yang saya tahu dapat melakukan hal ini adalah Beast by AutoDesk

Setelah itu Anda memerlukan beberapa shader sederhana. Ada beberapa penjelasan yang terdokumentasi dengan baik, dan kode yang relevan terdapat di

person MX D    schedule 19.01.2015
comment
Terima kasih banyak atas informasinya. Tampaknya sedikit lebih sulit daripada menggabungkan 2 shader kesatuan pada pesan pertama saya ›.‹ Saya akan memeriksanya lebih dekat dan memposting hasilnya - person Nicolas GREVERIE; 19.01.2015
comment
lebih sulit daripada hanya menggabungkan 2 shader. Semoga Anda berhasil. Semoga beruntung - person MX D; 19.01.2015