জিজিএক্স জ্যামিতি শব্দটির সঠিক ফর্ম


9

আমি আমার রেট্রেসারে একটি মাইক্রোফেসেট বিআরডিএফ বাস্তবায়নের চেষ্টা করছি তবে আমি কিছু সমস্যা নিয়ে চলেছি। আমি যে অনেকগুলি কাগজপত্র এবং নিবন্ধ পড়েছি সেগুলি আংশিক জ্যামিতি শব্দটি সংজ্ঞা এবং অর্ধ ভেক্টরগুলির ফাংশন হিসাবে সংজ্ঞায়িত করে: জি 1 (ভি, এইচ)। যাইহোক, এটি বাস্তবায়ন করার সময় আমি নিম্নলিখিত ফলাফল পেয়েছি:

অর্ধেক ভেক্টর ব্যবহার করে জিজিএক্স জ্যামিতি শব্দ

(নীচের সারিটি রুক্ষতার সাথে ডাইলেট্রিক 1.0.০ - ০.০, শীর্ষ সারিটি রুক্ষতার সাথে ধাতব হয় 1.0 - 0.0)

প্রান্তের চারপাশে একটি অদ্ভুত হাইলাইট এবং এনএল == 0 এর কাছাকাছি একটি কাটা বন্ধ রয়েছে I আমি আমার রেন্ডারগুলি যাচাই করার জন্য !ক্যকে একটি রেফারেন্স হিসাবে ব্যবহার করছি তাই আমি তাদের শেডার উত্সটি যা তারা ব্যবহার করে তা যাচাই করেছিলাম এবং যা থেকে আমি তাদের জ্যামিতি শব্দটি বলতে পারি তা অর্ধেক ভেক্টর দ্বারা একেবারেই প্যারামিটারাইজড হয় না! সুতরাং আমি একই কোডটি ব্যবহার করে চেষ্টা করেছি তবে অর্ধেক ভেক্টরের পরিবর্তে ম্যাক্রো পৃষ্ঠকে স্বাভাবিক হিসাবে ব্যবহার করেছি এবং নিম্নলিখিত ফলাফল পেয়েছি:

GGX জ্যামিতি শব্দটি ম্যাক্রো পৃষ্ঠকে সাধারণ ব্যবহার করে

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

আমি নিম্নলিখিত কোডটি আমার জ্যামিতি শব্দ হিসাবে ব্যবহার করি:

float RayTracer::GeometryGGX(const Vector3& v, const Vector3& l, const Vector3& n, const Vector3& h, float a)
{
    return G1GGX(v, h, a) * G1GGX(l, h, a);
}

float RayTracer::G1GGX(const Vector3& v, const Vector3& h, float a)
{
    float NoV = Util::Clamp01(cml::dot(v, h));
    float a2 = a * a;

    return (2.0f * NoV) / std::max(NoV + sqrt(a2 + (1.0f - a2) * NoV * NoV), 1e-7f);
}

এবং রেফারেন্সের জন্য, এটি আমার সাধারণ বিতরণ ফাংশন:

float RayTracer::DistributionGGX(const Vector3& n, const Vector3& h, float alpha)
{
    float alpha2 = alpha * alpha;
    float NoH = Util::Clamp01(cml::dot(n, h));
    float denom = (NoH * NoH * (alpha2 - 1.0f)) + 1.0f;
    return alpha2 / std::max((float)PI * denom * denom, 1e-7f);
}

উত্তর:


5

টিএল; ডিআর: আপনার G1 সূত্রটি ভুল।


কেবল বিভ্রান্তি এড়াতে, আমি বিআরডিএফ, স্মিথ মাইক্রোফেসেট মডেল (ভি-ক্যাভিটির মডেলের বিপরীতে) এবং জিজিএক্স মাইক্রোফেসেট বিতরণ ধরে নিচ্ছি।

হিৎজ ২০১৪ অনুসারে , মাস্কিং / শেডিং শব্দG1 হয়

χ+(ωvωm)21+1+αo2tan2θv

এবং ওয়াল্টার ২০০ according অনুসারে , সূত্রটি হ'ল

χ+(ωvωgωvωm)21+1+α2tan2θv

কোথায় ωm মাইক্রোফেসেট স্বাভাবিক দিক (অর্ধেক ভেক্টর), ωg মূল (জ্যামিতিক) স্বাভাবিক দিক (সাধারণ), ωv আগত বা বহির্গামী দিক, α isotropic রুক্ষতা পরামিতি, এবং χ+(a) ইতিবাচক বৈশিষ্ট্যযুক্ত ফাংশন বা হেভিসাইড পদক্ষেপ ফাংশন (যদি এর সমান হয়) a>0 এবং অন্যথায় শূন্য)।

আপনি খেয়াল করতে পারেন, অর্ধেক ভেক্টর ωm এটি নিশ্চিত করার জন্যই ব্যবহৃত হয় G1জ্যামিতিক কনফিগারেশন নিষিদ্ধ হলে শূন্য হয়। আরও সুনির্দিষ্টভাবে, এটি নিশ্চিত করে যে মাইক্রোস্ফেসের পিছনের পৃষ্ঠটি কখনও কখনও থেকে প্রদর্শিত হয় নাωvম্যাক্রোসরফেসের সামনের দিকে এবং তদ্বিপরীত দিকের দিকের দিকটি (পরবর্তী ক্ষেত্রে কেবল তখনই অর্থবহ হয় যখন প্রতিসরণগুলি সমর্থিত হয়)। যদি কলিং কোডটি এর গ্যারান্টি দেয় তবে আপনি অবশ্যই এই প্যারামিটারটি বাদ দিতে পারেন। তারা সম্ভবত ityক্যে এই কারণ করেছিল।

