বাহ্যরেখা বস্তু প্রভাব


26

লিগ অফ দ্য লেজেন্ডস বা ডায়াবলো তৃতীয়গুলির অনুরূপ একটি রূপরেখা প্রভাব আমি কীভাবে অর্জন করতে পারি?

কিংবদন্তী লীগের রূপরেখা line কিংবদন্তী লীগের রূপরেখা line ডায়াবলো তৃতীয় রূপরেখা

এটি একটি শেডার ব্যবহার করে করা হয়? কিভাবে?
আমি এমন উত্তরগুলি পছন্দ করতে চাই যা কোনও নির্দিষ্ট ইঞ্জিনের সাথে আবদ্ধ না হয় তবে আমি যে ইঞ্জিনটিতে কাজ করছি তার সাথে মানিয়ে নিতে পারি।

উত্তর:


19

আপনাকে কোনও সময়ে দু'বার বস্তুটি রেন্ডার করতে হবেআপনি একবার কেবল ক্যামেরার মুখোমুখি এবং একবার মুখগুলি ক্যামেরা থেকে দূরে সরে যেতে চাইলে আপনি পালাতে পারেন, তবে এটির বাণিজ্য বন্ধ রয়েছে।

সর্বাধিক সাধারণ সাধারণ সমাধানটি একই পাসে দু'বার উপস্থাপনের মাধ্যমে করা হয়:

  • আপনি অবজেক্টের নরমালগুলি উল্টানোর জন্য একটি ভার্টেক্স শেডার ব্যবহার করেন এবং বাহ্যরেখার আকারে রেন্ডার করার জন্য রূপরেখার আকার এবং একটি খণ্ড শেডার দ্বারা "এটি ফুটিয়ে তুলুন"
  • যে রূপরেখা রেন্ডার উপর, আপনি স্বাভাবিকভাবে বস্তু রেন্ডার। জেড-অর্ডার সাধারণত স্বয়ংক্রিয়ভাবে কম, কম বা কম হয়, যেহেতু রূপরেখাটি মুখের দ্বারা তৈরি হয় যা বস্তুর "পিছনে" থাকে যখন চিত্রটি নিজেই ক্যামেরার মুখোমুখি হয়ে থাকে।

এটি নির্মাণ ও বাস্তবায়নের পক্ষে যথেষ্ট সহজ এবং কোনও রেকর্ড টু টেক্সচার ট্রিকস এড়ানো হয় তবে কয়েকটি লক্ষণীয় ত্রুটি রয়েছে:

  • বাহ্যরেখার আকার, আপনি যদি ক্যামেরা থেকে দূরত্বে এটি স্কেল না করেন তবে পৃথক হবে। আরও দূরে অবজেক্টগুলির নিকটবর্তীগুলির তুলনায় একটি ছোট রূপরেখা থাকবে। অবশ্যই, এটি আপনি যা চান তা হতে পারে ।
  • "ব্লো আপ" ভার্টেক্স শ্যাডার আপনার মতো কঙ্কালের উদাহরণ হিসাবে জটিল বস্তুর জন্য খুব ভাল কাজ করে না, সহজেই রেন্ডারে জেড-ফাইটিং আর্টফেসগুলি প্রবর্তন করছে। এটি স্থির করার জন্য আপনাকে দুটি পাসে অবজেক্টটি রেন্ডার করতে হবে, তবে আপনাকে নরমালগুলি বিপরীত করা থেকে বাঁচায়।
  • যখন অন্য বস্তু একই স্থান দখল করে থাকে এবং প্রতিবিম্ব এবং প্রতিসরণ ছায়ার সাথে মিলিত হয় তখন ডান পেতে সাধারণভাবে ব্যথা হয় তখন রূপরেখা এবং অবজেক্টটি খুব ভাল কাজ করতে পারে না।

এই জাতীয় শেডারের জন্য প্রাথমিক ধারণাটি দেখতে এটির মতো লাগে (সিজি, ইউনিটির জন্য - কোডটি কিছুটা পরিবর্তিত টুন শেডার যা আমি কোথাও পেয়েছি এবং উত্সটি লক্ষ্য করি নি, তাই এটি একটি প্রস্তুত- ব্যবহারের শেডার):

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"
}

অন্যান্য সাধারণ পদ্ধতিটি দ্বিগুণ পাশাপাশি বস্তুকেও রেন্ডার করে তবে ভার্টেক্স শেডারকে পুরোপুরি এড়িয়ে যায়। অন্যদিকে, এটি সহজেই একটি পাসে করা যায় না, এবং টেক্সচারটি রেন্ডার করতে হবে: একবার "ফ্ল্যাট" রূপরেখা বর্ণের ফ্রেম শেডার দিয়ে অবজেক্টটি রেন্ডার করুন এবং এই রেন্ডারে একটি (ওয়েটড) ব্লার ব্যবহার করুন স্ক্রিন স্পেস , তারপরে বস্তুটিকে যথারীতি রেন্ডার করুন।

