কোন ওপেনজিএল টেক্সচার ফর্ম্যাটগুলি স্থানীয়ভাবে সমর্থিত তা কীভাবে সনাক্ত করবেন?


10

উদাহরণস্বরূপ, কীভাবে সনাক্ত করতে হবে যে আমার ভিডিওকার্ড "বিজিআর 8" সমর্থন করে না এবং এটিকে অন্য ফর্ম্যাটে রূপান্তরিত করে, যেমন সফ্টওয়্যার মোডে "আরজিবা 8"।

আপডেট: বিভ্রান্তির জন্য দুঃখিত। এই প্রশ্নের অবস্থা সম্পর্কে আরো যখন আমি সেট internalFormat মধ্যে glTexImage2D "bgra8" ভালো কিছু করার জন্য কিন্তু videodriver অভ্যন্তরীণভাবে অন্য ফরম্যাটে ডেটা রূপান্তর, "rgba8" মত।

উত্তর:


11

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

void glTexImage2D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, void *data );

দুটি জিনিস রয়েছে যা আপনি "টেক্সচার ফর্ম্যাটস" কল করতে পারেন। প্রথমটি internalformatপ্যারামিটার। এই বাস্তব চিত্রের বিন্যাস যেমন OpenGL দোকানে এটি হিসাবে। formatপরামিতি পিক্সেল ডেটার বিন্যাস অংশ বর্ণনা করে আপনার সাথে প্রদান dataপ্যারামিটার।

এটিকে অন্য কোনও উপায়ে রাখতে formatএবং আপনার ডেটা কেমন দেখাচ্ছে typeতা নির্ধারণ করুন । আপনি কীভাবে ওপেনজিএলকে আপনার ডেটা সঞ্চয় করতে বলছেন । আসুন আমাদের কল করুন এবং "পিক্সেল স্থানান্তর ফর্ম্যাট" করুন, যখন হবে "চিত্রের ফর্ম্যাট"।internalformatformattypeinternalformat

কোনও টেক্সচারের চিত্র বিন্যাস কখনই "বিজিআর 8" হতে পারে না । কোনও GL_BGR8 চিত্র বিন্যাসের গণক নেই। সেখানে হয় একটি GL_BGR enum, কিন্তু যে পিক্সেল স্থানান্তর ফরম্যাট, না ভাবমূর্তি পদ্ধতির জন্যে।

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

পিক্সেল ট্রান্সফার ফর্ম্যাট প্যারামিটারগুলির একটি নির্দিষ্ট সেট ওপেনজিএল বাস্তবায়নগুলি কীভাবে চিত্রের ফর্ম্যাটকে দেওয়া হয় সেগুলি কীভাবে সংরক্ষণ করবে তা মেলে কিনা তা বলার উপায় নেই।

সেখানে একটি উপায় এখন বলতে। এবং "এখন" দ্বারা, আমার অর্থ ওপেনজিএল 4.3 এবং / বা এআরবি_আন্তরের ফর্ম্যাট_কোয়ারী 2। আপনার কাছে একটি গ্রাফিক্স কার্ডে আসছে:

GLenum format, type;
glGetInternalformativ(texture_target, GL_RGBA8, GL_TEXTURE_IMAGE_FORMAT, 1, &format);
glGetInternalformativ(texture_target, GL_RGBA8, GL_TEXTURE_IMAGE_TYPE, 1, &type);

formatএবং typeএখন বাস্তবায়নের পছন্দসই formatএবং চিত্রগুলিতে কল typeব্যবহার glTex(Sub)Imageকরার জন্য GL_RGBA8। ডাউনলোডের জন্য পৃথক formatএবং typeকোয়েরি রয়েছে glReadPixels

আপনি করতে পারেন অন্যান্য প্রশ্ন আছে ।

