এইচএলএসএল শেডার কীভাবে আসলে রেন্ডার আউটপুটকে প্রভাবিত করে?


11

আমি এইচএলএসএল এর বাক্য গঠনটি বুঝতে পারি, উদাহরণস্বরূপ আসুন আমি এটি আমার এইচএলএসএল হিসাবে ভান করি:

struct VOut
{
    float4 position : SV_POSITION;
    float4 color : COLOR;
};

VOut VShader(float4 position : POSITION, float4 color : COLOR)
{
    VOut output;

    output.position = position;
    output.position.xy *= 0.7f;    // "shrink" the vertex on the x and y axes
    output.color = color;

    return output;
}


float4 PShader(float4 position : SV_POSITION, float4 color : COLOR) : SV_TARGET
{
    return color;
}

এবং আমি এটি এই মত সংকলন:

D3DX11CompileFromFile(L"shaders.hlsl", 0, 0, "VShader", "vs_5_0", 0, 0, 0, &VS, 0, 0);
D3DX11CompileFromFile(L"shaders.hlsl", 0, 0, "PShader", "ps_5_0", 0, 0, 0, &PS, 0, 0);

এটি কীভাবে পছন্দ করে ... পরিবর্তন করতে জানেন ... আমি এইচএলএসএল এবং পর্দার আসল পিক্সেল / উল্লম্বের মধ্যে পাইপলাইনটি ঠিক কী তা নিয়ে বিভ্রান্ত।

এগুলি কি আসলে তাদের "প্রয়োগ" করে?

dev->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), NULL, &pVS);
dev->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), NULL, &pPS);

// set the shader objects
devcon->VSSetShader(pVS, 0, 0);
devcon->PSSetShader(pPS, 0, 0);

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

আরেকটি বিভ্রান্তি, আমি জানি যে একটি পিক্সেল কী, এবং আমি বুঝতে পারি যে একটি ভার্টেক্স কী ... তবে পিক্সেল শেডারটি ঠিক কী করে?


ঠিক আছে, কেউই করেনা
bobobobo

উত্তর:


10

এটি কীভাবে পছন্দ করে ...... পরিবর্তন করতে জানেন .... আমি স্ক্রিনে এইচএলএসএল এবং প্রকৃত পিক্সেল / ভার্টেক্সের মধ্যে পাইপলাইনটিতে ঠিক বিভ্রান্ত হয়েছি।

এটি মোটামুটিভাবে এর মতোই কাজ করে: আপনি যখন ড্র কল কলটি প্রকাশ করেন (D3D তে DrawPrimitives, DrawIndexedPrimitives, 10+ এ আঁকুন, এবং cetera), আপনি পাইপলাইনে আবদ্ধ জ্যামিতি ডেটা (আপনার ভার্টেক্স বাফারগুলি) প্রক্রিয়াভুক্ত হয়। প্রতিটি শীর্ষবিন্দুর জন্য, ক্লিপ স্পেসে একটি আউটপুট ভার্টেক্স তৈরি করতে ভার্টেক্স শ্যাডার কার্যকর করা হয়।

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

এগুলি কি আসলে তাদের "প্রয়োগ" করে:

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

কেউ হয়তো এটি কী করছে তা ব্যাখ্যা করতে পারে, আমি অনুমান করছি যে ভার্টেক্স এইচএলএসএল ফাংশনটি প্রতিটি শীর্ষবিন্দুতে প্রবেশ করছে (ইনপুট অবস্থান হিসাবে: অবস্থান এবং রঙ: রঙ) এবং তারপরে ফাংশনে আমার যা কিছু আছে সেগুলিতে তাদের পরিবর্তন করে এবং আউটপুটটি যা পরিবর্তন হয়েছিল তা হ'ল। ... (পিক্সেল শেডারের ক্ষেত্রেও এটি একই রকম)।

আরেকটি বিভ্রান্তি, আমি জানি যে একটি পিক্সেল কী, এবং আমি বুঝতে পারি যে একটি ভার্টেক্স কী ..... তবে পিক্সেল শেডারটি ঠিক কী করে ......

ভার্টেক্স শ্যাডারটি মডেল স্পেস থেকে ক্লিপ স্পেসে উল্লম্ব রূপান্তরের জন্য দায়ী।

পিক্সেল শেডার আন্তঃবিবাহিত ভার্টেক্স গুণাবলীর উপর ভিত্তি করে একটি পিক্সেলের জন্য পেনসিলমেট রঙ / গভীরতার গণনা করার জন্য দায়ী।


9

আমি খুব জার্গন ব্যবহার না করে জিনিসগুলি কীভাবে কাজ করে তা বোঝানোর চেষ্টা করব।

