एचएलएसएल शेडर वास्तव में रेंडर आउटपुट को कैसे प्रभावित करता है?


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);

ध्यान रखें कि मैं इस सामान में एक शाब्दिक शुरुआत की तरह हूँ । क्या कोई समझा सकता है कि यह क्या कर रहा है? मैं यह मान रहा हूं कि एचटीएसएल फ़ंक्शन हर वर्टेक्स के माध्यम से जाता है और फिर उन्हें फ़ंक्शन में मेरे पास जो कुछ भी होता है उसे बदल देता है, और आउटपुट वही है जो बदल गया था ... और इसी तरह पिक्सेल shader के लिए?

एक और भ्रम है, मुझे पता है कि एक पिक्सेल क्या है, और मैं समझता हूं कि एक शीर्ष क्या है ... लेकिन वास्तव में पिक्सेल shader क्या करता है?


यह ठीक है, कोई नहीं करता है
bobobobo

जवाबों:


10

यह कैसे पसंद करता है ...... बदलना जानते हैं .... स्क्रीन पर एचएलएसएल और वास्तविक पिक्सेल / वर्टेक्स के बीच पाइपलाइन पर वास्तव में भ्रमित हूं।

यह मोटे तौर पर इस तरह से काम करता है: जब आप ड्रॉ कॉल जारी करते हैं (ड्राडिप्रेसिटिव्स, ड्रॉइंडेक्सडिमिटिव्स इन डी 3 डी, ड्रा इन 10+, वगैरह), तो आपके द्वारा पाइप लाइन से बंधे गए ज्योमेट्री डेटा (आपके वर्टेक्स बफ़र्स) प्रोसेस हो जाते हैं। प्रत्येक शीर्ष के लिए, क्लिप स्पेस में आउटपुट वर्टेक्स बनाने के लिए वर्टेक्स शेडर निष्पादित किया जाता है।

फिर GPU उस क्लिप स्पेस वर्टेक्स पर कुछ निश्चित कार्य करता है जैसे कि क्लिपिंग / क्यूलिंग और वर्टेक्स को स्क्रीन स्पेस में लाना, जहां यह त्रिभुजों को जमाने लगता है। प्रत्येक त्रिभुज के रेखांकन के दौरान, GPU उस त्रिभुज की सतह के पार वर्टिकल विशेषताओं को प्रक्षेपित करता है, पिक्सेल प्रक्षेपक को प्रत्येक प्रक्षेपित विशेषता को खिलाता है ताकि उस पिक्सेल के लिए एक सेमी-फ़ाइनल रंग उत्पन्न किया जा सके (पिक्सेल शेडर निष्पादित होने के बाद ब्लेंडिंग लागू किया जाता है, इस प्रकार "सेमी- अंतिम")।

क्या यह वास्तव में उन्हें "लागू होता है":

आपके द्वारा पोस्ट किया गया कोड पहले शेड्स को संकलित करता है, फिर उन्हें पाइपलाइन से बांधता है जहां वे किसी भी बाद के ड्रा कॉल के लिए सक्रिय रहते हैं जब तक कि वे बदल नहीं जाते। यह वास्तव में उन्हें निष्पादित करने का कारण नहीं बनता है।

क्या कोई यह समझा सकता है कि यह क्या कर रहा है, मान लें कि वर्टेक्स एचएलएसएल फ़ंक्शन हर वर्टेक्स (इनपुट स्थिति: स्थिति और रंग: रंग) के माध्यम से जाता है और फिर फ़ंक्शन में मेरे पास जो कुछ भी है, उन्हें बदल देता है और आउटपुट वह बदल गया है। ... (वही Pixel Shader के लिए जाता है)।

एक और भ्रम, मुझे पता है कि एक पिक्सेल क्या है, और मैं समझता हूं कि एक शीर्ष क्या है ..... लेकिन वास्तव में पिक्सेल shader क्या करता है ......

वर्टेक्स शेडर मॉडल स्पेस से क्लिप स्पेस में वर्टिकल बदलने के लिए जिम्मेदार है।

पिक्सेल shader प्रक्षेपित शीर्ष गुण के आधार पर पिक्सेल के लिए penultimate रंग / गहराई कंप्यूटिंग के लिए जिम्मेदार है।


9

मैं यह समझाने की कोशिश करूंगा कि कैसे चीजें बहुत शब्दजाल का उपयोग किए बिना काम करती हैं।

यदि संवादात्मक गति के बजाय सादगी आपकी चिंता है, तो कंप्यूटर में एक 3 डी सतह अंतरिक्ष में बिंदुओं का एक विशाल बादल होगा, पर्याप्त घने ताकि हम प्रत्येक बिंदु को व्यक्तिगत रूप से प्रस्तुत कर सकें, उनके बीच अंतराल के बिना।

आप एक मॉडल को केवल एक बार मेमोरी में स्टोर करना चाहते हैं, लेकिन आपको इसे विभिन्न आकारों और विभिन्न कोणों से प्रदर्शित करने की आवश्यकता है, इसलिए जब आप एक 3 डी मॉडल को प्रस्तुत करते हैं, तो आपको सभी बिंदुओं को "बदलना" पड़ता है, जैसा कि आप उन्हें मेमोरी से पढ़ते हैं। उदाहरण के लिए, मॉडल को 50% बड़े रूप में प्रस्तुत करने के लिए, आपको अंकों के पदों को आधा करने की आवश्यकता है:

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

