মডেলের চারপাশে অদ্ভুত সাদা রূপরেখা


19

আমি এক্সএনএ 4 এ একটি গেমের সাথে কাজ করছি এবং আমি সম্প্রতি এই গাইড অনুসরণ করে একটি স্থগিত ছায়া গোছানো বাস্তবায়নে স্যুইচ করেছি । একটি অদ্ভুত সাদা রূপরেখা এখন আমার মডেলগুলিতে প্রদর্শিত হচ্ছে এবং আমি নিশ্চিত না যে এর কারণ কী। আমি ভেবেছিলাম এটি স্বাভাবিক রেন্ডার টার্গেট বা গভীরতার রেন্ডার টার্গেটের যথাযথতার অভাব ছিল তবে 32 (রঙ) এর পরিবর্তে 64 বিট (আরজিবা 64) এ তাদের বাড়িয়ে দেয়নি। আমি এটিও ভেবেছিলাম যে অনুমানের গণনাতে এটি কিছু সমস্যা হতে পারে তাই আমি অনুমিত 0 তে সেট করার চেষ্টা করেছি তবে এটি কোনওরকমই কাজে লাগেনি। পিক্সেলটিকে পিআইএক্সে ডিবাগ করলে দেখায় যে বিস্তৃত মানটি সেই পিক্সেলের জন্য প্রায় সাদা হিসাবে গণনা করা হচ্ছে। কোন ধারনা? আমি নীচের সমস্যার একটি চিত্র অন্তর্ভুক্ত করেছি, এটি পূর্ণ আকারে দেখতে এটি আরও সহজ।

পিক্সেল Shader:

float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
    input.ScreenPosition.xy /= input.ScreenPosition.w;

    float2 texCoord = 0.5f * (float2(input.ScreenPosition.x, -input.ScreenPosition.y) + 1) - halfPixel;

    float4 normalData = tex2D(normalSampler, texCoord);

    //Transform normal back into [-1, 1] range
    float3 normal = normalize(2.0f * normalData.xyz - 1.0f);

    float specularPower = normalData.a;
    float specularHardness = tex2D(colorSampler, texCoord).a * 255;
    float depthVal = tex2D(depthSampler, texCoord).r;

    //Compute screen-space position
    float4 position = float4(input.ScreenPosition.xy, depthVal, 1.0f);

    //Transform to world space
    position = mul(position, InvertViewProjection);
    position /= position.w;

    //Surface-to-light vector
    float3 lightVector = lightPosition - position;

    float3 projectedTexCoords = position - lightPosition;
    projectedTexCoords = mul(projectedTexCoords, float3x3(
                            float3(-1, 0, 0),
                            float3(0, 1, 0),
                            float3(0, 0, 1)));

    float distanceToLight = length(lightVector) / lightRadius;
    float shadow = ShadowContribution(projectedTexCoords, distanceToLight);

    float attenuation = saturate(1.0f - distanceToLight);

    lightVector = normalize(lightVector);

    //Compute diffuse light
    float normalDotLight = max(0, dot(normal, lightVector));
    float3 diffuseLight = normalDotLight * Color.rgb;

    float3 reflectionVector = normalize(reflect(-lightVector, normal));
    float3 directionToCamera = normalize(cameraPosition - position);
    float specularLight = specularPower * pow(saturate(dot(reflectionVector, directionToCamera)), specularHardness);

    return shadow * attenuation * lightIntensity * float4(diffuseLight.rgb, specularLight);
}

সম্পাদনা : জেপিজি সম্পর্কে দুঃখিত, স্ট্যাকেক্সচেঞ্জের আপলোডার নিজেরাই এটি করেছে। রায় টি: এক্সএনএ 3 থেকে পরিবর্তিত অংশগুলির জন্য আমি টিউটোরিয়ালের আপনার এক্সএনএ 4 রূপান্তরটি আসলেই উল্লেখ করেছি। যেহেতু আমি কোডটিতে কোনও বড় পরিবর্তন করেছি না বলে আমি ভেবেছিলাম সম্ভবত এই বাগটি মূলতে বিদ্যমান ছিল তবে এতগুলি লাইটের চারদিকে ঘোরাঘুরি করা অসম্ভব, তাই আমি একটি আলো বাদ দিয়ে সমস্ত সরিয়ে ফেললাম এবং ত্রুটিটি আবার প্রদর্শিত হল (দেখুন) টিকটিকি কনুই কাছাকাছি)

আমার দৃশ্যের জন্য এখানে জিবিফার সামগ্রীগুলি:

রঙ বাফার: গভীরতা বাফার: সাধারণ বাফার: চূড়ান্ত রেন্ডার:

সম্পাদনা 2 :

আমি রঙিন মানচিত্রটি নমুনা করলে সমস্যাটি CombineFinal.fx সন্দেহ করতে শুরু করি। এটি একটি সাদা পিক্সেলের ঠিক সঠিক রঙিন পিক্সেলের জন্য গণনা:

diffuseColor        : (0.435, 0.447, 0.412)
diffuseLight        : (1.000, 1.000, 0.902)
light               : (1.000, 1.000, 0.902, 0.000)
PixelShaderFunction : (0.435, 0.447, 0.371, 1.000)
specularLight       : 0.000

