+```
+
+यदि आप नहीं चाहते कि उदाहरण को बिल्ड परीक्षणों के भाग के रूप में चलाया जाए (उदाहरण के लिए, यदि उदाहरण के लिए उपयोगकर्ता इंटरैक्शन की आवश्यकता है, या हेडलेस-क्रोम परीक्षण ढांचे द्वारा समर्थित कार्यक्षमता का उपयोग नहीं करता है), तो वर्ग `"नोटेस्ट"` को शामिल करें `
` :
+
+```
+@example
+
+function setup() {
+ let c = createCanvas(100, 100);
+ saveCanvas(c, 'myCanvas', 'jpg');
+}
+
+```
+यदि आपको बाहरी संपत्ति फ़ाइलों से लिंक करने की आवश्यकता है, तो उन्हें [/docs/yuidoc-p5-theme/assets](https://github.com/processing/p5.js/tree/main/docs/yuidoc-p5-theme/assets) में डालें और फिर उन्हें कोड में "assets/filename.ext" के साथ लिंक करें। [टिंट उदाहरण](http://p5js.org/reference/#/p5/tint) देखें।
+
+
+### वर्णन () का उपयोग करके एक कैनवास विवरण जोड़ें
+अंत में, आपके द्वारा जोड़े गए प्रत्येक उदाहरण के लिए, आपको कैनवास के लिए स्क्रीन-रीडर सुलभ विवरण बनाने के लिए उदाहरण में p5.js फ़ंक्शन `describe()` का उपयोग करना आवश्यक है। केवल एक पैरामीटर शामिल करें: कैनवास पर क्या हो रहा है इसका संक्षिप्त विवरण वाली एक स्ट्रिंग। दूसरा पैरामीटर न जोड़ें.
+```
+@example
+
+
+let xoff = 0.0;
+function draw() {
+ background(204);
+ xoff = xoff + 0.01;
+ let n = noise(xoff) * width;
+ line(n, 0, n, height);
+ decribe('A vertical line moves randomly from left to right.');
+}
+
+
+
+
+let noiseScale = 0.02;
+function draw() {
+ background(0);
+ for (let x = 0; x < width; x += 1) {
+ let noiseVal = noise((mouseX + x) * noiseScale, mouseY * noiseScale);
+ stroke(noiseVal*255);
+ line(x, mouseY + noiseVal * 80, x, height);
+ }
+ describe('A horizontal wave pattern moves in the opposite direction of the mouse.');
+}
+
+
+```
+`वर्णन()` पर अधिक जानकारी के लिए [वेब एक्सेसिबिलिटी योगदानकर्ता दस्तावेज़](https://p5js.org/contributor-docs/#/web_accessibility?id=user-generated-accessible-canvas-descriptions) पर जाएं।
+
+पिछले दस्तावेज़ दिशानिर्देशों में स्क्रीन-रीडर सुलभ कैनवास विवरण बनाने के लिए [alt-text](https://moz.com/learn/seo/alt-text) जोड़ने की आवश्यकता थी। अब इसकी अनुशंसा नहीं की जाती. हमेशा `वर्णन()` का प्रयोग करें। पहले, किसी दिए गए फ़ंक्शन के लिए सभी उदाहरणों के अंत में `@alt` टैग के साथ ऑल्ट-टेक्स्ट जोड़ा गया था (प्रत्येक के तहत एक व्यक्तिगत `@alt` टैग नहीं), और विवरण को अलग करने के लिए एक लाइन ब्रेक जोड़ा गया था एकाधिक उदाहरण.
+
+```
+@example
+
+
+let xoff = 0.0;
+function draw() {
+ background(204);
+ xoff = xoff + 0.01;
+ let n = noise(xoff) * width;
+ line(n, 0, n, height);
+}
+
+
+
+
+let noiseScale = 0.02;
+function draw() {
+ background(0);
+ for (let x = 0; x < width; x += 1) {
+ let noiseVal = noise((mouseX + x) * noiseScale, mouseY * noiseScale);
+ stroke(noiseVal * 255);
+ line(x, mouseY + noiseVal * 80, x, height);
+ }
+}
+
+
+@alt
+vertical line moves left to right with updating noise values.
+horizontal wave pattern effected by mouse x-position & updating noise values.
+```
+
+## तरीकों के लिए टेम्पलेट
+यहां एक अच्छी तरह से प्रलेखित विधि का एक उदाहरण दिया गया है। एक नई विधि बनाने के लिए, आप [इस टेम्पलेट](https://github.com/processing/p5.js/tree/main/contributor_docs/method.example.js) का उपयोग कर सकते हैं। टेक्स्ट को अपनी विधि के वेरिएबल से बदलें और शेष को हटा दें।
+
+
+
+
+## दस्तावेज़ तैयार करना
+
+* सभी आवश्यक स्थानीय फ़ाइलों के साथ-साथ स्रोत कोड से संदर्भ की एक प्रति उत्पन्न करने के लिए पहले एक बार `npm run docs` चलाएँ। जब भी आप yuidoc संदर्भ पृष्ठ के पीछे कोर JS फ़ाइलों में परिवर्तन करें तो इसे फिर से चलाएँ। ये yuidoc-p5-थीम फ़ोल्डर में स्थित फ़ाइलों में परिवर्तन हैं, src में इनलाइन दस्तावेज़ परिवर्तन नहीं हैं।
+
+* यदि आपने केवल स्रोत कोड में परिवर्तन किया है, तो आप केवल `npm run grunt yui` चला सकते हैं, हालाँकि `npm run grunt yui:build` भी काम करेगा।
+
+* आप साइट का लाइव पूर्वावलोकन लॉन्च करने के लिए `npm run docs:dev` चला सकते हैं जो आपके द्वारा हर बार बदलाव करने पर अपडेट हो जाएगा। (परिवर्तन करने के बाद उन्हें प्रदर्शित करने के लिए आपको पृष्ठ को ताज़ा करना होगा।)
+
+बिल्ड संदर्भ दस्तावेज़/संदर्भ में पाया जा सकता है। इसे स्थानीय रूप से पूर्वावलोकन करने के लिए, `npm run grunt yui:dev` चलाएँ और इसे http://localhost:9001/docs/reference/ के रूप में देखें।
+
+
+
+## स्पेनिश भाषा संस्करण
+
+[स्पेनिश संस्करण](http://p5js.org/es/reference) थोड़ा अलग तरीके से बनाया गया है। इस सामग्री को अद्यतन करने के लिए यहां [निर्देश](https://github.com/processing/p5.js-website/blob/main/contributor_docs/i18n_contribution.md) हैं।
\ No newline at end of file
diff --git a/contributor_docs/hi/release_process.md b/contributor_docs/hi/release_process.md
new file mode 100644
index 0000000000..b5e4aedc91
--- /dev/null
+++ b/contributor_docs/hi/release_process.md
@@ -0,0 +1,67 @@
+# रिलीज़ प्रक्रिया
+
+## दृष्टिकोण
+* हम [सेमवर](https://semver.org/) वर्जनिंग पैटर्न का पालन करते हैं, जिसका अर्थ है कि हम इस वर्जनिंग पैटर्न का पालन करते हैं: `MAJOR:MINOR:PATCH`।
+
+## आवश्यकताएं
+* Git, node.js और NPM आपके सिस्टम पर स्थापित हैं
+* आप लाइब्रेरी बनाने में सक्षम हैं और रिमोट रिपॉजिटरी तक पुश एक्सेस प्राप्त कर सकते हैं
+* गुप्त `NPM_TOKEN` मान दूरस्थ रिपॉजिटरी पर सेट है
+* गुप्त `ACCESS_TOKEN` मान दूरस्थ रिपॉजिटरी पर सेट किया गया है
+
+## सुरक्षा टोकन
+रिलीज़ चरणों को पूरी तरह से चलाने के लिए, दो [रिपोजिटरी रहस्य](https://docs.github.com/en/actions/security-guides/encrypted-secrets#creating-encrypted-secrets-for-a-repository) होने चाहिए नीचे के रूप में सेट करें.
+
+* पढ़ने और प्रकाशित करने के लिए टोकन बनाने के लिए [यहां](https://docs.npmjs.com/creating-and-viewing-access-tokens) चरणों का पालन करके `NPM_TOKEN` बनाया जा सकता है। टोकन जिस उपयोगकर्ता का है, उसके पास एनपीएम पर प्रोजेक्ट तक प्रकाशन की पहुंच होनी चाहिए।
+
+* `ACCESS_TOKEN` उस उपयोगकर्ता के लिए एक व्यक्तिगत एक्सेस टोकन है जिसके पास `p5.js`, `p5.js-website`, और `p5.js-release` रिपॉजिटरी तक पहुंच है। टोकन [यहां](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token) चरणों का उपयोग करके उत्पन्न किया जा सकता है। स्कोप, केवल `रेपो` और `वर्कफ़्लो` चुनें। इसके लिए एक संगठन विशिष्ट खाते का उपयोग करने की अनुशंसा की जाती है (अर्थात व्यक्तिगत खाते से नहीं) और खाते की लेखन पहुंच को केवल आवश्यक रिपॉजिटरी तक सीमित करें।
+
+## Usage
+```sh
+$ git checkout main
+$ npm version [major|minor|patch] # Choose the appropriate version tag
+$ git push origin main
+$ git push origin v1.4.2 # Replace the version number with the one just created above
+```
+वास्तविक रिलीज़ चरण GitHub Actions CI पर चलते हैं।
+
+## Monitor and check results
+एक बार उपरोक्त कमांड निष्पादित हो जाने के बाद, बिल्ड और रिलीज़ कार्रवाई की निगरानी p5.js GitHub रेपो पेज पर ["एक्शन" टैब](https://github.com/processing/p5.js/actions) से की जा सकती है। ऐसी Job की तलाश करें जिस पर लिखा हो "नया p5.js रिलीज़", Job पर क्लिक करने से जो चल रहा है उसका अधिक विस्तृत जॉब लॉग मिल सकता है।
+
+
+
+एक बार काम पूरा हो जाने के बाद, लाइब्रेरी को GitHub और NPM पर जारी कर दिया जाएगा। यह देखने के लिए कि नवीनतम संस्करण जारी किया गया है, [रिलीज़](https://github.com/processing/p5.js/releases) और [NPM](https://www.npmjs.com/package/p5) पेज देखें . आपको GitHub पर ड्राफ्ट रिलीज़ देखना चाहिए, यदि आवश्यक हो तो चेंजलॉग में बदलाव करें, फिर रिलीज़ प्रकाशित करें।
+
+जैसे ही वेबसाइट का अपना निर्माण और परिनियोजन कार्य पूरा हो जाएगा, उसे अपडेट कर दिया जाएगा, इसकी निगरानी प्रासंगिक ["कार्रवाई" पृष्ठ](https://github.com/processing/p5.js-website/actions) पर भी की जा सकती है। यदि वांछित है, और उसके बाद नवीनतम संस्करण संख्या के लिए वेबसाइट पर ["डाउनलोड" पृष्ठ](https://p5js.org/download/) देखें।
+
+सीडीएन को अपडेट होने में थोड़ा अधिक समय (एक या दो दिन) लगेगा लेकिन रिलीज होने पर वे स्वचालित रूप से एनपीएम से हट जाएंगे इसलिए किसी विशेष कार्रवाई की आवश्यकता नहीं है।
+
+
+## असल में क्या हो रहा है
+GitHub एक्शन ["नया p5.js रिलीज़"](../.github/workflows/release.yml) एक टैग पर ट्रिगर होता है जो पैटर्न `v*.*.*` से मेल खाता है जो `npm version ___` आदेश से बनाया जाता ह .
+
+
+एक बार ट्रिगर होने पर, यह निम्नलिखित चरण चलाएगा:
+1. रिपॉजिटरी को क्लोन करें, नोड.जेएस सेटअप करें, संस्करण संख्या निकालें, `एनपीएम` के साथ निर्भरताएं स्थापित करें, और `एनपीएम टेस्ट` के साथ परीक्षण चलाएं।
+2. रिलीज़ फ़ाइलें बनाएं जिन्हें GitHub रिलीज़ पर अपलोड किया जाएगा।
+3. GitHub पर एक रिलीज़ बनाएं और NPM पर नवीनतम संस्करण प्रकाशित करें।
+4. वेबसाइट फ़ाइलें अद्यतन करें
+1. वेबसाइट रिपॉजिटरी को क्लोन करें
+2. `data.json` और `data.min.json` को सही स्थान पर कॉपी करें
+3. `p5.min.js` और `p5.sound.min.js` को सही स्थान पर कॉपी करें
+4. `data.yml` फ़ाइल को नवीनतम संस्करण संख्या के साथ अद्यतन करें
+5. `en.json` फ़ाइल को `data.min.json` के आधार पर अपडेट करें
+6. परिवर्तनों को प्रतिबद्ध करें और वेबसाइट रिपॉजिटरी में वापस भेजें
+5. बोवर फ़ाइलें अद्यतन करें
+1. बोवर रिलीज़ रिपॉजिटरी का क्लोन बनाएं
+2. सभी लाइब्रेरी फ़ाइलों को सही स्थान पर कॉपी करें
+3. परिवर्तनों को प्रतिबद्ध करें और वेबसाइट रिपॉजिटरी में वापस भेजें
+
+सिद्धांत रूप में, हम एक ही स्थान पर चलने के लिए यथासंभव अधिक से अधिक चरणों पर ध्यान केंद्रित करने का प्रयास करते हैं, अर्थात। सीआई वातावरण में. यदि एक नया चरण जो केवल रिलीज़ पर चलाया जाता है, आवश्यक है, तो इसे संभवतः सीआई वर्कफ़्लो में परिभाषित किया जाना चाहिए, न कि बिल्ड कॉन्फ़िगरेशन के भाग के रूप में।
+
+## परिक्षण
+चूंकि रिलीज़ चरण सीआई में चलाए जाते हैं, इसलिए उनका परीक्षण करना कठिन हो सकता है। स्थानीय स्तर पर चरणों को चलाने का परीक्षण करने के लिए [एक्ट](https://github.com/nektos/act) का उपयोग करना संभव है (और विकसित होने के दौरान उनका परीक्षण कैसे किया गया था) लेकिन वर्कफ़्लो परिभाषा में कुछ अस्थायी संशोधन की आवश्यकता है, हम करेंगे यहां मोटे तौर पर दस्तावेजीकरण करें क्योंकि समय के साथ सटीक चरण बदल जाएंगे।
+
+परीक्षण चरण नहीं चलेंगे क्योंकि मोचा क्रोम परीक्षण चलाने के लिए सभी सिस्टम आवश्यकताएँ मौजूद नहीं हैं। शेष परिवेश को स्थापित करने से पहले कुछ सिस्टम निर्भरताओं को `apt` के साथ स्थापित करने की आवश्यकता होगी। त्रुटि संदेशों पर नज़र रखें जिससे यह जानकारी मिलनी चाहिए कि कौन से पैकेज गायब हैं।
+
+गलती से अनपेक्षित परिवर्तनों को आगे बढ़ाने से बचने के लिए दूरस्थ रिपॉजिटरी में परिवर्तनों को आगे बढ़ाने से संबंधित कदमों पर टिप्पणी की जानी चाहिए।
\ No newline at end of file
diff --git a/contributor_docs/hi/repo_structure.md b/contributor_docs/hi/repo_structure.md
new file mode 100644
index 0000000000..d11ea4e79e
--- /dev/null
+++ b/contributor_docs/hi/repo_structure.md
@@ -0,0 +1,36 @@
+# हमारा कोड कहा रहता है
+
+
+व्यापक p5.js प्रोजेक्ट में इसके अलावा कुछ रिपॉजिटरी शामिल हैं:
+
+- **[p5.js](https://github.com/processing/p5.js)**: इस रिपॉजिटरी में p5.js लाइब्रेरी के लिए सोर्स कोड है। [उपयोगकर्ता-सामना करने वाला p5.js संदर्भ मैनुअल](https://p5js.org/reference/) भी इस स्रोत कोड में शामिल [JSDoc](https://jsdoc.app/) टिप्पणियों से उत्पन्न होता है। इसका रखरखाव [Qianqian Ye](https://github.com/qianqianye) और [स्टीवर्ड्स](https://github.com/processing/p5.js#stewards) के एक समूह द्वारा किया जाता है।
+
+- **[p5.js-website](https://github.com/processing/p5.js-website)**: इस रिपॉजिटरी में [p5.js website](http://p5js.org), संदर्भ मैनुअल के अपवाद के साथ। इसका रखरखाव [Qianqian Ye](https://github.com/qianqianye), [केनेथ लिम](https://github.com/limzykenneth), और [स्टीवर्ड्स]([https://github](https://github.com/processing/p5.js-website#stewards)) के एक समूह द्वारा किया जाता है।
+
+
+- **[p5.js-sound](https://github.com/processing/p5.js-sound)**: इस रिपॉजिटरी में p5.sound.js लाइब्रेरी शामिल है। इसका रखरखाव [जेसन सिगल](https://github.com/wherewasaguy) द्वारा किया जाता है।
+
+- **[p5.js-web-editor](https://github.com/processing/p5.js-web-editor)**: इस रिपॉजिटरी में [p5.js वेब एडिटर]( https://editor.p5js.org). इसका रखरखाव [कैसी ताराकाजियन](https://github.com/catarak) द्वारा किया जाता है।
+
+- ऊपर सूचीबद्ध नहीं की गई अन्य ऐड-ऑन लाइब्रेरीज़ में आमतौर पर अपने स्वयं के भंडार और अनुरक्षक होते हैं और सीधे p5.js प्रोजेक्ट द्वारा बनाए नहीं रखे जाते हैं।
+
+
+## रिपॉजिटरी फ़ाइल संरचना
+
+यहाँ बहुत सारी फ़ाइलें हैं! यहां एक संक्षिप्त अवलोकन दिया गया है. यह भ्रमित करने वाला हो सकता है, लेकिन आरंभ करने के लिए आपको रिपॉजिटरी की प्रत्येक फ़ाइल को समझने की आवश्यकता नहीं है। हम अनुशंसा करते हैं कि एक क्षेत्र से शुरुआत करें (उदाहरण के लिए, कुछ इनलाइन दस्तावेज़ों को ठीक करना), और अधिक खोज करने के लिए बाहर की ओर काम करें। लुइसा परेरा का [लुकिंग इनसाइड p5.js](https://www.luisapereira.net/teaching/materials/processing-foundation) p5.js वर्कफ़्लो में उपयोग किए गए टूल और फ़ाइलों का एक वीडियो टूर भी देता है।
+
+- 📁`contributor_docs/` में ऐसे दस्तावेज़ शामिल हैं जो योगदानकर्ताओं के लिए प्रथाओं और सिद्धांतों की व्याख्या करते हैं
+- 📁`docs/` में वास्तव में दस्तावेज़ शामिल नहीं हैं! बल्कि, इसमें [ऑनलाइन संदर्भ मैनुअल](https://p5js.org/reference/) *जेनरेट* करने के लिए उपयोग किया गया कोड शामिल है।
+- 📁`lib/` में एक खाली उदाहरण और p5.sound ऐड-ऑन शामिल है, जिसे समय-समय पर [p5.js-sound रिपॉजिटरी](https://github.com/processing/p5.js) से पुल अनुरोध के माध्यम से अपडेट किया जाता है। यह वह जगह भी है जहां निर्मित p5.js लाइब्रेरी को [ग्रंट](https://gruntjs.com/) का उपयोग करके एकल फ़ाइल में संकलित करने के बाद रखा जाता है। जब आप पुल अनुरोध करते हैं तो इसे GitHub रिपॉजिटरी में जांचने की आवश्यकता नहीं है।
+- 📁`src/` में लाइब्रेरी के लिए सभी स्रोत कोड शामिल हैं, जो शीर्ष रूप से अलग-अलग मॉड्यूल में व्यवस्थित हैं। यदि आप p5.js बदल रहे हैं तो आप इसी पर काम करेंगे। आपको अपना रास्ता खोजने में मदद करने के लिए अधिकांश फ़ोल्डरों के अंदर अपनी स्वयं की readme.md फ़ाइलें होती हैं।
+- 📁`tasks/` में ऐसी स्क्रिप्ट्स होती हैं जो p5.js के नए संस्करणों के निर्माण, परिनियोजन और रिलीज़ से संबंधित स्वचालित कार्य करती हैं।
+- 📁`tests/` में यूनिट परीक्षण शामिल हैं जो यह सुनिश्चित करते हैं कि परिवर्तन किए जाने पर लाइब्रेरी सही ढंग से कार्य करती रहे।
+- 📁`utils/` में रिपॉजिटरी के लिए उपयोगी अतिरिक्त फ़ाइलें हो सकती हैं, लेकिन आम तौर पर आप इस निर्देशिका को अनदेखा कर सकते हैं।
+
+
+## मिश्रित
+- 📁[`contributor_docs/`](https://github.com/processing/p5.js/tree/main/contributor_docs) फ़ोल्डर में अन्य फ़ाइलें हैं जिन्हें आप एक्सप्लोर कर सकते हैं। वे इस परियोजना के तकनीकी और गैर-तकनीकी दोनों विशिष्ट क्षेत्रों में योगदान देने से संबंधित हैं।
+- [लुकिंग इनसाइड p5.js](https://www.luisapereira.net/teaching/materials/processing-foundation) p5.js डेवलपमेंट वर्कफ़्लो में उपयोग किए जाने वाले टूल और फ़ाइलों का एक वीडियो टूर है।
+- [द कोडिंग ट्रेन का यह वीडियो](https://youtu.be/Rr3vLyP1Ods) :train::rainbow: p5.js में तकनीकी योगदान के साथ शुरुआत करने का एक सिंहावलोकन देता है।
+- p5.js [डॉकर छवि](https://github.com/toolness/p5.js-docker) को [Docker](https://www.docker.com/) में माउंट किया जा सकता है और p5 विकसित करने के लिए उपयोग किया जा सकता है .js को [नोड](https://nodejs.org/) जैसी आवश्यकताओं की मैन्युअल स्थापना की आवश्यकता के बिना या किसी भी तरह से होस्ट ऑपरेटिंग सिस्टम को प्रभावित किए बिना, डॉकर की स्थापना के अलावा।
+- p5.js लाइब्रेरी के लिए निर्माण प्रक्रिया एक [JSON डेटा फ़ाइल](https://p5js.org/reference/data.json) उत्पन्न करती है जिसमें p5.js की सार्वजनिक एपीआई होती है और इसका उपयोग स्वचालित टूलींग में किया जा सकता है, जैसे जहाँ तक एक संपादक में p5.js विधियों को स्वतः पूर्ण करने का प्रश्न है। यह फ़ाइल p5.js वेबसाइट पर होस्ट की गई है, लेकिन यह रिपॉजिटरी के भाग के रूप में शामिल नहीं है।
\ No newline at end of file
diff --git a/contributor_docs/hi/sidebar.md b/contributor_docs/hi/sidebar.md
new file mode 100644
index 0000000000..9c76cf96e3
--- /dev/null
+++ b/contributor_docs/hi/sidebar.md
@@ -0,0 +1,21 @@
+
+
+- [__योगदानकर्ता परिचय__](README.md)
+- __CONTRIBUTING DOCS__
+ - [योगदान के लिए दस्तावेज़ीकरण](contributing_documentation.md)
+ - [मुद्दे लेबल](issue_labels.md)
+- __CONTRIBUTING THOUGHTS__
+ - [डिज़ाइन सिद्धांत](design_principles.md)
+ - [योगदान का आयोजन](organization.md)
+- __CONTRIBUTING CODE__
+ - [लाइब्रेरी बनाना](creating_libraries.md)
+ - [इनलाइन दस्तावेज़ीकरण](inline_documentation.md)
+ - [इकाई परीक्षण](unit_testing.md)
+ - [अनुकूल-त्रुटि प्रणाली](friendly_error_system.md)
+- __RELATED INFO__
+ - [रिपॉज़िटरी संरचना](repo_structure.md)
+ - [WebGL आर्किटेक्चर](webgl_mode_architecture.md)
+ - [समर्थित ब्राउज़र्स](supported_browsers.md)
+ - [वेब एक्सेसिबिलिटी](web_accessibility.md)
+ - [कस्टम बिल्ड्स](custom_p5_build.md)
+ - [रिलीज प्रक्रिया](release_process.md)
\ No newline at end of file
diff --git a/contributor_docs/hi/supported_browsers.md b/contributor_docs/hi/supported_browsers.md
new file mode 100644
index 0000000000..48a6836bd7
--- /dev/null
+++ b/contributor_docs/hi/supported_browsers.md
@@ -0,0 +1,16 @@
+
+# समर्थित ब्राउज़र
+
+## हमारा घोषित लक्ष्य
+p5.js पुराने ब्राउज़रों के लिए समर्थन प्रदान करने के लिए [ब्राउज़रलिस्ट](https://browsersl.ist/) और [Babel](https://babeljs.io/) का उपयोग करता है। उपयोग में आने वाली ब्राउज़र सूची कॉन्फ़िगरेशन [`last 2 versions, not dead`](https://browserslist.dev/?q=bGFzdCAyIHZlcnNpb25zLCBub3QgZGVhZA%3D%3D) है। `last 2 versions` का अर्थ है किसी भी ब्राउज़र की अंतिम दो रिलीज़, `not dead` का अर्थ है वे ब्राउज़र जिन्हें पिछले 24 महीनों में आधिकारिक समर्थन या अपडेट प्राप्त था। किसी ब्राउज़र के समर्थित होने के लिए ये दोनों स्थितियाँ सत्य होनी चाहिए।
+
+व्यवहार में, आप अभी भी जावास्क्रिप्ट में उपलब्ध अधिकांश नवीनतम सुविधाओं का उपयोग कर सकते हैं क्योंकि बैबेल संभवतः उन्हें आवश्यक संगतता सूची से मेल खाने वाली किसी चीज़ में ट्रांसपाइल या पॉलीफ़िल करने में सक्षम होगा। कुछ सुविधाएँ जैसे [Web API](https://developer.mozilla.org/en-US/docs/Web/API), [WebGL](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API), या इसी तरह की विशेषताएं जो मूल जावास्क्रिप्ट भाषा का हिस्सा नहीं हैं, उन्हें बैबेल द्वारा नियंत्रित नहीं किया जा सकता है और उन्हें मामले दर मामले के आधार पर मूल्यांकन करने की आवश्यकता होगी।
+
+यह जांचने के लिए अच्छी जगहें हैं कि कोई सुविधा उपलब्ध है या नहीं, ये हैं [caniuse.com](https://caniuse.com/) और [MDN](https://developer.mozilla.org/en-US/)।
+
+## यह कहां लागू होता है
+समर्थित ब्राउज़र आवश्यकता p5.js स्रोत कोड, सभी उदाहरण (वेबसाइट उदाहरण पृष्ठ और दस्तावेज़ीकरण दोनों), और सभी आधिकारिक ट्यूटोरियल पर लागू होगी। तृतीय पक्ष ऐड-ऑन लाइब्रेरीज़ को समान आवश्यकता का पालन करने की आवश्यकता नहीं है लेकिन उन्हें ऐसा करने के लिए प्रोत्साहित किया जाता है।
+
+कई मामलों में जो ब्राउज़र आधिकारिक रूप से समर्थित नहीं हैं वे संभवतः अभी भी p5.js के साथ काम करेंगे लेकिन हम इस मामले में कोई गारंटी नहीं देते हैं।
+
+कोड परिवर्तन से संबंधित पीआर इस आवश्यकता का पालन सुनिश्चित करने के लिए प्रत्येक अनुभाग के प्रबंधक जिम्मेदार होंगे।
\ No newline at end of file
diff --git a/contributor_docs/hi/web_accessibility.md b/contributor_docs/hi/web_accessibility.md
new file mode 100644
index 0000000000..344910520c
--- /dev/null
+++ b/contributor_docs/hi/web_accessibility.md
@@ -0,0 +1,108 @@
+
+# p5.js वेब एक्सेसिबिलिटी
+
+यह दस्तावेज़ योगदानकर्ताओं और अनुरक्षकों और किसी भी अन्य इच्छुक पार्टियों के लिए p5.js की वेब एक्सेसिबिलिटी सुविधाओं की संरचना का वर्णन करता है। यदि आप अपने स्केच [स्क्रीन रीडर](https://en.wikipedia.org/wiki/Screen_reader) को सुलभ बनाने में रुचि रखते हैं, तो [ट्यूटोरियल](https://p5js.org/learn) पर जाएं या यदि आप चाहें तो स्क्रीन रीडर के साथ p5.js का उपयोग करने के लिए [स्क्रीन रीडर ट्यूटोरियल के साथ p5.js का उपयोग करना](https://p5js.org/learn/p5-screen-reader.html) पर जाएं।
+
+## अवलोकन
+
+क्योंकि कैनवास HTML तत्व एक बिटमैप है और उस पर खींची गई आकृतियों पर किसी भी स्क्रीन रीडर तक पहुंच योग्य जानकारी प्रदान नहीं करता है, p5.js में कई फ़ंक्शन हैं जो कैनवास को स्क्रीन रीडर्स के लिए अधिक सुलभ बनाते हैं।
+
+वर्तमान में, p5.js कैनवास पर मूल आकृतियों के लिए लाइब्रेरी द्वारा निर्मित स्क्रीन रीडर सुलभ आउटपुट का समर्थन करता है (`textOutput()` और `gridOutput()` के साथ) और उपयोगकर्ता-जनित स्क्रीन रीडर कैनवास सामग्री के सुलभ विवरण (`describe()` के साथ) का समर्थन करता है और `describeElement()`।
+
+## लाइब्रेरी ने बुनियादी आकृतियों के लिए सुलभ आउटपुट तैयार किए
+
+बुनियादी आकृतियों के लिए समर्थित सुलभ आउटपुट में टेक्स्ट और ग्रिड आउटपुट शामिल हैं।
+
+`textOutput()` एक स्क्रीन रीडर सुलभ आउटपुट बनाता है जो कैनवास पर मौजूद आकृतियों का वर्णन करता है। कैनवास के सामान्य विवरण में कैनवास का आकार, कैनवास का रंग और कैनवास में तत्वों की संख्या शामिल है (उदाहरण: 'आपका आउटपुट 400 x 400 पिक्सेल, लैवेंडर नीला कैनवास है जिसमें निम्नलिखित 4 आकृतियाँ हैं:')। इस विवरण के बाद आकृतियों की एक सूची दी गई है जहां प्रत्येक आकृति के रंग, स्थिति और क्षेत्र का वर्णन किया गया है (उदाहरण: "ऊपर बाईं ओर नारंगी दीर्घवृत्त कैनवास के 1% को कवर करता है")। अधिक विवरण प्राप्त करने के लिए प्रत्येक तत्व का चयन किया जा सकता है। तत्वों की एक तालिका भी प्रदान की गई है। इस तालिका में आकार, रंग, स्थान, निर्देशांक और क्षेत्र का वर्णन किया गया है (उदाहरण: "नारंगी दीर्घवृत्त स्थान = शीर्ष बाएँ क्षेत्र = 2")।
+
+`ग्रिडआउटपुट()` प्रत्येक आकृति के स्थानिक स्थान के आधार पर कैनवास की सामग्री को ग्रिड (एचटीएमएल तालिका) के रूप में प्रस्तुत करता है। तालिका आउटपुट से पहले कैनवास का संक्षिप्त विवरण उपलब्ध है। इस विवरण में शामिल हैं: पृष्ठभूमि का रंग, कैनवास का आकार, वस्तुओं की संख्या और वस्तु प्रकार (उदाहरण: "लैवेंडर नीला कैनवास 200 गुणा 200 है और इसमें 4 वस्तुएं हैं - 3 दीर्घवृत्त 1 आयत")। ग्रिड स्थानिक रूप से सामग्री का वर्णन करता है, प्रत्येक तत्व को उसकी स्थिति के आधार पर तालिका के एक सेल पर रखा जाता है। प्रत्येक कोशिका में एक तत्व का रंग और उस तत्व के आकार का प्रकार उपलब्ध होता है (उदाहरण: "नारंगी दीर्घवृत्त")। अधिक विवरण प्राप्त करने के लिए इन विवरणों को व्यक्तिगत रूप से चुना जा सकता है। तत्वों की एक सूची जहां आकार, रंग, स्थान और क्षेत्र का वर्णन किया गया है (उदाहरण: "नारंगी दीर्घवृत्त स्थान = शीर्ष बायां क्षेत्र = 1%)" भी उपलब्ध है।
+
+यदि कोई उपयोगकर्ता इनमें से किसी भी फ़ंक्शन में `LABEL` को एक पैरामीटर के रूप में पास करता है, तो कैनवास के निकट आउटपुट के साथ एक अतिरिक्त div बनाया जाता है, यह गैर-स्क्रीन रीडर उपयोगकर्ताओं के लिए उपयोगी है जो कैनवास के बाहर आउटपुट प्रदर्शित करना चाहते हैं।' जैसे ही वे कोड करते हैं सब DOM। हालाँकि, `LABEL` का उपयोग करने से स्क्रीन रीडर उपयोगकर्ताओं के लिए अनावश्यक अतिरेक पैदा हो जाएगा। हम केवल स्केच की विकास प्रक्रिया के हिस्से के रूप में `LABEL` का उपयोग करने और स्क्रीन रीडर उपयोगकर्ताओं के साथ अपना स्केच प्रकाशित करने या साझा करने से पहले इसे हटाने की सलाह देते हैं।
+
+### आउटपुट संरचना
+हालाँकि `textOutput()` और `gridOutput()` [src/accessibility/outputs.js](https://github.com/processing/p5.js/blob/main/src/accessibility/outputs.js) में स्थित हैं ), आउटपुट लाइब्रेरी में वितरित फ़ंक्शंस का उपयोग करके बनाए और अपडेट किए जाते हैं। यह अनुभाग उन विभिन्न कार्यों का विवरण देता है जो सुलभ आउटपुट का समर्थन करते हैं।
+
+#### outputs.js
+[src/accessibility/outputs.js](https://github.com/processing/p5.js/blob/main/src/accessibility/outputs.js) इसमें मुख्य कार्य शामिल हैं जो सुलभ आउटपुट बनाते हैं:
+
+* `textOutput()`: यह फ़ंक्शन `this._accessibleOutputs.text` को `true` पर सेट करके और `_createOutput('textOutput', 'Fallback')` को कॉल करके टेक्स्ट आउटपुट को सक्रिय करता है। यदि `LABEL` को एक पैरामीटर के रूप में पारित किया जाता है तो फ़ंक्शन `this._accessibleOutputs.textLabel` को `true` के रूप में सेट करके टेक्स्ट आउटपुट लेबल को भी सक्रिय करता है और लेबल के लिए `_createOutput('textOutput', 'Label')` को कॉल करता है।
+
+* `gridOutput()`: यह फ़ंक्शन `this._accessibleOutputs.grid` को `true` पर सेट करके और `_createOutput('gridOutput', 'Fallback')` को कॉल करके ग्रिड आउटपुट को सक्रिय करता है। यदि `LABEL` को एक पैरामीटर के रूप में पारित किया जाता है, तो फ़ंक्शन `this._accessibleOutputs.textLabel` को `true` के रूप में सेट करके ग्रिड आउटपुट लेबल को भी सक्रिय करता है और लेबल के लिए `_createOutput('gridOutput', 'Label')` को कॉल करता है।
+
+* `_createOutput()`: यह फ़ंक्शन सभी पहुंच योग्य आउटपुट के लिए HTML संरचना बनाता है। आउटपुट के प्रकार और प्रदर्शन के आधार पर बनाई गई HTML संरचना भिन्न होती है। फ़ंक्शन `this.ingredients` को भी आरंभ करता है जो आउटपुट के लिए सभी डेटा को संग्रहीत करता है जिसमें शामिल हैं: आकार, रंग और pShapes (जो कैनवास के पिछले आकार की एक स्ट्रिंग को संग्रहीत करता है)। यदि यह मौजूद नहीं है तो यह `this.dummyDOM` भी बनाता है। `this.dummyDOM` `` के अंदर DOM तत्वों के HTMLCollection को संग्रहीत करता है।
+
+* `_updateAccsOutput()`: accessibleOutputs का उपयोग करने पर इसे `setup()` और `draw()` के अंत में कॉल किया जाता है। यदि `this.ingredients` वर्तमान आउटपुट से भिन्न है, तो यह फ़ंक्शन आउटपुट (`_updateGridOutput` और `_updateTextOutput`) के अपडेट फ़ंक्शन को कॉल करता है। इस फ़ंक्शन को केवल `setup()` और `draw()` के अंत में कॉल करने के साथ-साथ केवल `_updateGridOutput` और `_updateTextOutput` को केवल तभी कॉल करने पर जब सामग्री अलग-अलग हो, स्क्रीन रीडर पर दबाव डालने से बचने में मदद मिलती है।
+
+* `_addAccsOutput()`: जब accessableOutputs सत्य होते हैं तो यह फ़ंक्शन सत्य लौटाता है।
+
+* `_accsBackground()`: इसे `background()` के अंत में कहा जाता है। यह `this.ingredients.shapes` को रीसेट करता है और यदि पृष्ठभूमि का रंग पहले से अलग है तो यह रंग का नाम प्राप्त करने और इसे `this.ingredients.colors.background` में संग्रहीत करने के लिए `_rgbColorName()` को कॉल करता है।
+
+* `_accsCanvasColors()`: भरण() और स्ट्रोक() के अंत में कहा जाता है। यह फ़ंक्शन भरण और स्ट्रोक रंगों को `this.ingredients.colors.fill` और `this.ingredients.colors.stroke` में सहेजकर अद्यतन करता है। यह रंगों के नाम प्राप्त करने के लिए `_rgbColorName()` को भी कॉल करता है।
+
+* `_accsOutput()`: `this.ingredients.shapes` बनाता है जिसमें आउटपुट बनाने के लिए उपयोग की जाने वाली सभी आकृतियाँ शामिल होती हैं। इस फ़ंक्शन को मूल आकार फ़ंक्शन के अंत में कॉल किया जाता है (src/accessibility से परे एक्सेसिबल आउटपुट देखें)। इसे कॉल करने वाले आकार के आधार पर, `_accsOutput()` उस आकार के बारे में सारी जानकारी इकट्ठा करने के लिए सहायक फ़ंक्शन को कॉल कर सकता है जो आउटपुट बनाने के लिए आवश्यक होगी। ये फ़ंक्शन, जो प्रोटोटाइप का हिस्सा नहीं हैं, में शामिल हैं:
+
+ * `_getMiddle()`: आयतों, चापों, दीर्घवृत्तों, त्रिभुजों और चतुर्भुजों का मध्य बिंदु या केन्द्रक लौटाता है।
+ * `_getPos()`: कैनवास पर किसी आकृति की स्थिति लौटाता है (उदाहरण: 'ऊपरी बाएँ', 'मध्य दाएँ')।
+ * `_canvasLocator()`: कैनवास पर मैप किए गए 10*10 ग्रिड पर आकृति का स्थान लौटाता है।
+ * `_getArea()`: कैनवास के कुल क्षेत्रफल के प्रतिशत के रूप में आकृति का क्षेत्रफल लौटाता है।
+
+When `this._accessibleOutputs.text` or `this._accessibleOutputs.text` are `true` several functions across the p5.js library call functions in output.js:
+
+* `_accsOutput()` is called in:
+ * `p5.prototype.triangle()`
+ * `p5.prototype._renderRect()`
+ * `p5.prototype.quad()`
+ * `pp5.prototype.point()`
+ * `p5.prototype.line()`
+ * `p5.prototype._renderEllipse()`
+ * `p5.prototype.arc()`
+
+* `_updateAccsOutput()` is called in:
+ * `p5.prototype.redraw()`
+ * `p5.prototype.resizeCanvas()`
+ * `this._setup`
+
+* `_accsCanvasColors()` is called in:
+ * `p5.Renderer2D.prototype.stroke()`
+ * `p5.Renderer2D.prototype.fill()`
+
+* `_accsBackground()` is called in:
+ * `p5.Renderer2D.prototype.background()`
+
+#### textOutput.js
+[src/accessibility/textOutput.js](https://github.com/processing/p5.js/blob/main/src/accessibility/textOutput.js) में टेक्स्ट आउटपुट को अपडेट करने वाले सभी फ़ंक्शन शामिल हैं। इस फ़ाइल में मुख्य फ़ंक्शन `_updateTextOutput()` है जिसे `_updateAccsOutput()` द्वारा [src/accessibility/outputs.js](https://github.com/processing/p5.js/blob/main/) में कॉल किया जाता है। src/accessibility/outputs.js) जब `this._accessibleOutputs.text` या `this._accessibleOutputs.textLabel` `true` हों।
+
+`_updateTextOutput()` टेक्स्ट आउटपुट और टेक्स्ट आउटपुट लेबल की सामग्री बनाने के लिए `this.ingredients` का उपयोग करता है जिसमें सारांश, आकृतियों की एक सूची और आकृतियों के विवरण की एक तालिका शामिल होती है। यदि ये वर्तमान आउटपुट से भिन्न हैं तो यह उन्हें अपडेट करता है। आउटपुट सामग्री का निर्माण फ़ाइल में कई सहायक कार्यों द्वारा समर्थित है जो प्रोटोटाइप का हिस्सा नहीं हैं:
+* `_textSummary()`: टेक्स्ट आउटपुट सारांश की सामग्री बनाता है।
+* `_shapeDetails()`: टेक्स्ट आउटपुट तालिका बनाता है जिसमें आकार विवरण होता है।
+* `_shapeList()`: आकृतियों की सूची बनाता हैtext output.
+
+#### gridOutput.js
+[src/accessibility/gridOutput.js](https://github.com/processing/p5.js/blob/main/src/accessibility/gridOutput.js) में ग्रिड आउटपुट को अपडेट करने वाले सभी फ़ंक्शन शामिल हैं। इस फ़ाइल में मुख्य फ़ंक्शन `_updateGridOutput()` है जिसे `_updateAccsOutput()` द्वारा [src/accessibility/outputs.js](https://github.com/processing/p5.js/blob/main/) में कॉल किया जाता है। src/accessibility/outputs.js) जब `this._accessibleOutputs.grid` या `this._accessibleOutputs.gridLabel` `सही` हों।
+
+`_updateGridOutput()` ग्रिड आउटपुट और ग्रिड आउटपुट लेबल की सामग्री बनाने के लिए `this.ingredients` का उपयोग करता है जिसमें एक सारांश, एक ग्रिड जो आकृतियों के स्थान और आकृतियों की सूची को मैप करता है। यदि ये वर्तमान आउटपुट से भिन्न हैं तो यह उन्हें अपडेट करता है। आउटपुट सामग्री का निर्माण फ़ाइल में कई सहायक कार्यों द्वारा समर्थित है जो प्रोटोटाइप का हिस्सा नहीं हैं:
+* `_gridSummary()`: ग्रिड आउटपुट सारांश की सामग्री बनाता है।
+* `_gridMap()`: एक ग्रिड बनाता है जो कैनवास पर आकृतियों के स्थान को मैप करता है।
+* `_gridShapeDetails()`: ग्रिड आउटपुट के आकृतियों की सूची बनाता है, सूची की प्रत्येक पंक्ति में आकृति के बारे में विवरण शामिल होता है।
+
+#### color_namer.js
+स्क्रीन रीडर सुलभ आउटपुट बनाते समय, कैनवास में उपयोग किए गए रंगों का नामकरण महत्वपूर्ण है। [src/accessibility/color_namer.js](https://github.com/processing/p5.js/blob/main/src/accessibility/color_namer.js) में `_rgbColorName()` एक फ़ंक्शन शामिल है जो आरजीबीए मान प्राप्त करता है और लौटाता है एक रंग का नाम. इस फ़ंक्शन को [src/accessibility/outputs.js](https://github.com/processing/p5.js/blob/main/src/accessibility/outputs.js) में `_accsBackground()` और `_accsCanvasColors` द्वारा कॉल किया जाता है ).
+
+`_rgbColorName()` रंग के एचएसवी मान प्राप्त करने के लिए `color_conversion._rgbaToHSBA()` का उपयोग करता है और फिर रंग का नाम प्राप्त करने के लिए `_calculatorColor()` का उपयोग करता है। इस फ़ाइल में फ़ंक्शन `_calculatorColor()` [colorNamer.js](https://github.com/MathuraMG/color-namer) से आता है जिसे [2018 प्रोसेसिंग फाउंडेशन फ़ेलोशिप](https://) के हिस्से के रूप में विकसित किया गया था। मीडियम.कॉम/प्रोसेसिंग-फाउंडेशन/मेकिंग-पी5-जेएस-एक्सेसिबल-ई2सीई366ई05ए0) और ब्लाइंड स्क्रीन रीडर विशेषज्ञ उपयोगकर्ताओं के परामर्श से। यह फ़ंक्शन `colorLookUp` सरणी में संग्रहीत एचएसवी मानों की तुलना करके रंग नाम लौटाता है। फ़ंक्शन को अद्यतन किया जाना चाहिए क्योंकि ग्रे के कुछ रंगों को सही ढंग से नामित नहीं किया गया है। इसे अद्यतन करते समय, उन टिप्पणियों को शामिल करके योगदानकर्ता की पठनीयता सुनिश्चित करना भी महत्वपूर्ण है जो बताती हैं कि कोड की प्रत्येक पंक्ति क्या करती है।
+
+## उपयोगकर्ता-जनित सुलभ कैनवास विवरण
+
+### वर्णन करना()
+'वर्णन()' फ़ंक्शन कैनवास के लिए एक स्क्रीन रीडर सुलभ विवरण बनाता है। पहला पैरामीटर कैनवास के विवरण के साथ एक स्ट्रिंग होना चाहिए। दूसरा पैरामीटर वैकल्पिक है. यदि निर्दिष्ट किया गया है, तो यह निर्धारित करता है कि विवरण कैसे प्रदर्शित किया जाएगा। सभी विवरण कैनवास तत्व के उप DOM का हिस्सा बन जाते हैं। यदि कोई उपयोगकर्ता `LABEL` को दूसरे पैरामीटर के रूप में पास करता है, तो कैनवास से सटे विवरण के साथ एक अतिरिक्त div बनाया जाता है।
+
+`वर्णन()` [src/accessibility/describe.js](https://github.com/processing/p5.js/blob/main/src/accessibility/describe.js) में कई कार्यों द्वारा समर्थित है:
+* `_descriptionText()`: जांचता है कि टेक्स्ट `LABEL` या `FALLBACK` नहीं है और सुनिश्चित करता है कि टेक्स्ट विराम चिह्न के साथ समाप्त होता है। यदि पाठ '.', ',', ';', '?', '!' के साथ समाप्त नहीं होता है, तो यह फ़ंक्शन एक 'जोड़ता है।' स्ट्रिंग के अंत में. पाठ लौटाता है.
+* `_describeHTML()`: कैनवास के लिए फ़ॉलबैक HTML संरचना बनाता है। यदि `वर्णन()` का दूसरा पैरामीटर `LABEL` है, तो यह फ़ंक्शन विवरण पाठ के लिए कैनवास तत्व से सटे एक div बनाता है।
+
+### describeElement()
+`describeElement()` फ़ंक्शन स्केच तत्वों या आकृतियों के समूहों के लिए एक स्क्रीन रीडर सुलभ विवरण बनाता है जो एक साथ अर्थ बनाते हैं। पहला पैरामीटर तत्व के नाम के साथ एक स्ट्रिंग होना चाहिए, दूसरा पैरामीटर तत्व के विवरण के साथ एक स्ट्रिंग होना चाहिए। तीसरा पैरामीटर वैकल्पिक है. यदि निर्दिष्ट किया गया है, तो यह निर्धारित करता है कि विवरण कैसे प्रदर्शित किया जाएगा। सभी तत्व विवरण कैनवास तत्व के उप DOM का हिस्सा बन जाते हैं। यदि कोई उपयोगकर्ता `LABEL` को तीसरे पैरामीटर के रूप में पास करता है, तो कैनवास से सटे तत्व विवरण के साथ एक अतिरिक्त div बनाया जाता है।
+
+`describeElement()` को [src/accessibility/describe.js](https://github.com/processing/p5.js/blob/main/src/accessibility/describe.js) में कई फ़ंक्शन द्वारा समर्थित किया गया है:
+* `_elementName()`: जांचता है कि तत्व का नाम `LABEL` या `FALLBACK` नहीं है और यह सुनिश्चित करता है कि टेक्स्ट कोलन के साथ समाप्त होता है। तत्व का नाम लौटाता है.
+* `_descriptionText()`: जांचता है कि टेक्स्ट `LABEL` या `FALLBACK` नहीं है और सुनिश्चित करता है कि टेक्स्ट विराम चिह्न के साथ समाप्त होता है। यदि पाठ '.', ',', ';', '?', '!' के साथ समाप्त नहीं होता है, तो यह फ़ंक्शन एक 'जोड़ता है।' स्ट्रिंग के अंत में. पाठ लौटाता है.
+* `_describeElementHTML()`: कैनवास के लिए फ़ॉलबैक HTML संरचना बनाता है। जब `describeElement()` का दूसरा पैरामीटर `LABEL` होता है, तो यह फ़ंक्शन विवरण के लिए कैनवास तत्व से सटे एक div बनाता है।
\ No newline at end of file
diff --git a/contributor_docs/hi/webgl_mode_architecture.md b/contributor_docs/hi/webgl_mode_architecture.md
new file mode 100644
index 0000000000..1959bf60ea
--- /dev/null
+++ b/contributor_docs/hi/webgl_mode_architecture.md
@@ -0,0 +1,258 @@
+# p5.js WebGL मोड आर्किटेक्चर
+
+यह दस्तावेज़ उन योगदानकर्ताओं और पुस्तकालय निर्माताओं के लिए है जो WebGL कोडबेस का विस्तार करना चाहते हैं। यदि आप अपने स्केच में वेबजीएल मोड का उपयोग करने में सहायता ढूंढ रहे हैं, तो इसके बजाय वेबजीएल ट्यूटोरियल [पी5.जेएस लर्न पेज पर](https://p5js.org/learn/) पढ़ने पर विचार करें।
+
+
+## वेबजीएल मोड क्या है?
+
+ऐसे दो रेंडरर हैं जिन्हें p5.js 2D और WebGL मोड में चला सकते हैं। p5.js में WebGL मोड उपयोगकर्ता को उच्च-रेंडरिंग के लिए वेब ब्राउज़र में निर्मित [WebGL API](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API) का उपयोग करने की अनुमति देता है। प्रदर्शन 2डी और 3डी ग्राफिक्स। 2डी मोड और वेबजीएल मोड के बीच मुख्य अंतर यह है कि बाद वाला कंप्यूटर के जीपीयू तक अधिक सीधी पहुंच प्रदान करता है, जिससे यह 3डी में आकृतियों को प्रदर्शनपूर्वक प्रस्तुत करने या अन्य ग्राफिक्स और छवि प्रसंस्करण कार्यों को करने की अनुमति देता है।
+
+हम [एक GitHub प्रोजेक्ट](https://github.com/orgs/processing/projects/20) में WebGL मुद्दों की प्रगति पर नज़र रखते हैं।
+
+## वेबजीएल मोड के लक्ष्य
+
+किसी नई सुविधा का मूल्यांकन करते समय, हम इस बात पर विचार करते हैं कि क्या यह p5.js और WebGL मोड के लक्ष्यों के अनुरूप है:
+
+1. **सुविधाएँ शुरुआती के अनुकूल होनी चाहिए:** इसे WebGL और इसके द्वारा प्रदान की जाने वाली सुविधाओं का **शुरुआती-अनुकूल परिचय प्रदान करना चाहिए। इसका मतलब है कि हमें 3डी आकृतियों, कैमरों, प्रकाश व्यवस्था और शेडर्स के लिए सरल एपीआई की पेशकश करनी चाहिए। हम अभी भी उन्नत सुविधाओं का समर्थन कर सकते हैं, लेकिन केवल तभी जब वे मुख्य सुविधाओं की सरलता में हस्तक्षेप न करें।
+2. **2डी मोड के साथ फीचर समानता में सुधार:**यह 2डी मोड से घर्षण रहित संक्रमण होना चाहिए,** जिससे 3डी और वेबजीएल उपयोगकर्ताओं के लिए अधिक आसानी से "क्लिक" कर सके। इसका मतलब है कि हम ऐसी सुविधाएं बनाने का प्रयास करते हैं जो 2डी मोड और वेबजीएल मोड में भी काम करती हैं। चूँकि WebGL में 3D और शेडर सुविधाएँ भी हैं, इसका मतलब है कि WebGL मोड का लक्ष्य 2D मोड की सुविधाओं का एक सुपरसेट होना है।
+3. **सरलता और विस्तारशीलता सर्वोपरि हैं:** इसमें **एक छोटा कोर होना चाहिए और पुस्तकालयों के लिए विस्तार योग्य होना चाहिए।** WebGL मोड को छोटा रखने से मुख्य सुविधाओं को अनुकूलित करना और बग सतह क्षेत्र को कम करना आसान हो जाता है। एक्सटेंशन पुस्तकालयों के माध्यम से अधिक उन्नत सुविधाओं को शामिल करने का अवसर प्रदान करता है।
+4. **p5.js के प्रदर्शन में सुधार करें:** इसे **पिछले लक्ष्यों में हस्तक्षेप किए बिना यथासंभव तेज़ चलना चाहिए।** अच्छा प्रदर्शन विभिन्न प्रकार के दर्शकों और उपकरणों के लिए स्केच को सुलभ रखता है। नए एपीआई डिज़ाइन करते समय, हम यह सुनिश्चित करने का प्रयास करते हैं कि डिज़ाइन का कार्यान्वयन प्रभावी हो। हालाँकि, हम 2डी मोड के साथ सरलता और समानता को प्राथमिकता देते हैं।
+
+
+## 2डी मोड के साथ डिज़ाइन में अंतर
+
+ब्राउज़र के 2डी और वेबजीएल कैनवास संदर्भ एपीआई अमूर्तता के बहुत अलग स्तर प्रदान करते हैं, जिसमें वेबजीएल आम तौर पर निचले स्तर का होता है और 2डी उच्च स्तर का होता है। यह p5.js के WebGL और 2D मोड के बीच कुछ मूलभूत डिज़ाइन अंतरों को प्रेरित करता है।
+
+- **वेबजीएल मोड अधिक गहराई से नेस्टेड डेटा संरचनाएं बनाता है।** 2डी मोड आम तौर पर ब्राउज़र को कमांड भेजता है, जिससे अपेक्षाकृत उथले कॉल स्टैक होते हैं। इसके विपरीत, WebGL मोड आकृतियों को त्रिकोणों में तोड़ने, उन्हें प्रस्तुत करने और अक्सर भविष्य में पुन: उपयोग के लिए उन्हें कैशिंग करने के लिए जिम्मेदार है। अधिक जटिल रेंडरिंग तर्क के कारण कार्यान्वयन को पठनीय और रखरखाव योग्य बनाए रखने के लिए कोड को `p5.Texture`, `p5.RenderBuffer`, और `p5.DataArray` जैसे कई वर्गों में विभाजित करने की आवश्यकता होती है।
+- **वेबजीएल मोड अधिक अनुकूलन प्रदान करता है।** उदाहरण के लिए, जबकि 2डी मोड यह नियंत्रित नहीं करता है कि वक्र कैसे प्रस्तुत किए जाते हैं, वेबजीएल उन्हें त्रिकोण में परिवर्तित करने के लिए जिम्मेदार है। हालांकि यह एक समझदार डिफ़ॉल्ट चुनता है, `कर्वडिटेल()` एपीआई उपयोगकर्ताओं को यह नियंत्रित करने देता है कि कितने लाइन सेगमेंट का उपयोग करना है, क्योंकि हम प्रत्येक उपयोग के मामले के लिए गुणवत्ता और प्रदर्शन के सर्वोत्तम संतुलन की भविष्यवाणी नहीं कर सकते हैं।
+- **वेबजीएल मोड को उच्च और निम्न-स्तरीय एपीआई को संतुलित करना होगा।** चूंकि ब्राउज़र वेबजीएल एपीआई के साथ बेहतर नियंत्रण उपलब्ध है, इसलिए पी5.जेएस का वेबजीएल मोड उपयोगकर्ताओं को कुछ हद तक नियंत्रण प्रदान करने में सक्षम है जहां 2डी मोड नहीं कर सकता है। फिर हमें उपयोगकर्ताओं के लिए अमूर्तता का सही स्तर चुनने के कार्य का सामना करना पड़ता है। बहुत अधिक है, और वे ब्राउज़र द्वारा प्रदान की जाने वाली कुछ चीज़ों का लाभ उठाने में असमर्थ हैं; बहुत कम, और हम जटिलता और प्रदर्शन के प्रबंधन का बहुत सारा काम उपयोगकर्ता पर डाल देते हैं।
+
+
+## आकृतियाँ बनाना
+
+### आकृतियाँ बनाना: भरण, स्ट्रोक, और 3डी ज्यामिति
+
+2D और WebGL दोनों में p5.js द्वारा खींची गई हर चीज़ में भरण और स्ट्रोक शामिल हैं। कभी-कभी, हम केवल एक या दूसरे को ही बनाते हैं, लेकिन प्रत्येक आकृति को किसी भी घटक को खींचने के लिए तैयार होना चाहिए।
+
+वेबजीएल में सभी आकृतियाँ त्रिभुजों से बनी हैं। जब कोई उपयोगकर्ता `सर्कल()`, `beginShape(),` या `वर्टेक्स()` जैसे फ़ंक्शन को कॉल करता है, तो रेंडरर को [आकार को बिंदुओं की श्रृंखला में तोड़ना होगा](https://github.com/processing/p5.js/blob/main/src/webgl/3d_primitives.js). बिंदु रेखाओं में जुड़े हुए हैं, और रेखाएँ त्रिभुजों में। उदाहरण के लिए, `सर्कल()` यह पता लगाने के लिए त्रिकोणमिति का उपयोग करता है कि सर्कल के साथ बिंदु कहां रखे जाएं। `curveVertex()` और `bezierVertex()` किसी भी बेज़ियर कर्व को बिंदुओं में बदलने के लिए लुक-अप टेबल बनाते हैं।
+
+
+#### Fills
+
+भराव बनाने के लिए, किसी आकृति की रूपरेखा को त्रिकोणों से भरना होगा। कुछ ड्राइंग फ़ंक्शन जैसे `beginShape(TRIANGLE_STRIP)` पहले से ही भरण के लिए त्रिकोण प्रदान करते हैं। यदि बनाई जा रही आकृति पहले से ही त्रिकोणों का उपयोग करके नहीं बनाई गई है, तो हम इसे तोड़ने के लिए लाइब्रेरी [libtess](https://github.com/brendankenny/libtess.js/) का उपयोग करते हैं: [p5.RendererGL.Immediate.js](https://github.com/processing/p5.js/blob/main/src/webgl/p5.RendererGL.Immediate.js) में , हम `_processVertices()` के माध्यम से बहुभुज रूपरेखा चलाते हैं। लिबटेस द्वारा उन्हें त्रिकोणों में बदलने के बाद, वे एक ऐसे प्रारूप में होते हैं जहां एक शेडर उन्हें स्क्रीन पर खींच सकता है।
+
+
+#### Strokes
+
+उनके नाम के बावजूद, अलग-अलग चौड़ाई और शैलियों के स्ट्रोक का समर्थन करने के लिए स्ट्रोक को भी भरने की आवश्यकता होती है। किसी आकृति की रूपरेखा के साथ रेखाओं को क्षेत्रफल के साथ आकृतियाँ बनाने के लिए अपने केंद्र से विस्तारित होने की आवश्यकता होती है। स्ट्रोक का विस्तार तीन प्रकार की आकृतियाँ बनाता है: जोड़, कैप और खंड, जैसा नीचे दिखाया गया है।
+
+

+
+
+जहां दो रेखा खंड जुड़ते हैं, वहां हम जोड़ जोड़ते हैं।
+
+- एक मेटर जोड़ आयतों के किनारों को तब तक फैलाता है जब तक कि वे एक बिंदु पर प्रतिच्छेद न कर दें।
+- एक बेवल जोड़ आयतों के कोनों को एक सीधी रेखा से जोड़ता है।
+- एक गोल जोड़ कोनों को एक गोलाकार चाप से जोड़ता है।
+
+हम लाइन त्रिकोणों की पुनर्गणना किए बिना जॉइन शैलियों को बदलने का समर्थन करते हैं। ऐसा करने के लिए, हम प्रत्येक पंक्ति को दो त्रिभुजों से बने एक चतुर्भुज से जोड़ते हैं। क्वाड सीमा सभी संभावित सम्मिलित शैलियों को सीमित करती है। हम क्वाड के भीतर केवल उन पिक्सल को प्रदर्शित करने के लिए शेडर का उपयोग करते हैं जो चयनित जॉइन शैली में मौजूद हैं। हम बताते हैं कि प्रत्येक शैली नीचे दिए गए क्वाड में कैसे फिट बैठती है।
+
+

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

+
+3डी आकृतियों में स्ट्रोक भी हो सकते हैं, लेकिन स्ट्रोक आकृतियों की गणना 2डी में की जाती है। इसका मतलब है कि वे कैमरे के परिप्रेक्ष्य के आधार पर बदल सकते हैं। हम यथासंभव पुनर्गणना से बचना चाहते हैं, इसलिए हम उस लाइन के बारे में सारी जानकारी संग्रहीत करते हैं जो कैमरे पर निर्भर नहीं है:
+
+- हम **लाइन के केंद्र बिंदुओं** को मॉडल स्पेस में शामिल करते हैं, जो नीचे लाल रंग में दिखाया गया है।
+- हम प्रत्येक आकृति के आरंभ और अंत में **रेखा की दिशा**, उसकी स्पर्शरेखा, क्रमशः नीले और गुलाबी रंग में दिखाते हैं। इससे हमें उन जोड़ों के आकार की गणना करने में मदद मिलती है जहां दो रेखाएं जुड़ती हैं।
+- हम **एक ध्वज शामिल करते हैं जो आकृति के प्रत्येक कोने को विशिष्ट रूप से पहचानता है।** स्पर्शरेखा और सामान्य (स्पर्शरेखा का 90-डिग्री रोटेशन) के साथ संयुक्त, यह यह निर्धारित करने में मदद करता है कि रेखा को मोटाई देने के लिए किस दिशा में विस्तार करना है .
+
+रेखा खींचने के लिए, हम स्क्रीन स्पेस में अंतिम रेखा स्थिति उत्पन्न करने के लिए उस जानकारी को एक शेडर में कैमरा इंट्रिनिक्स के साथ जोड़ते हैं।
+
+

+
+
+### आकार प्रतिपादन: तत्काल और बनाए रखा मोड
+
+स्क्रीन पर आकृतियाँ बनाने के लिए p5.js दो मार्गों का उपयोग करता है: **तत्काल मोड** और **बरकरार मोड।**
+
+**तत्काल मोड** उन आकृतियों के लिए अनुकूलित है जो हर फ्रेम को बदलती हैं। यदि आप एक ऐसा वक्र बना रहे हैं जो प्रत्येक फ्रेम को बदलता है, तो हर बार जब आप इसे बनाते हैं तो इसका आकार डेटा अलग होगा। इस वजह से, तत्काल मोड इसके लिए सबसे उपयुक्त है। यह p5.js को इंगित करता है कि इसे पुन: उपयोग के लिए आकृति को संग्रहीत करने में समय बर्बाद करने की आवश्यकता नहीं है, और यह ग्राफ़िक्स मेमोरी को समय के साथ सभी आकार विविधताओं से भरने से बचाता है। निम्नलिखित फ़ंक्शन इस मोड का उपयोग करते हैं:
+
+- `vertex()`, `curveVertex()`, `bezierVertex()`, और `quadraticVertex()`, जिसे `beginShape()` और `endShape()` के बीच बुलाया जाता है
+- `rect()` गोलाकार कोनों का उपयोग करते समय
+- `bezier()`
+- `curve()`
+- `line()`
+- `image()`
+
+बनाए रखा गया मोड उन आकृतियों के लिए अनुकूलित है जिन्हें आपको दोबारा बनाते रहना होगा और आकार नहीं बदलना होगा। एक बार जब कोई आकृति त्रिभुजों से बन जाती है और उसे खींचने के लिए GPU पर भेज दी जाती है, तो रिटेन्ड मोड उसे वहीं रखता है। इसे फिर से त्रिकोणित करने या जीपीयू को दोबारा भेजे बिना समय बर्बाद किए बिना इसे फिर से खींचा जा सकता है। सहेजा गया आकार डेटा p5.Geometry ऑब्जेक्ट में रखा जाता है। p5.जियोमेट्री त्रिकोण डेटा संग्रहीत करता है और GPU पर इसके अपलोड किए गए बफ़र्स का ट्रैक रखता है। `freeGeometry()` को कॉल करने से स्थान बनाने के लिए GPU डेटा साफ़ हो जाता है। इसके बाद इसे दोबारा ड्रॉ करने पर डेटा दोबारा अपलोड हो जाएगा। p5.js में कई 3D आकार ड्राइंग फ़ंक्शन, जैसे `sphere()` या `cone()`, आंतरिक रूप से इसका उपयोग करते हैं।
+
+आप तत्काल मोड कमांड से p5.Geometry बनाने के लिए buildGeometry() का उपयोग कर सकते हैं। आप इसे एक ऐसे फ़ंक्शन के साथ कॉल करते हैं जो किसी भी p5.js आकार ड्राइंग फ़ंक्शंस की एक श्रृंखला चलाता है। यह फ़ंक्शन चलाता है, आकृतियों को एक नए p5.Geometry में एकत्रित करता है, और उसे वापस कर देता है। फिर p5.ज्योमेट्री को भविष्य में कुशलतापूर्वक खींचा और पुनः तैयार किया जा सकता है।
+
+
+## सामग्री, रोशनी और शेडर
+
+हमारे द्वारा बनाई गई प्रत्येक आकृति को भरने के लिए एक ही शेडर का उपयोग किया जाता है, और उसके स्ट्रोक्स के लिए एक ही शेडर का उपयोग किया जाता है। कुछ डिफ़ॉल्ट शेडर्स हैं जिन्हें कोई भी p5.js में से चुन सकता है। आप डिफ़ॉल्ट शेडर के बजाय अपना स्वयं का शेडर भी लिख और उपयोग कर सकते हैं।
+
+डिफ़ॉल्ट शेडर्स p5.js की प्रकाश व्यवस्था और सामग्री प्रणाली के साथ काम करते हैं। उपयोगकर्ता किसी आकार के साथ यह निर्दिष्ट कर सकता है कि दृश्य में कौन सी रोशनी हैं और प्रत्येक वस्तु रंग और चमक सहित प्रकाश पर कैसे प्रतिक्रिया करती है। यह जानकारी खींची गई प्रत्येक वस्तु के लिए शेडर को दी जाती है। कस्टम शेडर्स समान प्रकाश व्यवस्था और सामग्री जानकारी तक भी पहुंच सकते हैं, जिससे उपयोगकर्ताओं और लाइब्रेरी निर्माताओं को डिफ़ॉल्ट रेंडरिंग व्यवहार का विस्तार करने की अनुमति मिलती है।
+
+
+### शेडर्स
+
+P5 में कुछ शेडर्स निर्मित हैं:
+
+- **रंग शेडर:** सपाट रंगों को चित्रित करने के लिए, `भरण()` या `स्ट्रोक()` का उपयोग करके सक्रिय किया जाता है।
+- **लाइटिंग शेडर:** जटिल प्रकाश व्यवस्था और बनावट के साथ 2डी और 3डी आकार बनाने के लिए। `lights()`, `ambientLight()`, `directionalLight()`, `pointLight()`, और `spotLight()` को कॉल करके सक्रिय किया गया। प्रत्येक प्रकाश सूची में एक प्रकाश जोड़ता है। सभी अतिरिक्त रोशनी आकृति की छायांकन में योगदान करती हैं। यदि आप रोशनी का उपयोग नहीं करते हैं, तो रंग शेडर का उपयोग करके आकृति बनाई जाएगी, जो केवल भरण रंग का उपयोग करता है।
+- **सामान्य/डीबग शेडर:** सामान्य सतह को रंग के रूप में उपयोग करके 2डी और 3डी आकार बनाने के लिए। इसे `normalMaterial()` कहकर सक्रिय किया जाता है।
+
+
+### रोशनी
+
+उपयोगकर्ता `ambientLight()`, `directionalLight()`, `pointLight()`, और `spotLight()` सेट कर सकते हैं। प्रत्येक प्रकाश सूची में एक प्रकाश जोड़ता है। सभी अतिरिक्त रोशनी आकृति की छायांकन में योगदान करती हैं। उन सभी का एक रंग होता है, और कुछ के कुछ अन्य पैरामीटर होते हैं, जैसे स्थिति या दिशा।
+
+`एम्बिएंटलाइट()` को छोड़कर सभी के लिए, जोड़ा गया प्रत्येक प्रकाश आकृतियों के दृश्य-स्वतंत्र प्रकाश और दृश्य-निर्भर प्रतिबिंबों में योगदान देता है। प्रत्येक प्रकाश का प्रतिबिंब, डिफ़ॉल्ट रूप से, उस प्रकाश के रंग से मेल खाता है। यदि वांछित है, तो कोई `specularColor()` सेट करके सभी प्रतिबिंबों का रंग बदल सकता है।
+
+यदि आप रोशनी का उपयोग नहीं करते हैं, तो आकृति **रंग शेडर** का उपयोग करके बनाई जाएगी, जो केवल भरण रंग का उपयोग करता है।
+
+
+### सामग्री
+
+प्रत्येक 3डी ऑब्जेक्ट में कुछ भौतिक गुण होते हैं जिन्हें उपयोगकर्ता द्वारा निर्धारित किया जा सकता है:
+
+- **रंग भरें:** यह वह रंग है जो आप तब देखते हैं जब रोशनी नहीं होती है। इसे `भरें()` के साथ सेट करें। यदि आकृति बनाने से पहले किया जाए तो यह पूरी आकृति पर लागू होता है। यदि `beginShape()`/`endShape()` के बीच `vertex()` से पहले कॉल किया जाता है, तो यह केवल उस शीर्ष पर लागू होगा। एक बनावट, यदि `बनावट()` पर कॉल से मौजूद है, तो भरण को ओवरराइड कर देगी। जब रोशनी होगी, तो यह रंग प्रकाश के फैले हुए घटक के साथ मिश्रित हो जाएगा। फैला हुआ घटक सतह पर सीधे प्रकाश पड़ने के कारण सतह के उज्ज्वल और अंधेरे क्षेत्रों का वर्णन करता है।
+- **स्पेक्युलर सामग्री:** यह वह रंग है जो प्रकाश के स्पेक्युलर घटक के साथ मिश्रित हो जाता है। स्पेक्युलर घटक आकृति की सतह पर दिखाई देने वाले प्रतिबिंबित हाइलाइट्स का वर्णन करता है। इस पैरामीटर को `specularMaterial()` के साथ सेट करें। यदि अनिर्दिष्ट है, तो आकृति में कोई प्रतिबिंब नहीं होगा।
+- **चमकदारता:** `चमकदार()` के साथ सेट करें, यह स्पेक्युलर प्रतिबिंब कितने तेज हैं।
+- **परिवेश सामग्री:** यह वह रंग है जो परिवेशीय प्रकाश के साथ मिश्रित हो जाता है। परिवेशीय प्रकाश आकृति पर निरंतर सर्वदिशात्मक प्रकाश का वर्णन करता है। इस पैरामीटर को `ambientMaterial()` के साथ सेट करें। यदि अनिर्दिष्ट है, तो यह भरण रंग के समान होगा।
+- **उत्सर्जक सामग्री**: `उत्सर्जक सामग्री()` के साथ सेट करें, यह आकृति की रोशनी में एक स्थिर रंग जोड़ता है, जैसे कि वह उस रंग की अपनी रोशनी पैदा कर रहा हो।
+
+
+### शेडर कार्यान्वयन
+
+प्रकाश व्यवस्था और सामग्री पैरामीटर शेडर विशेषताओं और वर्दी में बदल जाते हैं। यदि आप उन्हें कस्टम शेडर में संदर्भित करते हैं, तो p5.js उन्हें स्वचालित रूप से आपूर्ति करेगा।
+
+जबकि उन्नत शेडर लेखक इन गुणों का लाभ उठा सकते हैं, नए उपयोगकर्ताओं के लिए यह अस्पष्ट हो सकता है। भविष्य के लक्ष्य अनुभाग में, हम एपीआई में सुधार के लिए कुछ योजनाओं का वर्णन करते हैं। हम सार्वजनिक रूप से इसका दस्तावेजीकरण करने और इसका समर्थन करने से पहले इसमें सुधार करना चाह सकते हैं।
+
+
+#### वैश्विक
+
+सभी संदर्भों में सभी वस्तुओं के लिए, निम्नलिखित वैश्विक वर्दी उपलब्ध हैं:
+
+- `यूनिफ़ॉर्म mat4 uModelViewMatrix`: ऑब्जेक्ट-स्पेस स्थिति को कैमरा-स्पेस में बदलने के लिए एक मैट्रिक्स
+- `यूनिफ़ॉर्म mat4 uProjectionMatrix`: कैमरा-स्पेस स्थिति को स्क्रीन स्पेस में बदलने के लिए एक मैट्रिक्स
+- `यूनिफ़ॉर्म mat3 uNormalMatrix`: ऑब्जेक्ट-स्पेस मानदंडों को कैमरा-स्पेस में परिवर्तित करने के लिए एक मैट्रिक्स
+
+इसके अतिरिक्त, ये प्रति-शीर्ष गुण विशेषताओं के रूप में उपलब्ध हैं:
+
+- `विशेषता vec3 aPosition`: वस्तु स्थान में शीर्ष की स्थिति
+- `विशेषता vec3 aNormal`: भरण के लिए, सतह से बाहर की ओर इंगित करने वाली दिशा
+- `विशेषता vec2 aTexCoord`: भरण के लिए, बनावट छवि पर किसी स्थान को संदर्भित करते हुए x और y में 0 और 1 के बीच एक समन्वय
+- `विशेषता vec3 aVertexColor`: भरने के लिए, एक वैकल्पिक प्रति-वर्टेक्स रंग
+
+
+#### रोशनी
+
+- `यूनिफ़ॉर्म बूल यूयूज़लाइटिंग`: रोशनी प्रदान की गई है या नहीं
+
+यदि `uUseLighting` सेट किया गया है, तो आगे की प्रकाश व्यवस्था की जानकारी इसमें दी जाएगी:
+
+
+##### परिवेशीय रोशनी
+
+- `यूनिफ़ॉर्म int uAmbientLightCount`: कितनी परिवेशी लाइटें मौजूद हैं, अधिकतम 5 तक
+- `यूनिफ़ॉर्म vec3 uAmbientColor[5]`: परिवेशीय हल्के रंग
+
+
+##### दिशात्मक रोशनी
+
+- `यूनिफ़ॉर्म int uDirectionalLightCount`: कितनी दिशात्मक रोशनी मौजूद हैं, अधिकतम 5 तक
+- `यूनिफ़ॉर्म vec3 uLightingDirection[5]`: प्रकाश दिशाएँ
+- `यूनिफ़ॉर्म vec3 uDirectionalDiffuseColors[5]`: हल्के फैले हुए रंग
+- `यूनिफ़ॉर्म vec3 uडायरेक्शनल स्पेक्युलर कलर्स[5]`: हल्के स्पेक्युलर रंग
+
+
+##### प्वाइंट लाइटें
+
+- `यूनिफ़ॉर्म int uPointLightCount`: अधिकतम 5 तक, कितनी पॉइंट लाइटें मौजूद हैं
+- `यूनिफ़ॉर्म vec3 uPointLightLocation[5]`: बिंदु रोशनी का स्थान
+- `यूनिफ़ॉर्म vec3 uPointLightDiffuseColors[5]`: बिंदु रोशनी के बिखरे हुए रंग
+- `यूनिफ़ॉर्म vec3 uPointLightSpeculularColors[5]`: पॉइंट लाइट के स्पेक्युलर रंग
+
+##### स्पॉट लाइटें
+
+- `यूनिफ़ॉर्म इंट यूस्पॉटलाइटकाउंट`: कितनी स्पॉट लाइटें मौजूद हैं, अधिकतम 5 तक
+- `यूनिफ़ॉर्म फ़्लोट uSpotLightAngle[5]`: स्पॉट लाइट शंकु त्रिज्या
+- `यूनिफ़ॉर्म फ़्लोट uSpotLightConc[5]`: प्रत्येक स्पॉट लाइट की एकाग्रता (फ़ोकस)
+- `यूनिफ़ॉर्म vec3 uSpotLightDiffuseColors[5]`: हल्के फैले हुए रंग
+- `यूनिफ़ॉर्म vec3 uSpotLightSpeculularColors[5]`: हल्के स्पेक्युलर रंग
+- `यूनिफ़ॉर्म vec3 uSpotLightLocation[5]`: स्पॉट लाइट स्थान
+- `यूनिफ़ॉर्म vec3 uSpotLightDirection[5]`: स्पॉट लाइट दिशाएँ
+
+
+#### सामग्री
+
+##### रंग भरना
+
+- `यूनिफ़ॉर्म vec4 uMaterialColor`: आकार भरें रंग
+- `यूनिफ़ॉर्म बूल uUseVertexColor`: क्या प्रति-वर्टेक्स रंग हैं जो आकार भरने वाले रंग को ओवरराइड करते हैं
+- `विशेषता vec4 aVertexColor`: प्रति-वर्टेक्स भरण रंग
+- `यूनिफ़ॉर्म बूल इज़टेक्सचर`: क्या कोई बनावट निर्दिष्ट है
+- `यूनिफ़ॉर्म सैम्पलर2डी यूसैम्पलर`: एक बनावट
+- `यूनिफ़ॉर्म vec4 uTint`: बनावट के लिए एक टिंट गुणक
+
+
+##### स्पेक्युलर प्रतिबिंब
+
+- `यूनिफ़ॉर्म बूल यूस्पेक्युलर`: क्या प्रतिबिंब दिखाना है
+- `यूनिफ़ॉर्म फ़्लोट यू शाइनीनेस`: सामग्री की चमक
+- `यूनिफ़ॉर्म vec4 uSpeularMatColor`: स्पेक्युलर प्रकाश के साथ मिश्रण करने के लिए सामग्री का रंग
+
+
+##### परिवेश रंग
+
+- `यूनिफ़ॉर्म बूल uHasSetAmbient`: क्या परिवेश रंग सेट किया गया है या क्या इसे डिफ़ॉल्ट रूप से भरण रंग में सेट किया जाना चाहिए
+- `यूनिफ़ॉर्म vec4 uAmbientMatColor`: परिवेश प्रकाश के साथ मिश्रण करने के लिए सामग्री का रंग
+
+
+#### अन्य शेडर इनपुट
+
+##### पंक्तियाँ
+
+डिफ़ॉल्ट लाइन शेडर स्वचालित रूप से वर्दी में इन वैश्विक गुणों के साथ आपूर्ति की जाती है:
+
+- `uniform vec4 uViewport`: एक वेक्टर जिसमें स्क्रीन आयत का `[minX, minY, maxX, maxY]` होता है
+- `uniform इंट यूपर्सपेक्टिव`: एक बूलियन निर्दिष्ट करता है कि लाइन मोटाई पर परिप्रेक्ष्य प्रक्षेपण लागू करना है या नहीं
+- `uniform इंट यूस्ट्रोकजॉइन`: जॉइन शैली का प्रतिनिधित्व करने वाला एक एनम। 0, 1, और 2 `ROUND`, `MITER`, `BEVEL` का प्रतिनिधित्व करते हैं।
+- `uniform int uStrokeCap`: कैप शैली का प्रतिनिधित्व करने वाला एक एनम। 0, 1, और 2 'गोल', 'प्रोजेक्ट', 'वर्ग' का प्रतिनिधित्व करते हैं।
+
+इसमें निम्नलिखित प्रति-शीर्ष विशेषताएँ भी हैं:
+
+- `uniform vec3 aTangentIn`: रेखा खंड की शुरुआत में 3डी दिशा
+- `uniform vec3 aTangentOut`: रेखा खंड के अंत में 3D दिशा
+- `attribute float aside`: एक एनम यह दर्शाता है कि स्ट्रोक के किस भाग पर बिंदु स्थित है। विवरण के लिए स्ट्रोक्स अनुभाग देखें।
+
+##### अंक
+
+- `uniform float uPointSize`: खींचे जा रहे बिंदु की त्रिज्या
+
+## कक्षाएं
+
+अधिकांश WebGL कोड का प्रवेश बिंदु **p5.RendererGL** के माध्यम से होता है। शीर्ष-स्तरीय p5.js फ़ंक्शंस वर्तमान रेंडरर को पास कर दिए जाते हैं। 2डी और वेबजीएल दोनों मोड में रेंडरर क्लास हैं जो इस सामान्य इंटरफ़ेस के अनुरूप हैं। तत्काल मोड और बनाए रखा मोड फ़ंक्शन **p5.RendererGL.Immediate.js** और **p5.RendererGL.Retained.js** में विभाजित हैं।
+
+रेंडरर के भीतर, मॉडलों के संदर्भ **retainedMode.geometry** मानचित्र में संग्रहीत होते हैं। प्रत्येक मान **p5.Geometry** के बफ़र्स को संग्रहीत करने वाला एक ऑब्जेक्ट है। पहली बार मॉडल (योर ज्योमेट्री) को कॉल करते समय, रेंडरर मानचित्र में एक प्रविष्टि जोड़ता है। इसके बाद यह ज्यामिति के GPU संसाधनों के संदर्भ संग्रहीत करता है। यदि आप एक p5.Geometry को मुख्य कैनवास और एक WebGL p5.Graphics पर भी बनाते हैं, तो इसमें दो रेंडरर्स में प्रविष्टियाँ होंगी।
+
+प्रत्येक सामग्री को **p5.Shader द्वारा दर्शाया जाता है।** आप शेडर (आपका शेडर) फ़ंक्शन के माध्यम से रेंडरर में वर्तमान शेडर सेट करते हैं। यह क्लास शेडर सोर्स कोड संकलित करने और शेडर यूनिफॉर्म सेट करने का काम संभालती है।
+
+शेडर यूनिफ़ॉर्म सेट करते समय, यदि यूनिफ़ॉर्म प्रकार एक छवि है, तो रेंडरर इसके लिए एक p5.Texture बनाता है। प्रत्येक p5.Image, p5.Graphics, p5.MediaElement, या p5.Framebuffer एसेट को एक मिलेगा। यह GPU पर छवि डेटा के प्रतिनिधित्व का ट्रैक रखता है। शेडर में एसेट का उपयोग करने से पहले, यदि आवश्यक हो तो p5.js GPU को नया डेटा भेजेगा। छवियों के लिए, ऐसा तब होता है जब किसी उपयोगकर्ता ने किसी छवि के पिक्सेल को मैन्युअल रूप से अपडेट किया हो। ऐसा डेटा वाली परिसंपत्तियों के लिए हर फ्रेम में होता है, जो प्रत्येक फ्रेम में बदल सकता है, जैसे कि वीडियो या पी5.ग्राफिक्स।
+
+**p5.Framebuffer** ऑब्जेक्ट से संबंधित बनावट अद्वितीय हैं। फ़्रेमबफ़र ग्राफ़िक्स की तरह होते हैं: वे उन सतहों का प्रतिनिधित्व करते हैं जिन पर खींचा जा सकता है। P5.ग्राफिक्स के विपरीत, फ़्रेमबफ़र्स पूरी तरह से GPU पर रहते हैं। यदि कोई शेडर में बनावट के रूप में p5.ग्राफिक्स का उपयोग करता है, तो डेटा को सीपीयू से स्थानांतरित करने की आवश्यकता होती है। यह अक्सर एक प्रदर्शन बाधा हो सकती है। इसके विपरीत, फ़्रेमबफ़र पर ड्राइंग करते समय, आप सीधे इसकी GPU बनावट पर आकर्षित होते हैं। इस वजह से, कोई अतिरिक्त डेटा स्थानांतरण आवश्यक नहीं है। WebGL मोड इस कारण से जहां संभव हो वहां p5.ग्राफिक्स पर p5.Framebuffers का उपयोग करने का प्रयास करता है।
+
+
+## भविष्य के लक्ष्य
+
+वर्तमान में, WebGL मोड विभिन्न कार्यों के लिए कार्यात्मक है, लेकिन कई उपयोगकर्ता और पुस्तकालय निर्माता इसे नई दिशाओं में विस्तारित करना चाहते हैं। हमारा लक्ष्य उपयोगकर्ताओं और पुस्तकालय निर्माताओं के लिए बिल्डिंग ब्लॉक्स का एक सेट बनाना है जिससे वे एक्सटेंशन तैयार कर सकें। एक ब्लॉक को "पूर्ण" माना जा सकता है जब इसमें एक एक्स्टेंसिबल एपीआई हो जिसे हम आत्मविश्वास से समर्थन करने के लिए प्रतिबद्ध कर सकें। वेबजीएल मोड के लिए एक प्रमुख मील का पत्थर तब होगा जब हमारे पास पुस्तकालयों के पारिस्थितिकी तंत्र के लिए ऐसे ब्लॉकों का पर्याप्त सेट होगा। वर्तमान में विस्तार समर्थन की कमी वाले मुख्य क्षेत्र ज्यामिति और सामग्री हैं।
+
+- **समृद्ध सामग्री का समर्थन करने के लिए p5.Geometry का विस्तार करें।** कोई ज्यामिति बना सकता है, लेकिन कई कार्य जिन्हें उपयोगकर्ता पूरा करना चाहता है, वे अभी तक स्थिर एपीआई के साथ समर्थित नहीं हैं। कोई व्यक्ति ज्यामिति को कुशलतापूर्वक अद्यतन करना चाह सकता है, जो एनिमेटेड gltf मॉडल का समर्थन करने के लिए आवश्यक है। कोई व्यक्ति एकाधिक सामग्रियों को एक वस्तु में समूहित करना चाह सकता है, यदि वे किसी आयातित मॉडल में मौजूद हों। कोई शेडर के साथ काम करने के लिए कस्टम वर्टेक्स विशेषताएँ जोड़ना चाह सकता है। ये कार्य वर्तमान में असमर्थित हैं.
+- **कम भंगुर कस्टम शेडर्स सक्षम करें।** एक ऐसा शेडर बनाने के लिए जो p5.js की प्रकाश व्यवस्था और सामग्री प्रणाली को एकीकृत करता है, उपयोगकर्ता को वर्तमान में स्क्रैच से शेडर बनाने के लिए मजबूर किया जाता है। ये शेडर्स अक्सर डिफ़ॉल्ट शेडर्स के हिस्सों को कॉपी और पेस्ट करते हैं। यदि आंतरिक नामकरण या संरचना में परिवर्तन होता है तो यह संस्करणों के बीच टूट सकता है। कम भंगुर होने के लिए, पुस्तकालयों को डिफ़ॉल्ट टुकड़ों को आयात और पुन: उपयोग करने में सक्षम होना चाहिए। यह पुस्तकालयों को पोजिशनिंग लॉजिक का पुन: उपयोग करने या पोजिशनिंग लॉजिक को बढ़ाने की सुविधा देता है, लेकिन शेडिंग लॉजिक का पुन: उपयोग करने देता है। वर्तमान में [इस कार्य के लिए एक मुद्दा खुला है।](https://github.com/processing/p5.js/issues/6144)
+- **प्रदर्शन में सुधार।** WebGL मोड सुविधाओं और प्रदर्शन के बीच संतुलन बनाने का प्रयास करता है। एक तरीका आउटपुट गुणवत्ता को ट्यून करने के लिए एपीआई पेश करना है, जैसे कि कैसे `कर्वडिटेल ()` तेज़ लेकिन निम्न-गुणवत्ता वाले कर्व्स की अनुमति देता है। लाइन रेंडरिंग अपनी वर्तमान स्थिति में सामान्य प्रदर्शन बाधाओं में से एक है, और इसमें कम निष्ठा लेकिन उच्च प्रदर्शन विकल्प होने से लाभ हो सकता है। एक अन्य विधि नए प्रकार के ऑब्जेक्ट और रेंडरिंग विधियों को पेश करना है जो विभिन्न उपयोग पैटर्न के लिए अनुकूलित हैं, जैसे कि कैसे `एंडशेप (चाहिए बंद करें, गिनती करें)` अब कई आकृतियों के अधिक कुशल ड्राइंग के लिए वेबजीएल 2 इंस्टेंस्ड रेंडरिंग का समर्थन करता है।
\ No newline at end of file