জিএলএসএল - মূল কার্যক্ষেত্রের বাইরে গ্লোবাল ভেরিয়েবলগুলি ঘোষণা করা


12

এটি কী আপনার জিএলএসএল এর মূল ফাংশনের বাইরে ভেরিয়েবলগুলি ঘোষিত করতে সহায়তা করে? এই ভেরিয়েবলগুলি কী আসলে পুনরায় ব্যবহার হয় এবং এটি আরও কার্যকর?

এখানে প্রশ্নের মধ্যে কোড রয়েছে:

varying vec2 vposition;
uniform float seed;
uniform float top;
uniform float bottom;
uniform float phi;
uniform float theta;
uniform float scaledPI;
uniform float yn;
uniform float ym;
uniform float rx;
uniform float ry;
uniform float radius;

const float PI = 3.141592653589793238462643383;

float left;
float right;
float mscaled;
float xn;
float xm;
void main() {
    float t = vposition.y * yn + ym;

    if(t <= 0.0 || t >= PI){
        left = phi - PI;
        right = phi + PI;
    }else{
        mscaled = scaledPI / (1 - abs(Math.cos(theta)));
        mscaled = mscaled < PI ? mscaled : PI;
        left = phi - mscaled;
        right = phi + mscaled;
    }
    xn = (left - right) / ((-rx / 2.0) - (rx / 2.0));
    xm = left - ((-rx/2.0) * xn);
    float p = vposition.x * xn + xm;

    vec3 coords = vec3( sin(p) * sin(t), cos(t), cos(p) * sin(t) );
    float nv = surface( vec4( coords, seed ) );
    gl_FragColor = vec4( vec3( nv, nv, nv ), 1.0 );
}

3
এই প্রশ্নটি বিভ্রান্তিকর। জিএলএসএল এর প্রধান লুপ নেই। আপনি main()ফাংশন মানে ? আপনার মানগুলি কি আসলে গ্লোবাল ভেরিয়েবল (জিএলএসএল পার্লেন্সে ইউনিফর্ম বা বৈশিষ্ট্য) বা ধ্রুবক মান?
শান মিডলডিচ

আপনি যা বলছেন তার উদাহরণ হিসাবে আপনি কিছু কোড পোস্ট করতে পারেন?
নাথান রিড

আমি কোড সহ প্রশ্নটি আপডেট করেছি।
রজারড্ডার

@ ব্যবহারকারী 1286792: এটি জিএলএসএল এর প্রধান লুপ নেই এমনটি পরিবর্তন করে না । আপনি কী বলছেন তা পরিষ্কার নয়। আপনি কী ভাবছেন এই কাজটি করে বাঁচাবেন?
নিকল বোলাস

@ নিকলবোলাস আমি আরও আপডেট হওয়ার জন্য প্রশ্নটি আপডেট করেছি। আশা করি ভবিষ্যতে কারও পক্ষে এটি এখন কার্যকর।
রজারডাজার

উত্তর:


33

আমি মনে করি আপনি যা চাইছেন তা পেয়েছি। আমি ধরে নিলাম আপনার প্রাথমিক উদ্বেগ হ'ল এর বাইরে নির্ধারিত অ-ইউনিফর্ম ভেরিয়েবলগুলি main():

float left;
float right;
float mscaled;
float xn;
float xm;

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

অন্য কথায়, কোনও ফাংশন বা স্ট্যাক বা একটি গাদা হিসাবে কোনও জিনিস নেই, সমস্ত ভেরিয়েবলগুলি রেজিস্টারে যে কোনও জায়গায় বাস করে বলে ঘোষণা করে। তারা জিএলএসএল এর কিছু স্কোপের স্থানীয় বা পুরো ফাইলটিতে গ্লোবাল কিনা তা কোনও পার্থক্য করে না। তারা কেবল নিবন্ধভুক্ত।

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

তবে রেজিস্টার ফাইলটি অসীম নয়। আপনার হার্ডওয়্যার দ্বারা সমর্থিত রেজিস্টারগুলির তুলনায় আপনার যদি আরও ভেরিয়েবল থাকে তবে সংকলকটিকে রেজিস্টারগুলিতে আপনার সমস্ত ভেরিয়েবল ফিট করার চেষ্টা করতে হবে। এটির জন্য সাধারণত লাইভেস রেঞ্জ চেকিংয়ের কিছু ফর্ম প্রয়োজন । এটি হ'ল, যদি আপনি কোনও xnগণনার জন্য কোনও ভেরিয়েবল ব্যবহার করেন তবে এটি আর কখনও ব্যবহার করবেন না, সংকলক এটি নির্ধারণ করতে পারে এবং তারপরে জেনে রাখা হবে যে অধিকৃত রেজিস্টারটি xnঅন্য ভেরিয়েবল দ্বারা পরে ব্যবহার করা যেতে পারে, সুতরাং সেখানে রেজিস্টারগুলির চেয়ে বেশি ভেরিয়েবলের অনুমতি দেওয়া হয় (এত দীর্ঘ যেমন একবারে খুব বেশি লাইভ ভেরিয়েবল নেই) not