ইন্টারেক্টিভ গতির চেয়ে সরলতা যদি আপনার উদ্বেগ হয় তবে কম্পিউটারে একটি 3 ডি পৃষ্ঠতল কেবলমাত্র জায়গার পয়েন্টগুলির বিশাল মেঘ হবে, এটি যথেষ্ট ঘন হবে যাতে আমরা তাদের মধ্যে ফাঁক ছাড়াই প্রতিটি পয়েন্ট পৃথকভাবে রেন্ডার করতে পারি।

আপনি কেবল একবার স্মৃতিতে একটি মডেল সঞ্চয় করতে চান, তবে আপনাকে এটি বিভিন্ন আকার এবং বিভিন্ন কোণ থেকে প্রদর্শন করা দরকার, তাই আপনি যখন কোনও 3D মডেল রেন্ডার করেন তখন আপনাকে স্মৃতি থেকে পড়ার সাথে সাথে সমস্ত পয়েন্টগুলি "রূপান্তর" করতে হবে। উদাহরণস্বরূপ, মডেলটিকে 50% বড় হিসাবে রেন্ডার করতে আপনাকে পয়েন্টের অবস্থানগুলি অর্ধেক করে স্কেল করতে হবে:

out.position = in.position * 0.5;
out.color = in.color;

এটি প্রায় সহজতম "ভার্টেক্স শ্যাডার" যিনি কল্পনা করতে পারেন: মেমরি থেকে একটি ভার্টেক্স অবস্থান যায় এবং আধা-হিসাবে-বড় একটি নতুন শীর্ষস্থান আসে। অর্ধ-হিসাবে-বৃহত প্রান্তটি মেমরিতে ফিরে সংরক্ষণ করা হয় না - এটি অবিলম্বে রেন্ডারিংয়ের জন্য ব্যবহৃত হয় এবং তারপরে ফেলে দেওয়া হয়।

একটি যদিও গ্রস অতিসরলীকরণ যে কী ধারণা অভাব আছে , এই আত্মা কিভাবে চলচ্চিত্র গ্রাফিক্স না দিক বর্ণনা করা হয়েছে।

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

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

একটি 3D ত্রিভুজ 2D স্ক্রিনে প্রজেক্ট করা যেতে পারে , তারপরে 1D লাইনগুলির একটি স্ট্যাকে বিভক্ত করা যায়, যা প্রতিটি 0 ডি পিক্সেলের স্ট্যাকে বিভক্ত হতে পারে। আমরা এভাবে একটি 3 ডি ত্রিভুজ রেন্ডারিংয়ের সমস্যাটিকে বিচ্ছিন্নভাবে 0 ডি পিক্সেল প্রচুর রেন্ডারিংয়ের সরল সমস্যায় বিভক্ত করতে পারি। একটি কম্পিউটার কম সময়ে সহজ সমস্যাগুলি সমাধান করতে পারে।

একটি পিক্সেল শেডার হ'ল একটি ছোট প্রোগ্রাম যা আমরা প্রতিটি পিক্সেলটিতে চালিত করি তাই ত্রিভুজকে বিযুক্ত করার ফলে উত্পন্ন।

out.color = in.color;

এটি প্রায় সহজেই "পিক্সেল শেডার" যেটি ধারণা করা যায়: তিনটি ত্রিভুজের শীর্ষাংশের রঙের মিশ্রণ হয় এবং একই রঙের বাইরে চলে যায়। ইনপুটগুলি "ভার্টেক্স শ্যাডার" এর আউটপুট থেকে আসে এবং আউটপুটগুলি মেমরিতে স্ক্রিনে লেখা হয়।

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



-2

এখনই পিক্সেল শেডার সম্পর্কে চিন্তা করবেন না। যদি আপনি সম্পূর্ণ শিক্ষানবিস হন তবে আপনার কেবল ভার্টেক্স এবং টুকরা শেডারের সাথে GLSL / HLSL এর হ্যালো ওয়ার্ল্ড হওয়া উচিত। আপনি যখন পরিচিত হয়ে যান এবং আপনি পরিবর্তনশীল চলাচল এবং এরকম বুঝতে শুরু করেন, তারপরে আপনার দিগন্তগুলি প্রসারিত করুন।

আমি কীভাবে এপিআই কাজ করে তা নিয়ে কট্টর কৌতুক পেতে একটি পাঠ্য বইয়ের সুপারিশ করছি। ওপেনজিএল বইগুলিও বছরের পর বছরগুলিতে স্থির পাইপলাইন থেকে গতিশীল প্রোগ্রামেবল পাইপলাইনে কীভাবে জিনিসগুলি পরিবর্তিত হয়েছে তা চিত্রিত করে একটি ভাল কাজ করে ।

চ্যাম্পিয়ন!


1
একটি খণ্ড শেডার পিক্সেল শেডার হিসাবে একই ফাংশন পূরণ করে।

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