আপনাকে কোনও সময়ে দু'বার বস্তুটি রেন্ডার করতে হবে । আপনি একবার কেবল ক্যামেরার মুখোমুখি এবং একবার মুখগুলি ক্যামেরা থেকে দূরে সরে যেতে চাইলে আপনি পালাতে পারেন, তবে এটির বাণিজ্য বন্ধ রয়েছে।
সর্বাধিক সাধারণ সাধারণ সমাধানটি একই পাসে দু'বার উপস্থাপনের মাধ্যমে করা হয়:
- আপনি অবজেক্টের নরমালগুলি উল্টানোর জন্য একটি ভার্টেক্স শেডার ব্যবহার করেন এবং বাহ্যরেখার আকারে রেন্ডার করার জন্য রূপরেখার আকার এবং একটি খণ্ড শেডার দ্বারা "এটি ফুটিয়ে তুলুন"
- যে রূপরেখা রেন্ডার উপর, আপনি স্বাভাবিকভাবে বস্তু রেন্ডার। জেড-অর্ডার সাধারণত স্বয়ংক্রিয়ভাবে কম, কম বা কম হয়, যেহেতু রূপরেখাটি মুখের দ্বারা তৈরি হয় যা বস্তুর "পিছনে" থাকে যখন চিত্রটি নিজেই ক্যামেরার মুখোমুখি হয়ে থাকে।
এটি নির্মাণ ও বাস্তবায়নের পক্ষে যথেষ্ট সহজ এবং কোনও রেকর্ড টু টেক্সচার ট্রিকস এড়ানো হয় তবে কয়েকটি লক্ষণীয় ত্রুটি রয়েছে:
- বাহ্যরেখার আকার, আপনি যদি ক্যামেরা থেকে দূরত্বে এটি স্কেল না করেন তবে পৃথক হবে। আরও দূরে অবজেক্টগুলির নিকটবর্তীগুলির তুলনায় একটি ছোট রূপরেখা থাকবে। অবশ্যই, এটি আপনি যা চান তা হতে পারে ।
- "ব্লো আপ" ভার্টেক্স শ্যাডার আপনার মতো কঙ্কালের উদাহরণ হিসাবে জটিল বস্তুর জন্য খুব ভাল কাজ করে না, সহজেই রেন্ডারে জেড-ফাইটিং আর্টফেসগুলি প্রবর্তন করছে। এটি স্থির করার জন্য আপনাকে দুটি পাসে অবজেক্টটি রেন্ডার করতে হবে, তবে আপনাকে নরমালগুলি বিপরীত করা থেকে বাঁচায়।
- যখন অন্য বস্তু একই স্থান দখল করে থাকে এবং প্রতিবিম্ব এবং প্রতিসরণ ছায়ার সাথে মিলিত হয় তখন ডান পেতে সাধারণভাবে ব্যথা হয় তখন রূপরেখা এবং অবজেক্টটি খুব ভাল কাজ করতে পারে না।
এই জাতীয় শেডারের জন্য প্রাথমিক ধারণাটি দেখতে এটির মতো লাগে (সিজি, ইউনিটির জন্য - কোডটি কিছুটা পরিবর্তিত টুন শেডার যা আমি কোথাও পেয়েছি এবং উত্সটি লক্ষ্য করি নি, তাই এটি একটি প্রস্তুত- ব্যবহারের শেডার):
Shader "Basic Outline" {
Properties {
_Color ("Main Color", Color) = (.5,.5,.5,1)
_OutlineColor ("Outline Color", Color) = (1,0.5,0,1)
_Outline ("Outline width", Range (0.0, 0.1)) = .05
_MainTex ("Base (RGB)", 2D) = "white" { }
}
SubShader {
Tags { "RenderType"="Opaque" }
Pass {
Name "OUTLINE"
Tags { "LightMode" = "Always" }
CGPROGRAM
#pragma exclude_renderers gles
#pragma exclude_renderers xbox360
#pragma vertex vert
struct appdata {
float4 vertex;
float3 normal;
};
struct v2f
{
float4 pos : POSITION;
float4 color : COLOR;
float fog : FOGC;
};
float _Outline;
float4 _OutlineColor;
v2f vert(appdata v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
float3 norm = mul ((float3x3)UNITY_MATRIX_MV, v.normal);
norm.x *= UNITY_MATRIX_P[0][0];
norm.y *= UNITY_MATRIX_P[1][1];
o.pos.xy += norm.xy * _Outline;
o.fog = o.pos.z;
o.color = _OutlineColor;
return o;
}
ENDCG
Cull Front
ZWrite On
ColorMask RGB
Blend SrcAlpha OneMinusSrcAlpha
SetTexture [_MainTex] { combine primary }
}
Pass {
Name "BASE"
Tags {"LightMode" = "Always"}
CGPROGRAM
#pragma fragment frag
#pragma vertex vert
#pragma fragmentoption ARB_fog_exp2
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float3 viewDir : TEXCOORD1;
float3 normal : TEXCOORD2;
};
v2f vert (appdata_base v)
{
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.normal = v.normal;
o.uv = TRANSFORM_UV(0);
o.viewDir = ObjSpaceViewDir( v.vertex );
return o;
}
uniform float4 _Color;
uniform sampler2D _MainTex;
float4 frag (v2f i) : COLOR
{
half4 texcol = tex2D( _MainTex, i.uv );
half3 ambient = texcol.rgb * (UNITY_LIGHTMODEL_AMBIENT.rgb);
return float4( ambient, texcol.a * _Color.a );
}
ENDCG
}
}
FallBack "Diffuse"
}
অন্যান্য সাধারণ পদ্ধতিটি দ্বিগুণ পাশাপাশি বস্তুকেও রেন্ডার করে তবে ভার্টেক্স শেডারকে পুরোপুরি এড়িয়ে যায়। অন্যদিকে, এটি সহজেই একটি পাসে করা যায় না, এবং টেক্সচারটি রেন্ডার করতে হবে: একবার "ফ্ল্যাট" রূপরেখা বর্ণের ফ্রেম শেডার দিয়ে অবজেক্টটি রেন্ডার করুন এবং এই রেন্ডারে একটি (ওয়েটড) ব্লার ব্যবহার করুন স্ক্রিন স্পেস , তারপরে বস্তুটিকে যথারীতি রেন্ডার করুন।
পদ্ধতিটি বাস্তবায়নের জন্য তৃতীয় এবং সম্ভবত সহজতমও রয়েছে, যদিও এটি জিপিইউকে আরও কিছুটা ট্যাক্স করে এবং আপনার শিল্পীদের আপনার ঘুমের মধ্যে হত্যা করতে চায় যদি না আপনি তাদের তৈরি করা সহজ করে না: অবজেক্টগুলিকে পৃথক হিসাবে রূপরেখা থাকতে হবে পুরো সময় জাল করুন, পুরোপুরি স্বচ্ছ বা অন্য কোথাও সরিয়ে নিয়েছেন যেখানে এটি দেখা যায় না (গভীর ভূগর্ভের মতো) যতক্ষণ না আপনার প্রয়োজন হয়