সংকলকটি এটি নাও করতে পারে। এটা নেই। অথবা এটি কেবলমাত্র কিছু ক্ষেত্রে এটি করতে পারে। Scopes সরল সংকলক প্রদত্ত সমাধানের জন্য আরও অনেক সহজ সমস্যা। স্থানীয় ফাংশন ভেরিয়েবলগুলিতে বরাদ্দকৃত সমস্ত নিবন্ধগুলি ফাংশনটি বের হওয়ার পরে পুনরায় ব্যবহার করা যেতে পারে কারণ এটি জানেন যে ভেরিয়েবলগুলি মারা গেছে। গ্লোবাল ভেরিয়েবলের এত সহজ গ্যারান্টি নেই। সুতরাং, কিছু কম সক্ষম সংকলক তাদের জীবনকালকেও অনুকূলিত করতে পারে না এবং বৈশ্বিক চলকগুলি সর্বদা একটি নিবন্ধক খায়। এটি কোনও ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে চলবে না তবে এটি কোনও চালক আপনার লেখার শেডারের আকার সীমাবদ্ধ করতে পারে।

সাধারণভাবে, আমি সমস্ত ভেরিয়েবল স্থানীয় রাখার জন্য সুপারিশ করব। সংজ্ঞাটি যত তাড়াতাড়ি বোঝায় তত পরিবর্তনকের ব্যবহারের কাছে রাখুন। এটি কেবল জিএলএসএল নয়, সমস্ত প্রোগ্রামিং ভাষার ক্ষেত্রে প্রযোজ্য। আপনার পক্ষে প্রতিটি ক্ষেত্রে "ভেরিয়েবল" কনস্টের তৈরি করারও পরামর্শ দেব। এটি আবার কিছু কম-সক্ষম সংকলকগুলির একটি ইঙ্গিত হতে পারে যা নির্দিষ্ট অনুকূলকরণ সম্ভব এবং আরও গুরুত্বপূর্ণ এটি আপনার কোডটিকে আরও স্ব-ডকুমেন্টিং এবং বজায় রাখা সহজ করে তোলে।

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


এটাই আমি বোঝাতে চাইছিলাম। আপনি আমার প্রশ্নের সঠিক উত্তর দিয়েছিলেন এবং আমি কী জিজ্ঞাসা করছিলাম তা আরও ভালভাবে ব্যাখ্যা করেছেন।
রজারড্ডার

1
আসলে কখনও কখনও অ-কনস্টের পরিবর্তে অ্যারেগুলিকে কনস্ট হিসাবে ঘোষণা করা পুরো শেডারকে ধীর করে দেয় (একটি লট ধীর)। আমি আমার জিটিএক্স 460 এ এই সমস্যাটি লক্ষ্য করেছি
তারা তারা

আমি কেবল একটি অদ্ভুত ত্রুটি থেকে মুক্তি পেয়েছি এবং দৃ suspect়ভাবে সন্দেহ করেছি যে এটি অ্যাড্রেনো জিপিইউ (ওপেনজিএল ইএস 3.1) একটি শেডার সংকলন করতে ব্যর্থ হয়েছে কারণ ভেরিয়েবলগুলি মূলের বাইরে ঘোষণা করা হয়েছিল।
কমোডোরো

আমি দেখেছি সবচেয়ে পুঙ্খানুপুঙ্খ SO উত্তরগুলির মধ্যে একটি - খুব ভাল!
দুহাইম

আজ আমি hsve নতুন কিছু শিখতে। আজ, আমি শিখছি, আমি সত্যই জানি না বা বুঝতে পারি না glsl। আমি একে ঘূর্ণিঝড় স্থান রূপান্তরিত জ্যামিতি জিআইএফ তৈরি করতে ব্যবহার করতে পারার অর্থ এই নয় যে আমি বুঝতে পারি যে এটি কীভাবে কাজ করে।
cmarangu
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.