অন্যদিকে, আপনার বাস্তবায়ন, কোস্টিনের গণনা করতে অর্ধেক ভেক্টর ব্যবহার করে ωv মাইক্রোফেসেটের প্রতি সম্মান সহ নির্দেশ, যা উপস্থাপিত সূত্রগুলি ছাড়া অন্য কোনও কিছুর গণনা বাড়ে।

যদি এটি কোনও সহায়তার হয় তবে এটি আমার বাস্তবায়ন G1 ফ্যাক্টর:

float SmithMaskingFunctionGgx(
    const Vec3f &aDir,  // the direction to compute masking for (either incoming or outgoing)
    const Vec3f &aMicrofacetNormal,
    const float  aRoughnessAlpha)
{
    PG3_ASSERT_VEC3F_NORMALIZED(aDir);
    PG3_ASSERT_VEC3F_NORMALIZED(aMicrofacetNormal);
    PG3_ASSERT_FLOAT_NONNEGATIVE(aRoughnessAlpha);

    if (aMicrofacetNormal.z <= 0)
        return 0.0f;

    const float cosThetaVM = Dot(aDir, aMicrofacetNormal);
    if ((aDir.z * cosThetaVM) < 0.0f)
        return 0.0f; // up direction is below microfacet or vice versa

    const float roughnessAlphaSqr = aRoughnessAlpha * aRoughnessAlpha;
    const float tanThetaSqr = Geom::TanThetaSqr(aDir);
    const float root = std::sqrt(1.0f + roughnessAlphaSqr * tanThetaSqr);

    const float result = 2.0f / (1.0f + root);

    PG3_ASSERT_FLOAT_IN_RANGE(result, 0.0f, 1.0f);

    return result;
}

ধন্যবাদ তোমার উত্তরের জন্য. আপনি যে সূত্রটি সরবরাহ করেছেন তা আমি প্রয়োগ করেছি এবং আমার নিজের মতোই অভিন্ন ফলাফল পেয়েছি (যখন ম্যাক্রোফেসটি স্বাভাবিক ব্যবহার করা হয়)। সুতরাং দেখে মনে হচ্ছে এটি কেবল অন্যরকম রূপ (আমি এটি পেয়েছি: গ্রাফিকসেন্টস.ব্লগস্পট.এনএল / ২০১৮ / স্পেকুলার- বিআরডিএফ-রেফারেন্স। Html ) আমি অর্ধ ভেক্টর সম্পর্কে বিভ্রান্ত ছিলাম কারণ সাইনগ্রাফ ২০১৫ পিবিএস গণিতের কোর্সটি বিশেষত জ্যামিতির বর্ণনা দিয়েছে দৃশ্য, হালকা এবং অর্ধ ভেক্টর উপর নির্ভর করে ফাংশন। তাহলে এই স্লাইডগুলিতে একটি ত্রুটি?
এরউইন

@ আরউইন, এখন আপনি সূত্রটি নিজেই সরবরাহ করেছেন, এটি আরও পরিষ্কার। পরবর্তী সময় ঠিক এটি শুরুতে করুন, এটি সাহায্য করে। হ্যাঁ, উভয় সংস্করণ (আমার এবং আপনার) সমতুল্য, তবে তাদের উভয়ই সাইন বা ট্যানজেন্ট ফাংশন কম্পিউটিংয়ের জন্য হাফওয়ে ভেক্টর ব্যবহার করে না। এটি ব্যবহার করেnv বরং hvআপনার বাস্তবায়নের ক্ষেত্রে যেমনটি করেছিলেন - এটি ভুল বলে মনে হচ্ছে। আমার সন্দেহ হয় আপনি নতুন বাস্তবায়নের ক্ষেত্রেও একই ভুলটি করেছিলেন।
আইভোকাবেল

আমি আমার নতুন বাস্তবায়নে এন ডট ভি ব্যবহার করেছি, যা আমার পোস্ট করা দ্বিতীয় চিত্রটির জন্য আমাকে অভিন্ন ফলাফল দিয়েছে। তবে পিবিএস কোর্সে স্লাইড কেন জানিয়েছে যে হাফওয়ে ভেক্টরটি ব্যবহার করা উচিত সে সম্পর্কে এখনও আমি পরিষ্কার নই (দেখুন: blog.selfshadow.com/publications/s2015-Sading-course/hoffman/… , স্লাইড 88)।
এরউইন

আমি কি এটি সঠিকভাবে বুঝতে পারি using hv পরিবর্তে nvসমস্যা ছিল? হাফওয়ে ভেক্টর ইন ব্যবহার সম্পর্কেG1: প্রকৃতপক্ষে এটি আমার পোস্ট করা দুটি সংস্করণেই ব্যবহৃত হয়েছে (ল্যাটেক্স সূত্রটি তৈরি করার সময় আমি একটি ভুল করেছি এবং প্রথমটি জিমোমেট্রিক লিখেছি, আমি খুব শীঘ্রই এটি ঠিক করব), তবে মূল বিষয়টি হ'ল ওয়েকটি নয় কোসাইন মান গণনা করতে ব্যবহৃত (অর্থাত্ এখানে নেই) hvব্যবহৃত হয়)।
আইভোকাবেল

হ্যাঁ, সমস্যা ছিল। তবে আমার মূল প্রশ্নটি ছিল: অর্ধেক ভেক্টরটি কীসের জন্য ব্যবহৃত হয়, কারণ এটি ফাংশন সংজ্ঞাতে উপস্থিত হয়। যতদূর আমি এখন বুঝতে পারি এটি কেবল এইচ ডট ভি ইতিবাচক কিনা তা যাচাই করতে ব্যবহৃত হয়। উত্তর লেখার জন্য সময় দেওয়ার জন্য আপনাকে ধন্যবাদ।
এরউইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.