ওপেনজিএল: আমি শেডারগুলি কোথায় রাখি?


17

আমি ওপেনজিএল ইএস ২.০ শিখার চেষ্টা করছি এবং আমি ভাবছি যে শেডারগুলি "পরিচালনা" করার সবচেয়ে সাধারণ অনুশীলন কোনটি?
আমি এই প্রশ্নটি জিজ্ঞাসা করছি কারণ আমি যে উদাহরণগুলি খুঁজে পেয়েছি (এন্ড্রয়েড এসডিকে সরবরাহিত API ডেমোর অন্তর্ভুক্ত যেমন) আমি সাধারণত জিএলআরেন্ডারারের শ্রেণীর ভিতরে সমস্ত কিছু দেখতে পাই এবং আমি বরং আলাদা জিনিসগুলি রাখতে পারি যাতে আমার থাকতে পারে, উদাহরণস্বরূপ, একটি গ্ল্যামাইজ অবজেক্ট যা আমি যখনই টেক্সচার্ড কোয়াড আঁকতে চাই তখন আমি পুনরায় ব্যবহার করতে পারি (আমি কেবল এই মুহুর্তে 2 ডি তে ফোকাস করছি), যেমন আমার ওপেনগিএল ইএস 1.0 কোডটি ছিল। প্রায় প্রতিটি উদাহরণে আমি পেয়েছি, শেডারগুলি কেবল শ্রেণির বৈশিষ্ট্য হিসাবে সংজ্ঞায়িত করা হয়। উদাহরণ স্বরূপ:

public class Square {

public final String vertexShader =
        "uniform mat4 uMVPMatrix;\n" +
        "attribute vec4 aPosition;\n" +
        "attribute vec4 aColor;\n" +
        "varying vec4 vColor;\n" +
        "void main() {\n" +
        "  gl_Position = uMVPMatrix * aPosition;\n" +
        "  vColor = aColor;\n" +
        "}\n";

public final String fragmentShader =
        "precision mediump float;\n" +
        "varying vec4 vColor;\n" +
        "void main() {\n" +
        "  gl_FragColor = vColor;\n" +
        "}\n";
// ...
}

এই প্রশ্নগুলির মধ্যে কিছু বোবা থাকলে আমি আগাম ক্ষমা চাই, তবে আমি এর আগে শেডারের সাথে কখনও কাজ করি নি।

1) উপরের কোডটি শেডারগুলি (সর্বজনীন চূড়ান্ত শ্রেণীর বৈশিষ্ট্যগুলি) সংজ্ঞায়িত করার সাধারণ উপায়?
2) আমার আলাদা শেডার ক্লাস করা উচিত?
3) যদি শেডারগুলি তাদের ব্যবহার করা শ্রেণীর বাইরে সংজ্ঞায়িত করা হয়, তবে আমি কীভাবে তাদের গুণাবলীর নামগুলি জানতে পারি (উদাহরণস্বরূপ "নীচের কোডের টুকরোতে" এলোকার) তাই আমি সেগুলি আবদ্ধ করতে পারি?

colorHandle = GLES20.glGetAttribLocation(program, "aColor");

উত্তর:


16

শেডারগুলি সংজ্ঞায়নের ক্ষেত্রে আমি সর্বদা অপছন্দ করি (একটি স্ট্রিংয়ে)। আমি কোনও পাঠ্য ফাইলে আমার কাজ করতে পছন্দ করি এবং লোড করার সময় এটি পড়তে পারি। এটি একটি স্ট্রিংয়ে সংজ্ঞায়িত করা ডিবাগিংয়ের জন্য বিরক্তিকর এবং এটি কেবল আমার কাছে অগোছালো দেখাচ্ছে। এটি টাইপ করতে সক্ষম হওয়া এবং স্ট্রিংয়ের অভ্যন্তরের পরিবর্তে এটি ফর্ম্যাট করা যেমন হওয়া উচিত ঠিক তত সহজ।

শেডার ডিবাগিংয়ের জন্য শেডারগুলিতে পড়া এবং প্রিন্টিং লগিংয়ের মতো শ্যাডারের কার্যকারিতা সহ আমার একটি পৃথক শ্রেণি রয়েছে।

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

যাইহোক, শেষ পর্যন্ত এটি আপনার উপর নির্ভর করে। আপনি বর্তমানে যেভাবে এটি করছেন তা দুর্দান্ত কাজ করে যদি এটি আপনাকে কোনও সমস্যার কারণ না করে।


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

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

2
আপনি শেডার ফাইলগুলিতে হট-লোড প্রয়োগ করতে পারেন - গেমটি আরম্ভ না করেই আপনাকে পরিবর্তনগুলি ডিবাগ করার অনুমতি দেয় allowing উত্পাদন ++
লিওসান

সেগুলি পড়ার জন্য একটি ফাইল গঠন এবং একটি পৃথক শেডার ক্লাস থাকার ধারণাটি আমার পছন্দ হয়। তাদেরকে সর্বদা একটি স্ট্রিংয়ে দেখানো আমাকে বিভ্রান্ত করে দেয় কারণ আমি জানতাম না যে তারা সাধারণত এইভাবে সংজ্ঞায়িত হয় বা কেবল শেখার উদ্দেশ্যে for ধন্যবাদ!
মিভিক্লিন

8

শ্যাডার (এবং এইভাবে উপাদান) পরিচালনার ব্যবস্থা হ'ল আপনার গ্রাফিক্স সিস্টেমটি আরও জটিল হয়ে ওঠে এবং আপনি প্রতিটি শ্যাডারকে কোডিং করে কঠোর কোডিংয়ের বিশাল কোড ডুপ্লিকেশন হিসাবে নিয়ে যেতে পারেন a এটি সমাধানের কয়েকটি বিকল্প উপায় এখানে:

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

বৈশিষ্ট্য এবং অভিন্ন নাম এবং এই জাতীয় হিসাবে, আপনি কেবল সমস্ত শেডারগুলিতে একটি সামঞ্জস্যপূর্ণ নামকরণ ব্যবহার করেন।


আমি অবশ্যই আমার শেডারগুলিকে একটি পৃথক ফাইলে স্থানান্তর করব। ধন্যবাদ!
মিভিক্লিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.