वेबजीएल में एक विशेषता, एक समान और एक भिन्न चर के बीच अंतर क्या हैं?


83

क्या एक सादृश्य है कि मैं इन विभिन्न प्रकारों की तुलना करते समय सोच सकता हूं, या ये चीजें कैसे काम करती हैं?

इसके अलावा, मैट्रिक्स को एकरूप करने का क्या मतलब है?

जवाबों:


90

सीधे http://www.lighthouse3d.com/tutorials/glsl-tutorial/data-types-and-variables/ से कॉपी किया गया । वास्तविक साइट में बहुत अधिक विस्तृत जानकारी है और बाहर की जाँच करना सार्थक होगा।

परिवर्तनीय क्वालिफायर

क्वालिफायर वेरिएबल को एक विशेष अर्थ देते हैं। निम्नलिखित क्वालीफायर उपलब्ध हैं:

  • const - घोषणा एक संकलन समय स्थिर है।
  • विशेषता - वैश्विक चर जो प्रति शीर्ष में बदल सकते हैं, जो ओपनजीएल एप्लिकेशन से शीर्ष क्रम में पारित किए जाते हैं। इस क्वालीफायर का उपयोग केवल शीर्ष शेड में किया जा सकता है। Shader के लिए यह केवल पढ़ने योग्य चर है। विशेषता अनुभाग देखें।
  • वर्दी - वैश्विक चर जो कि आदिम [...] के अनुसार बदल सकते हैं, जो ओपनग्ल एप्लिकेशन से शादियों तक पारित किए जाते हैं। इस क्वालीफायर का उपयोग वर्टेक्स और फ्रेग्मेंट दोनों में किया जा सकता है। शेड्स के लिए यह केवल पढ़ने योग्य चर है। यूनिफ़ॉर्म अनुभाग देखें।
  • अलग-अलग - एक वर्टीकल शेडर और एक फ्रैगर शैडर के बीच प्रक्षेपित डेटा के लिए उपयोग किया जाता है। शीर्ष छाया में लिखने के लिए उपलब्ध है, और केवल एक टुकड़ा छाया में पढ़ा जाता है। वैरिंग सेक्शन देखें।

एक सादृश्य के लिए, कास्ट और यूनिफॉर्म C / C ++ में वैश्विक चर की तरह हैं, एक स्थिर है और दूसरा सेट किया जा सकता है। गुण एक चर है जो एक शीर्ष के साथ आता है, जैसे रंग या बनावट निर्देशांक। वैरिएबल वैरिएबल को वर्टिकल शेडर के द्वारा बदला जा सकता है, लेकिन फ्रैग्मेंट शैडर द्वारा नहीं, इसलिए संक्षेप में वे पाइप लाइन के नीचे जानकारी दे रहे हैं।


1
विशेषताओं पर बस थोड़ा विस्तार करने के लिए: एक विशेषता के लिए एक सरणी विशेषता की आवश्यकता नहीं है (यदि एक सरणी विशेषता की आवश्यकता है, तो मूल्य प्रत्येक शीर्ष के लिए अलग हो सकता है)। यह एक स्थिर वर्टीकल विशेषता भी हो सकती है, जिस स्थिति में मूल्य सभी कोने के बीच साझा किया जाता है। वास्तव में, सरणी विशेषता को gl.enableVertexAttribArray द्वारा सक्रिय रूप से सक्षम करने की आवश्यकता है।
रॉबर्ट मोन्फेरा

यहाँ पाठ अच्छा है क्योंकि वेबसाइट मर चुकी है
ziyuang

बस "उस आदमी" होने के लिए, लेकिन मुझे उस साइट पर कुछ भी नहीं दिखाई देता है जो सुझाव देता है कि यहां इसे कॉपी करना कानूनी था।
gman

66
  • uniformकर रहे हैं प्रति-आदिम (एक पूरे ड्रा कॉल के दौरान निरंतर) पैरामीटर;
  • attributeकर रहे हैं प्रति-शिखर मानकों (आमतौर पर: पदों, Normals, रंग, यूवी, ...);
  • varyingकर रहे हैं प्रति-टुकड़ा (या प्रति पिक्सेल वे:) पैरामीटर भिन्न हो पिक्सल से पिक्सल है।

यह समझना महत्वपूर्ण है कि varyingअपने स्वयं के शेड्स को कैसे काम करता है।
मान लें कि आप vप्रत्येक शीर्ष के लिए एक अलग पैरामीटर परिभाषित करते हैं त्रिकोण के शीर्ष के अंदर शेटर । जब इस भिन्न पैरामीटर को टुकड़े टुकड़े करने वाले के पास भेजा जाता है , तो इसका मान स्वचालित रूप से प्रक्षेपित करने के लिए पिक्सेल की स्थिति के आधार पर प्रक्षेपित होता है।

निम्नलिखित छवि में, लाल पिक्सेल को अलग-अलग पैरामीटर का एक प्रक्षेपित मूल्य प्राप्त हुआ v। इसलिए हम उन्हें "बदलती" कहते हैं।