এবং এটির ঠিক পাশেই একটি অনুচিত রঙিন সাদা পিক্সেল থেকে আউটপুট:

diffuseColor        : (0.824, 0.792, 0.741)
diffuseLight        : (1.000, 1.000, 0.902)
light               : (1.000, 1.000, 0.902, 0.000)
PixelShaderFunction : (0.824, 0.792, 0.669, 1.000)
specularLight       : 0.000

ডিফিউজ কালার কেবলমাত্র পার্থক্য এবং এই রঙটি সরাসরি রঙের মানচিত্র থেকে নেওয়া হয়। নমুনা থেকে টেক্সচারের স্থানাঙ্কের গণনায় সামান্য ত্রুটি আছে?

লাইটিং পাস:


4
দয়া করে কোনও জেপেইগ কোনও স্ক্রিনশটকে সূক্ষ্ম গ্রাফিকাল গণ্ডুলি সংকুচিত করবেন না। লোকেরা সমস্যাটি নিখুঁত প্রজননে দেখতে চাইবে।
এআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআ

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

2
এটি সাহায্য করে কিনা তা নিশ্চিত নন তবে আপনি কোড / টিউটোরিয়ালটির একটি খুব পুরানো সংস্করণ ব্যবহার করছেন, ক্যাটালিন জিমার আসল কোড / টিউটোরিয়ালটি এখন এখানে রয়েছে: ক্যাটালিনজিমা.com / টিউটোরিয়ালস / ডিফিডেড-রেন্ডারিং-ইন- এক্সনা এবং অনুমোদিত অনুমোদিত এক্সএনএ ৪.০ সংস্করণটি এখানে অবস্থিত: roy-t.nl/index.php/2010/12/28/…
রায় টি।

ডিবাগিং স্থগিত রেন্ডারিংয়ের সাথে সর্বদা হিসাবে, আপনি কি সমস্ত বাফার থেকে স্ক্রিনশট পোস্ট করতে পারেন? এটি সম্ভবত আলো বাফারে রয়েছে তবে এটি অন্যরকম কিছু হতে পারে।
রায় টি।

আমার প্রবৃত্তিটি হ'ল আলগোরিদমের অংশটি ঠিক 90 ডিগ্রি কোণটি পরিচালনা করার ক্ষেত্রে এটি একটি সমস্যা হবে, তবে আরও খতিয়ে দেখার জন্য আমাকে কাজের পরে ওডের সাথে খেলতে হবে।
জর্দান মাইলোনাস

উত্তর:


4

আমি যখন আমার নিজের বিলম্বিত রেন্ডারারটি শুরু করি তখন আমার মডেলগুলির আশেপাশে আমার এই সাদা রূপরেখা বা "হলো" ছিল। সমস্যাটি হ'ল রেন্ডার লক্ষ্যগুলি ওভারলেলের জন্য টেক্সচার অফসেট মানটি সঠিকভাবে সেটআপ করা হয়নি। কিছু টেক্সচার -0.5 পিক্সেলের পরিবর্তে অফসেটের জন্য +0.5 পিক্সেল সেট করা দরকার।

কিছু টেক্সচার অফসেটের মানগুলি টুইট করার পরেই এর রূপরেখাটি চলে গেছে। সম্ভবত এটি লাইটিং শেডারগুলির মধ্যে একটিতে।

সম্পাদনা করুন: কাতালিন জিমার টিউটোরিয়ালটিও আমি শিখেছি যা আপনার উদাহরণের একটি শাখা, সুতরাং এটি কাজ করা উচিত।


হ্যাঁ, এটা ছিল। আমি হালকা শেডারে স্থানাঙ্কের সমস্ত নমুনার জন্য এটি + হাফপিক্সেল হিসাবে পরিবর্তন করেছি এবং হলো এখন চলে গেছে।
টেলানোর

0

আমি নিশ্চিত যে ঠিক কী চলছে, তবে দু'বার যাচাই করার জন্য কয়েকটি জিনিস:

  1. জি-বাফারদের নমুনা দেওয়ার সময় আপনার টেক্সচার ফিল্টারিং বন্ধ হয়ে গেছে তা নিশ্চিত করুন - কোনও বিলিিনার বা অ্যানিসোট্রপিক বা অন্য কিছু নয়।

  2. আমি দেখছি আপনি জমিনের স্থানাঙ্কগুলিতে অর্ধ-পিক্সেল অফসেট যুক্ত করছেন; ডাবল চেক করুন যে ঠিক। ডান অফসেটটি কী হওয়া উচিত তা জানতে আমি এক্সএনএর সাথে যথেষ্ট পরিচিত নই তবে আপনি শেডার লিখে এটি পরীক্ষা করতে সক্ষম হবেন যে কোনও একটি জি-বাফারকে নমুনা দেয় এবং স্যাম্পলটিকে কেবল আউটপুট দেয়। তারপরে এবং এর মধ্যে পিছনে পিছনে ফ্লিপ করুন এবং সরাসরি অন-স্ক্রিনে জি-বাফারটি প্রদর্শন করুন। যদি আপনি সঠিক অফসেট পেয়ে থাকেন তবে আপনার কোনও পার্থক্য দেখতে হবে না, এমনকি একটি পিক্সেলও নয়।


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

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