একটি সাধারণ রূপরেখা:
Scene াল ছাড়াই আপনার দৃশ্যের গভীরতার মানচিত্র তৈরি করুন । আপনি এটি কার্যকরভাবে নিখরচায় পেতে পারেন, যেহেতু স্বচ্ছ জিনিসগুলি প্রায়শই পরে পাসে রেন্ডার করা হয়। অন্যথায়, আপনি দৃশ্যের সাথে রেন্ডার করে গভীরতার মানচিত্র তৈরি করতে পারেন একটি গভীরতার শেডার সহ কোনও আরটিটি- তে শান শাল্ড ।
আপনার দৃশ্যটি সাধারণত রেন্ডার করুন, গভীরতার মানচিত্রটি আপনার ieldাল শেডারকে দিন।
শ্যাডারে, ঝাল ফ্রেমের খণ্ডের গভীরতা থেকে দৃশ্যের গভীরতার পার্থক্যটি গণনা করুন এবং খণ্ডের রঙটি পরিবর্তন করতে এই পার্থক্যটি ব্যবহার করুন।
ডেমো
আমি এটির একটি সাধারণ ওয়েবজিএল ডেমো লিখেছিলাম।
লাইনে লাইন
আসুন খণ্ড খণ্ড শেডার কোডটি বিশদে বিস্তারিতভাবে চলুন:
float solidsDepth = texture2D(depthMap, gl_FragCoord.xy / dims).r;
প্রতিটি খণ্ডে গভীরতার মানচিত্রের নমুনা করুন। আপনার খণ্ডকে স্ক্রিনের স্থান [0, প্রস্থ / উচ্চতা] থেকে স্বাভাবিকীকরণ [0.0, 1.0] স্থানাঙ্কে রূপান্তর করতে আপনার ভিউপোর্টের মাত্রাগুলি দ্বারা বিভাজন মনে রাখবেন। এই মুহুর্তে, আপনি যদি নমুনা গভীরতার মানচিত্রের পিক্সেলটিতে কেবল খণ্ডের রঙ সেট করেন তবে এটি দেখতে এই রকম হবে:
গভীরতার মানচিত্রটি গ্রেস্কেল, যাতে আপনি যে কোনও চ্যানেল থেকে মান পেতে পারেন (আমি r
এখানে ব্যবহার করেছি )।
float solidsDiff = 1.0 - smoothstep(
zNear,
zFar,
gl_FragCoord.z / gl_FragCoord.w
) - solidsDepth;
এরপরে দৃশ্যের গভীরতা এবং ঝাল খণ্ডের গভীরতার মধ্যে পার্থক্য খুঁজে পাওয়ার জন্য আপনি সেই গভীরতার নমুনাটি ব্যবহার করতে পারেন। [ZNear, zFar] (আপনার ক্যামেরার কাছাকাছি এবং দূরবর্তী বিমান) থেকে [0.0, 1.0] এ নেওয়ার জন্য আপনার গভীরতাও স্বাভাবিক করার কথা মনে রাখবেন। smoothstep
এই সুন্দরভাবে না। 1.0 -
মান যেমন যে invert হয় solidsDiff
এবং 0.0 সর্বনিম্ন (0.0) এ - হয় 1.0 যখন পার্থক্য সর্বোচ্চ (zNear zFar) হয়।
নোট করুন যে আমি ধরে নিয়েছি solidsDepth
যে গভীরতা মানচিত্র তৈরি করেছে গভীরতা শেডারে ইতিমধ্যে স্বাভাবিক করা হয়েছিল।
float alpha = 0.3 + max(0.0, 1.0 - log(100.0 * (solidsDiff - 0.005) + 1.0));
তারপরে আপনি গভীরতার পার্থক্যের উপর নির্ভর করে আপনার ঝালটির আলফা চ্যানেলটি সংশোধন করতে পারেন। এখানে আমরা একটি সর্বনিম্ন আলফা থেকে শুরু করব 0.3
, তারপরে পার্থক্যের কাছাকাছি থাকায় আলফায় একটি দুর্দান্ত তীক্ষ্ণ বৃদ্ধি তৈরি করুন 0.0
।
- 0.005
অফসেট শুধু একটি সাদা মার্জিন "ছেদ" ঘন করতে যোগ করা হয়েছে। এটি পরিবর্তন করার চেষ্টা করুন!
gl_FragColor = vec4(vec3(1.0), alpha);
এবং অবশেষে, সেই আলফাটিকে আপনার খণ্ডের রঙে প্রয়োগ করুন।
উন্নতি
আপনি একটি বাঁকানো ieldাল তৈরি করতে পারেন, "এনার্জি শিল্ড" চেহারা (ডেমো) এর জন্য প্লাজমা যুক্ত করতে পারেন বা কেবল ছেদগুলি (ডেমো) দেখিয়ে প্রভাবগুলি অন্বেষণ করতে পারেন ।
আকাশ আপনার গ্রাফিক্স কার্ডের সীমা!