अलग-अलग पैरामीटर को बिलिनियरली इंटरपोल किया जा रहा है

सरलता के लिए ऊपर दिया गया उदाहरण बिलिनियर प्रक्षेप का उपयोग करता है , जो मानता है कि खींचे गए सभी पिक्सेल कैमरे से समान दूरी पर हैं। सटीक 3 डी प्रतिपादन के लिए, ग्राफिक डिवाइस परिप्रेक्ष्य-सही प्रक्षेप का उपयोग करते हैं जो पिक्सेल की गहराई को ध्यान में रखते हैं।


2
उत्तर की भावना सही है, लेकिन याद रखें कि अलग-अलग करने के लिए , डिफ़ॉल्ट रूप से किए गए प्रक्षेप को परिप्रेक्ष्य-सही प्रक्षेप कहा जाता है, न कि केवल बिलिनियर इंटरपोलेशन। बेशक, यह सरल बिलिनियर प्रक्षेप प्राप्त करने के लिए प्रक्षेप योग्यता के साथ बदला जा सकता noperspectiveहै और परिप्रेक्ष्य-सही प्रक्षेप नहीं (डिफ़ॉल्ट क्वालिफायर द्वारा पहचाना गया smooth):। इस उदाहरण को देखें ।
लीजेंड्स 2k

धन्यवाद, मैं इस बारे में एक नोट जोड़ने जा रहा हूँ।
नेह

11

वेबजीएल में एक विशेषता, एक समान और एक भिन्न चर के बीच अंतर क्या हैं?

ओपनजीएल में, एक "प्रोग्राम" "शेड्स" (छोटे प्रोग्राम्स) का एक संग्रह है, जो एक पाइपलाइन में एक दूसरे से जुड़े होते हैं।

// "program" contains a shader pipeline:
//   vertex shader -> other shaders -> fragment shader
//
const program = initShaders(gl, "vertex-shader", "fragment-shader");
gl.useProgram(program);

3 डी मॉडल को व्यवस्थित करने के लिए शेड की प्रक्रियाएं वर्टिकल (वर्टेक्स शेडर), जियोमेट्रीज (ज्यामिति शेडर), टेसेलेशन (टेसेलेशन शेडर), टुकड़े (पिक्सेल शेडर) और अन्य बैच प्रोसेस टास्क (कंप्यूट शेडर) आवश्यक हैं।

OpenGL (WebGL) शेड्स GLSL (एक पाठ-आधारित shader भाषा GPU पर संकलित) में लिखे गए हैं।

// Note: As of 2017, WebGL only supports Vertex and Fragment shaders

<!-- Vertex Shader -->
<script id="shader-vs" type="x-shader/x-vertex">

  // <-- Receive from WebGL application
  uniform vec3 vertexVariableA;

  // attribute is supported in Vertex Shader only
  attribute vec3 vertexVariableB;

  // --> Pass to Fragment Shader
  varying vec3 variableC;

</script>

<!-- Fragment Shader -->
<script id="shader-fs" type="x-shader/x-fragment">

  // <-- Receive from WebGL application
  uniform vec3 fragmentVariableA;

  // <-- Receive from Vertex Shader
  varying vec3 variableC;

</script>

इन अवधारणाओं को ध्यान में रखते हुए:

शेडर्स पाइप लाइन ( out, inout) में अगले shader को डेटा पास कर सकते हैं , और वे WebGL एप्लिकेशन या पिछले shader ( in) से डेटा भी स्वीकार कर सकते हैं ।

  • uniformवेबटेग एप्लिकेशन से डेटा प्राप्त करने के लिए वर्टेक्स और फ्रैगमेंट शेड्स (वास्तव में कोई भी शेडर) एक चर का उपयोग कर सकते हैं ।

    // Pass data from WebGL application to shader
    const uniformHandle = gl.glGetUniformLocation(program, "vertexVariableA");
    gl.glUniformMatrix4fv(uniformHandle, 1, false, [0.1, 0.2, 0.3], 0);
    
  • वर्टेक्स शेडर attributeवैरिएबल एप्लिकेशन से वैरिएबल का डेटा भी प्राप्त कर सकता है, जिसे आवश्यकतानुसार सक्षम या अक्षम किया जा सकता है।

    // Pass data from WebGL application to Vertex Shader
    const attributeHandle = gl.glGetAttribLocation(mProgram, "vertexVariableB");
    gl.glEnableVertexAttribArray(attributeHandle);
    gl.glVertexAttribPointer(attributeHandle, 3, gl.FLOAT, false, 0, 0);
    
  • वर्टेक्स शेडर varyingवैरिएबल का उपयोग करके डेटा को फ्रैगमेंट शैडर को पास कर सकता है । ऊपर GLSL कोड ( varying vec3 variableC;) देखें ।


1

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

मुझे https://learnopengl.com/Getting-started/Shaders से विवरण पसंद है , क्योंकि प्रति-आदिम शब्द सहज नहीं है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.