यह लगभग सबसे सरल "वर्टेक्स शेडर" है जो एक गर्भ धारण कर सकता है: स्मृति से एक शीर्ष स्थिति में जाता है, और बाहर एक नया शीर्ष स्थान आता है, आधा-बड़ा। आधे-बड़े-बड़े शीर्ष को स्मृति में वापस संग्रहीत नहीं किया जाता है - इसका उपयोग तुरंत रेंडरिंग के लिए किया जाता है और फिर फेंक दिया जाता है।

हालांकि एक सकल ओवरसिप्लाईफिकेशन जिसमें प्रमुख अवधारणाओं का अभाव है , यह आत्मा में उन पहलुओं का वर्णन करता है कि फिल्में ग्राफिक्स कैसे करती हैं।

इंटरएक्टिव ग्राफिक्स (खेल) इस सरल होने का जोखिम नहीं उठा सकते हैं, क्योंकि उन्हें ग्राफिक्स को एक फिल्म की तुलना में अधिक तीव्रता के कई ऑर्डर प्रदान करने की आवश्यकता होती है।

खेल में, हम स्क्रीन पर प्रत्येक पिक्सेल के लिए एक बिंदु प्रदान करने का जोखिम नहीं उठा सकते हैं, साथ ही अंतराल को कवर करने के लिए अतिरिक्त एक्स्ट्रा कलाकार। इसलिए, एक समझौता के रूप में, पास के प्रत्येक तीन बिंदुओं के बीच के अंतर को एक त्रिकोण के रूप में प्रस्तुत किया जाता है, जो विभिन्न तकनीकी कारणों से स्क्रीन पर कम से कम 10 पिक्सेल बड़ा होना पसंद करता है।

एक 3D त्रिभुज को 2 डी स्क्रीन पर पेश किया जा सकता है , फिर 1D लाइनों के ढेर में विभाजित किया जा सकता है, जिसे प्रत्येक को 0D पिक्सेल के ढेर में विभाजित किया जा सकता है। इस प्रकार हम एक 3 डी त्रिभुज को अलग-थलग करने में सरलता से 0 डी पिक्सल प्रदान करने की सरल समस्या में विभाजित कर सकते हैं। एक कंप्यूटर कम समय में सरल समस्याओं को हल कर सकता है।

एक पिक्सेल shader एक छोटा सा प्रोग्राम है जिसे हम प्रत्येक पिक्सेल पर चलाते हैं ताकि एक त्रिकोण को अलग करने से उत्पन्न हो।

out.color = in.color;

यह लगभग सबसे सरल "पिक्सेल शेडर" है जो एक गर्भ धारण कर सकता है: तीन त्रिभुज कोने के रंगों का मिश्रण जाता है, और बाहर एक ही रंग जाता है। इनपुट्स "वर्टेक्स शेडर" के आउटपुट से आते हैं और आउटपुट मेमोरी में स्क्रीन पर लिखे जाते हैं।

तो - "वर्टेक्स शेडर" एक प्रोग्राम है जो जीपीयू चिप के अंदर चलता है। इसका इनपुट GPU मेमोरी में एक "वर्टेक्स बफर" है, और इसका आउटपुट सीधे "पिक्सेल shader" में खिलाया जाता है। एक "पिक्सेल shader" भी एक प्रोग्राम है जो GPU चिप के अंदर चलता है। इसके इनपुट वर्टेक्स शेडर से तीन वर्टिकल का मिश्रण हैं, और इसका आउटपुट स्क्रीन पर एक पिक्सेल है।



-2

एक पिक्सेल shader के बारे में अभी चिंता मत करो। यदि आप पूर्ण शुरुआत कर रहे हैं, तो आपको केवल शीर्ष और खंड शेड के साथ GLSL / HLSL की हैलो वर्ल्ड होना चाहिए। एक बार जब आप परिचित हो जाते हैं और आप चर आंदोलन को समझने लगते हैं और इस तरह, तो अपने क्षितिज का विस्तार करते हैं।

मैं बेहद विनम्रता से एपीआई कैसे काम करता है, यह जानने के लिए एक टेक्स्ट बुक की सिफारिश करता हूं। ओपनजीएल पुस्तकें यह भी अच्छा काम करती हैं कि कैसे तय की गई पाइप लाइन से डायनामिक प्रोग्रामेबल पाइप लाइन में वर्षों से चीजें बदल गई हैं।

जाओ चैंपियन!


1
एक टुकड़ा shader पिक्सेल shader के समान कार्य को पूरा करता है।

1
मुझे नहीं लगता कि हम इस सवाल से कह सकते हैं कि क्या ओपी सभी गेम प्रोग्रामिंग में एक शुरुआत है - उसने केवल यह कहा कि वह shader कोड लिखने वाला एक शुरुआत है। Shaders लिखने के लिए सीखना एक गेम डेवलपर की शेड में है करने के लिए एक बहुत ही महत्वपूर्ण उपकरण है, मैं केवल अधिक उन्हें जब तक आप पर ही कर रहे हैं चमक नहीं होगा बहुत खेल विकास सीखने की शुरुआत चरणों।
ओलहोवस्की
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.