অনেকগুলি পন্থা রয়েছে তবে কোনওটিই নিখুঁত নয়।
glAttachShader
শেডারগুলিকে একত্রিত করে কোড ভাগ করা সম্ভব , তবে এটি স্ট্রাক্ট ডিক্লেয়ারেশন বা- #define
ডি কনস্ট্যান্টের মতো জিনিসগুলি ভাগ করা সম্ভব করে না । এটি ফাংশন ভাগ করে নেওয়ার জন্য কাজ করে।
কিছু লোক glShaderSource
আপনার কোডের আগে সাধারণ সংজ্ঞা সংশোধন করার উপায় হিসাবে পাস করা স্ট্রিংগুলির অ্যারে ব্যবহার করতে পছন্দ করে তবে এর কিছু অসুবিধা রয়েছে:
- শেডারের মধ্যে যা অন্তর্ভুক্ত করা দরকার তা নিয়ন্ত্রণ করা আরও শক্ত (আপনার এটির জন্য একটি পৃথক সিস্টেমের প্রয়োজন))
- এর অর্থ শ্যাডার লেখক জিএলএসএল নির্দিষ্ট করতে পারবেন না, জিএলএসএল অনুচ্ছেদে
#version
নিম্নলিখিত বিবৃতিটির কারণে:
#Version নির্দেশক, অন্য কিছু আগে একটি shader ঘটা উচিত মতামত ও সাদা স্থান ছাড়া।
এই বিবৃতিটির কারণে glShaderSource
, #version
ঘোষণার আগে পাঠ্য পুনরায় চাপতে ব্যবহার করা যাবে না । এর অর্থ হ'ল #version
লাইনটি আপনার glShaderSource
যুক্তিগুলিতে অন্তর্ভুক্ত করা দরকার , যার অর্থ আপনার জিএলএসএল সংকলক ইন্টারফেসটি কোনওভাবে জিএলএসএল এর কোন সংস্করণ ব্যবহার করা হবে বলে আশা করা উচিত। অতিরিক্ত হিসাবে, একটি নির্দিষ্ট করে না#version
করে GLSL সংস্করণ 1.10 ব্যবহার করে GLSL সংকলককে ডিফল্ট করে তুলবে। আপনি যদি শেডার লেখককে #version
স্ক্রিপ্টের মধ্যে একটি স্ট্যান্ডার্ড উপায়ে নির্দিষ্ট করতে চান , তবে আপনাকে বিবৃতি #include
দেওয়ার পরে কোনওভাবে সন্নিবেশ করাতে হবে #version
। #version
স্ট্রিংটি খুঁজে পেতে (উপস্থিত থাকলে) পরিষ্কারভাবে জিএলএসএল শেডারকে বিশ্লেষণ করে এর পরে আপনার অন্তর্ভুক্তি তৈরি করার মাধ্যমে এটি করা যেতে পারে, তবে একটিতে অ্যাক্সেস থাকা#include
যখন এই অন্তর্ভুক্তিগুলি করা দরকার তখন নির্দেশিকা আরও সহজেই নিয়ন্ত্রণ করা আরও ভাল। অন্যদিকে, যেহেতু জিএলএসএল #version
লাইনের আগে মন্তব্যগুলিকে উপেক্ষা করে, তাই আপনার ফাইলের শীর্ষে মন্তব্যগুলির মধ্যে অন্তর্ভুক্ত করার জন্য আপনি মেটাডেটা যুক্ত করতে পারেন (ইয়াক।)
এখন প্রশ্নটি হল: এর কোনও মানক সমাধান আছে কি? #include
, নাকি আপনার নিজের প্রিপ্রসেসর এক্সটেনশন রোল করার দরকার আছে?
নেই GL_ARB_shading_language_include
এক্সটেনশন, কিন্তু এটি কিছু অপূর্ণতা আছে:
- এটি কেবল এনভিআইডিআইএ দ্বারা সমর্থিত ( http://delphigl.de/glcapsviewer/listreports2.php?listreportsbyexistance=GL_ARB_Sading_language_incolve )
- এটি সময়ের আগে অন্তর্ভুক্ত স্ট্রিংগুলি নির্দিষ্ট করে কাজ করে। সুতরাং, সংকলনের আগে, আপনাকে অবশ্যই উল্লেখ করতে হবে যে স্ট্রিংটি
"/buffers.glsl"
(যেমন ব্যবহৃত হয়েছে #include "/buffers.glsl"
) ফাইলের সামগ্রীর সাথে সামঞ্জস্য করে buffer.glsl
(যা আপনি আগে লোড করেছেন)।
- আপনি যেমন পয়েন্ট (2) এ লক্ষ্য করেছেন, আপনার পাথগুলি
"/"
লিনাক্স-স্টাইলের পরম পাথগুলির মতো শুরু হওয়া দরকার । এই স্বরলিপিটি সাধারণত সি প্রোগ্রামারদের কাছে অপরিচিত এবং এর অর্থ আপনি আপেক্ষিক পাথ নির্দিষ্ট করতে পারবেন না।
একটি সাধারণ নকশা হ'ল আপনার নিজস্ব #include
প্রক্রিয়াটি বাস্তবায়ন করা , তবে এটি জটিল হতে পারে যেহেতু #if
শর্তসাপেক্ষ সংকলন (শিরোনাম রক্ষীদের মতো) সঠিকভাবে পরিচালনা করার জন্য আপনাকে অন্যান্য প্রাক প্রসেসর নির্দেশিকাগুলিও পার্স (এবং মূল্যায়ন) করতে হবে)
আপনি যদি নিজের প্রয়োগ করে #include
থাকেন তবে কীভাবে আপনি এটি বাস্তবায়ন করতে চান তাতে আপনার কিছু স্বাধীনতাও রয়েছে:
- আপনি সময়ের আগে স্ট্রিং পাস করতে পারেন (পছন্দ
GL_ARB_shading_language_include
)।
- আপনি একটি অন্তর্ভুক্ত কলব্যাক নির্দিষ্ট করতে পারেন (এটি ডাইরেক্টএক্সের ডি 3 ডিকম্পিলার লাইব্রেরি দ্বারা সম্পন্ন করা হয়েছে))
- আপনি এমন একটি সিস্টেম প্রয়োগ করতে পারেন যা সাধারন সি অ্যাপ্লিকেশনগুলির মতো সর্বদা সরাসরি ফাইল সিস্টেম থেকে পড়ে।
সরলকরণ হিসাবে, আপনি নিজের প্রিপ্রসেসিং লেয়ারের অন্তর্ভুক্ত প্রত্যেকটির জন্য স্বয়ংক্রিয়ভাবে শিরোনাম রক্ষক সন্নিবেশ করতে পারেন, যাতে আপনার প্রসেসরের স্তরটি দেখতে দেখতে এমন হয়:
if (#include and not_included_yet) include_file();
(আমাকে উপরের কৌশলটি দেখানোর জন্য ক্রেডিট টু ট্রেন্ট রিড))
উপসংহারে , কোনও স্বয়ংক্রিয়, মানক এবং সহজ সমাধান নেই। ভবিষ্যতের সমাধানে আপনি কিছু এসপিআইআর-ভি ওপেনজিএল ইন্টারফেস ব্যবহার করতে পারেন, সেক্ষেত্রে জিপিএসএল থেকে এসপিআইআর-ভি সংকলক জিএল এপিআই-র বাইরে থাকতে পারে। ওপেনএলএল রানটাইমের বাইরে সংকলকটি থাকা বিষয়গুলি প্রয়োগ করা সহজতর করে তোলে #include
যেহেতু এটি ফাইল সিস্টেমের সাথে ইন্টারফেস করার জন্য উপযুক্ত স্থান। আমি বিশ্বাস করি যে বর্তমানের বিস্তৃত পদ্ধতিটি কেবলমাত্র একটি কাস্টম প্রিপ্রসেসর বাস্তবায়ন করা যা কোনও সি প্রোগ্রামার সাথে পরিচিত হওয়া উচিত way