আপনার যদি এগুলিতে অ্যাক্সেস না থাকে তবে আপনি থাম্বের কয়েকটি সাধারণ নিয়ম ব্যবহার করতে পারেন যা বেশিরভাগ হার্ডওয়্যার মেনে চলবে:

  • বিজিআরএ ক্রমে 8-বিট-প্রতি চ্যানেল ডেটার জন্য পিক্সেল ডেটা সঞ্চয় করবে। তাই আপনি যদি তাই হয়, আপনার পিক্সেল ডেটার সাথে বিন্যাস মেলে আরও দ্রুত জমিন তথ্য আপলোড করতে চান, আপনি ব্যবহার করতে চান GL_BGRAজন্য format, এবং GL_UNSIGNED_INT_8888বা GL_UNSIGNED_BYTEজন্য type
  • প্রকৃতপক্ষে 24-বিট রঙগুলিকে 24-বিট হিসাবে সংরক্ষণ করবে না। এটি সর্বদা তাদের 32-বিটগুলিতে প্যাড করবে; আলফা যখন ডেটা পড়বে তখন তা উপেক্ষা করা হবে। সুতরাং আপনি যদি ফর্ম্যাটের সাথে মেলে রাখতে চান তবে সর্বদা চিত্র ফর্ম্যাটগুলির GL_BGRA formatসাথে ব্যবহার করুন GL_RGB8, এমনকি যদি আপনাকে আলফা উপাদানটিতে ডামি ডেটা রাখতে হয়।

4
আমি internalFormat GL_RGBA উন্নত ব্যবহার বিন্যাস GL_BGRA পাওয়া http.download.nvidia.com/developer/Papers/2005/...
KindDragon

আমি "ইমেজ ফর্ম্যাট" হিসাবে অভ্যন্তরীণ ফর্ম্যাট প্যারামিটারটিকে পুনরায় ব্র্যান্ড করা থেকে বিরত থাকব কারণ এটি সমান বিভ্রান্তিকর। সম্ভবত "অভ্যন্তরীণ ফর্ম্যাট" "টেক্সচার পিক্সেল ফর্ম্যাট" হিসাবে ভাবা বোধগম্য হয়। "ফর্ম্যাট" এবং "টাইপ" প্যারামিটার সংমিশ্রণটি "উত্স পিক্সেল ফর্ম্যাট" (যা প্রায়শই একটি চিত্র, তাই আমার মন্তব্য) comment এবং তারপরে অবশ্যই জিপিইউ ফর্ম্যাটটি রয়েছে যা পূর্ণসংখ্যার ধরণের ফরমেটের জন্য বিজিআরএ।
স্টারশাইন

6

সাধারণত বেশিরভাগ হার্ডওয়্যার 3-উপাদানগুলির টেক্সচার ফর্ম্যাটগুলিকে সাপোর্ট করে না তাই এই নির্দিষ্ট উদাহরণে আপনি এটি রূপান্তরিত হওয়ার পক্ষে যুক্তিসঙ্গতভাবে নিরাপদ অনুমান করতে পারেন। একটি 3-উপাদান ওপেনএল টেক্সচারটি আসলে হার্ডওয়্যারে 4-উপাদান হয় তবে আলফা উপাদানটিকে উপেক্ষা / 255 / এ সেট করে।

https://www.khronos.org/opengl/wiki/Common_Mistakes# টেক্সচার_আপলোড_আর_পিক্সেল_প্রেস (সেই "সাধারণ ভুল" পৃষ্ঠাটি সোনার মাইন - এটি এখন বুকমার্ক করুন!)

আরও সাধারণ ক্ষেত্রে, glTexSubI ناهي আপনি প্রোগ্রাম শুরুর সময় এই সম্পর্কে জানতে চাইবেন - কেবল একটি খালি টেক্সচার তৈরি করুন (NULL ডেটা দিয়ে glTexImage2D এর মাধ্যমে), তারপরে এটি সম্পূর্ণ হবে তা নিশ্চিত করার জন্য একটি গ্লফিনিশ অনুসরণ করে প্রতিটি গ্লিটেক্সসবিআইজেজ 2 ডি কল দিন। প্রথমটিকে উপেক্ষা করুন কারণ এর জন্য ক্যাশে / রাজ্যগুলি / ইত্যাদি সেটআপ করা হচ্ছে এবং বাকি অংশগুলির সময় নির্ধারণ করুন। কয়েকটি ভিন্ন ফর্ম্যাটের জন্য এটি পুনরাবৃত্তি করুন এবং দ্রুততম চয়ন করুন।

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

আপনি ডি 3 ডি ডকুমেন্টেশন সহ ওপেনগিলে কী করছেন তা ক্রস-চেক করার জন্য এটি থাম্বের একটি কার্যকর নিয়ম। ডি 3 ডি যদি কিছু না করতে পারে তবে এটি একটি ভাল ইঙ্গিত হতে পারে যে প্রশ্নে থাকা কিছুটি হার্ডওয়্যারে সমর্থিত নয়। সর্বদা সত্য নয়, তবে একটি দরকারী শুরুর জায়গা।

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