পদ্ধতিটি বাস্তবায়নের জন্য তৃতীয় এবং সম্ভবত সহজতমও রয়েছে, যদিও এটি জিপিইউকে আরও কিছুটা ট্যাক্স করে এবং আপনার শিল্পীদের আপনার ঘুমের মধ্যে হত্যা করতে চায় যদি না আপনি তাদের তৈরি করা সহজ করে না: অবজেক্টগুলিকে পৃথক হিসাবে রূপরেখা থাকতে হবে পুরো সময় জাল করুন, পুরোপুরি স্বচ্ছ বা অন্য কোথাও সরিয়ে নিয়েছেন যেখানে এটি দেখা যায় না (গভীর ভূগর্ভের মতো) যতক্ষণ না আপনার প্রয়োজন হয়


স্টেনসিল বাফারটি কি এখানে সাধারণত ব্যবহৃত হয় না?
এডিএ-কিএ মার্ট-ওরা-ই

1
@ এডিএ-কামোর্ট-ওরা-ওয়াই: এটি কাজ করতে পারে তবে আমি কখনও এই পদ্ধতির চেষ্টা করিনি, সুতরাং এটি সম্পর্কে মন্তব্য করতে পারি না। :) যদি আপনার মনে একটি কার্যকরী অ্যালগরিদম থাকে তবে এই পদ্ধতিটিকে অন্য উত্তর হিসাবেও নির্দ্বিধায় যোগ করুন।
মার্টিন সোজকা

আমি নিজে এ সম্পর্কে আরও বেশি কিছু জানি না, কেবলমাত্র স্টেনসিল বাফারগুলির উল্লেখে বাহ্যরেখাগুলি প্রায়শই উল্লেখ করা হয়। :) দেখে মনে হচ্ছে এটি আপনার প্রথম পদ্ধতির আরও দুটি হার্ডওয়্যার ভিত্তিক সংস্করণ হতে পারে (দুটি পাস, প্রথমটি বৃহত্তর)।
এডিএ-কিএ মার্ট-ওরা-ই

স্টেনসিল বাফার পদ্ধতি স্টেনসিল বাফারগুলি আপডেট এবং সাফ করার জন্য আরও বেশি ব্যান্ডউইথ ব্যবহার করতে পারে এবং একাধিক পাসের প্রয়োজন। মার্টিনের তালিকাগুলি কিছু সীমিত ক্ষেত্রে এক পাসে করা যেতে পারে, সর্বাধিক দুটি, এবং ন্যূনতম ব্যান্ডউইথ ওভারহেডের প্রয়োজন হয়।
শান মিডলডিচ

এই পদ্ধতির (স্বাভাবিকের সাথে আকারটি ফুটিয়ে তোলা) কিউবগুলির মতো বস্তুর সাথে কাজ করে না (বিশেষত অর্থো ক্যামেরা সহ)। এর কোন সমাধান?
এনপিএস 1'13

4

মার্টিন সোজকাস জবাব ছাড়াও, স্ট্যাটিক অবজেক্টস (বা স্প্রাইটস) এর জন্য আপনি সহজ কিছু দিয়ে দূরে যেতে পারেন।

আপনি একই স্প্রিটটি সংরক্ষণ করতে পারেন তবে আপনার টেক্সচার অ্যাটলাস বা সম্পূর্ণরূপে অন্য কোনও টেক্সচারের রূপরেখা সহ, যা স্যুইচিংকে সহজ করে তোলে। এটি আপনাকে কাস্টমস রূপরেখাগুলিও করতে দেয় যা আরও দৃষ্টি আকর্ষণীয় বা কেবল অন্যরকম দেখায়।

অন্য পদ্ধতিটি হ'ল স্প্রাইটটিকে এক রঙের আকার হিসাবে সংরক্ষণ করা যা কিছুটা বড় এবং স্প্রেডটি নিজেই রেন্ডার হওয়ার ঠিক আগে রেন্ডার করে। এটি আপনাকে নির্বাচনের রঙ সহজেই পরিবর্তন করার দক্ষতা দেবে এবং আপনার মেথ # 1 এর সাথে রূপরেখা স্প্রাইটের মতো আপনার প্রয়োজন মতো বিভিন্ন রঙের আকারের প্রয়োজন নেই।

উভয় আপনার মেমরির পদচিহ্ন যদিও বাড়িয়ে দেবে।


4

মার্টিন সোজকার উত্তরের মন্তব্যে ইঙ্গিত হিসাবে, ফ্লিপকোডে ম্যাক্স ম্যাকগুইয়ার দ্বারা বিবৃত হিসাবে স্টেনসিল বা গভীরতা বাফার ব্যবহার করেও একইরকম প্রভাব অর্জন করা যেতে পারে:

http://www.flipcode.com/archives/Object_Outlining.shtml

এটি মূলত স্টেনসিল বাফারকে একটি স্থির মান হিসাবে সেট করার সময় বর্ধিত রেখার প্রস্থের (বা উদাহরণস্বরূপ D3D এর মতো, যেমন সম্ভব নয়, যেমন মডেলটির একটি ওয়্যারফ্রেম সংস্করণ অঙ্কন করছে) drawing

এই অ্যাপ্রোচটি আজকের ওপেনএল ব্যবহার করে কিছুটা তারিখ হতে পারে এবং অবজেক্টের রূপরেখা অ্যাপ্লায়ার ঝাপসা হয়ে যাওয়ার জন্য, টেক্সচারে রেন্ডারিং এখনও প্রয়োজনীয় হবে will

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.