আধুনিক ওপেনলএল সহ একাধিক ভিউপোর্ট?


9

আমি এসডিএল 2 ব্যবহার করি

বর্তমানে আমার একমাত্র শেডারের একটি এমভিপি ম্যাট্রিক্স রয়েছে এবং এটি দিয়ে পয়েন্টগুলি রূপান্তরিত করে।

আমি জিএলএম সহ একটি ক্যামেরার জন্য আমার ভিউ এবং প্রজেকশন ম্যাট্রিক্স গণনা করি:

glm::lookAt(pos, pos + forward, up);
glm::perspective(fov, aspectRatio, zNear, zFar);

আমি এটি অনুসন্ধান করেছি, তবে আমি কেবল একাধিক ভিউপোর্টের উত্তরাধিকার সূচনা পেতে পারি।

যদি আমি উদাহরণস্বরূপ 4 টি ক্যামেরা তৈরি করি এবং ধরা যাক যে সমস্ত ক্যামেরা ব্যতীত রেন্ডার করার জন্য স্ক্রিনের আলাদা চতুর্থাংশ রয়েছে they (সুতরাং আমি একই সামগ্রী সহ 4 টি ভিউপোর্ট চাই)

কিভাবে আমি এটি করতে পারব? আমি যথেষ্ট তথ্য না দিলে দুঃখিত, নির্দ্বিধায় জিজ্ঞাসা করুন।


আপনি কি বিশেষত 4 বার রেন্ডারিং সম্পাদনা করতে দেখছেন, বা কেবল একবার রেন্ডার করার জন্য এবং ফলাফলটি 4 টি পৃথক স্থানে প্রদর্শন করতে চান?
ট্রিকোপল্যাক্স

রেন্ডারিং 4 বার সঞ্চালন করুন। আমি যা লিখেছি তা কেবল একটি সরল উদাহরণ, উদাহরণস্বরূপ আমি চাই প্রধান ক্যামেরাটি পুরো উইন্ডোতে একটি গাড়ি রেন্ডার করতে এবং অন্য ক্যামেরাটি কোনও এক কোণে একটি ছোট স্কোয়ারের পাশ থেকে গাড়িটি রেন্ডার করে।
টুডওয়ারি

যদি আমি এটি সঠিকভাবে বুঝতে পারি তাই আপনার উইন্ডোটি উদাহরণস্বরূপ 4 টি ভাগে ভাগ করতে হবে এবং প্রতিটি অংশে দৃশ্যের অন্যান্য অংশগুলি রেন্ডার করতে হবে ?
narthex

হ্যাঁ, তবে কঠোরভাবে 4 অংশ নয়। আমি চাই এটি নমনীয় হোক। নমনীয় আকার এবং ভিউপোর্ট আয়তক্ষেত্রের অবস্থান।
টুডওয়ারি

উত্তর:


8

একই স্ক্রিনের বিভিন্ন ভিউপোর্টে (অংশগুলি) রেন্ডারিং নিম্নলিখিতভাবে করা যেতে পারে:

উদাহরণস্বরূপ, স্ক্রিনটিকে চার ভাগে বিভক্ত করা এবং একই ইউনিফর্মটি বিভিন্ন ইউনিফর্ম এবং বিভিন্ন ভিউপোর্ট সহ প্রতিটি কোণে চারবার একই দৃশ্য উপস্থাপন:

bindFramebuffer();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
scene->setConstPerFrameUniforms();

//left bottom
glViewport(0, 0, WindowWidth*0.5, WindowHeight*0.5);
scene->setVarPerFrameUniforms(1);
scene->draw();

//right bottom
glViewport(WindowWidth*0.5, 0, WindowWidth*0.5, WindowHeight*0.5);
scene->setVarPerFrameUniforms(2);
scene->draw();

//left top
glViewport(0, WindowHeight*0.5, WindowWidth*0.5, WindowHeight*0.5);
scene->setVarPerFrameUniforms(3);
scene->draw();

//right top
glViewport(WindowWidth*0.5, WindowHeight*0.5, WindowWidth*0.5, WindowHeight*0.5);
scene->setVarPerFrameUniforms(4);
scene->draw();

glViewport(0, 0, WindowWidth, WindowHeight); //restore default

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

1
হ্যাঁ, আপনি এটি প্যারামাইট্রাইজ করতে নির্দ্বিধায়। হিসাবে প্যারামিটারগুলি viewportহ'ল অংশ, প্রস্থের বাম নীচের কোণায় x, y হয় ch মিশ্রণের সাহায্যে আপনি পরীক্ষা করতে পারেন।
narthex

1
মিশ্রণ কেন? এটি প্রশ্নের সাথে কীভাবে সম্পর্কিত?
রাকসওয়ান

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

2
মিশ্রণের এর সাথে কোনও সম্পর্ক নেই এবং উত্তরটি আরও বিভ্রান্তিকর করে তোলে। ভিউপোর্টগুলি স্থাপন করা যা যা প্রয়োজন তা
ডিফল্ট

11

আপনি যদি নিজের নিজস্ব ভার্টেক্স / ফ্রেগমেন্ট শেডার লিখছেন তবে এটি করার আর একটি অতিরিক্ত সম্ভাবনা রয়েছে। এটি অনেক জটিল তবে আপনার এবং / অথবা অন্যদের জন্য কার্যকর হতে পারে। এটি অঙ্কন কমান্ডের জন্য কেবল একটি কল ব্যবহার করে এটি পুরো অঙ্কন প্রক্রিয়াটিকে গতি দেয়। ভিউপোর্টের সর্বাধিক সংখ্যা GL_MAX_VIEWPORTS দ্বারা সংজ্ঞায়িত করা হয় এবং সাধারণত 16 হয়।

ওপেনজিএল ৪.১ যেহেতু পদ্ধতিটি ভিভিউপোর্টপোর্টআরাইভ বিদ্যমান। এটি ভিউপোর্টের একটি অ্যারে সংজ্ঞায়িত করতে পারে। এই পদ্ধতি দ্বারা তৈরি করা ভিউপোর্টগুলিকে একটি সূচক নির্ধারিত করা হয়েছে।

এই সূচিটি ভার্টেক্স শ্যাডারে দৃশ্যটি রেন্ডার করা ভিউপোর্টটি সেট করতে ব্যবহার করা যেতে পারে। ( শেডার কোডটিতে আপনাকে " এআরবি_স্যাডার_ভিউপোর্ট_লেয়ার_আরে " এক্সটেনশনটি অন্তর্ভুক্ত করতে হবে )

আপনার ক্ষেত্রে আমি নিম্নলিখিতগুলি করার পরামর্শ দেব:


" এই সূচিটি ভার্টেক্স শ্যাডারে দৃশ্যটি রেন্ডার করা ভিউপোর্টটি সেট করতে ব্যবহার করা যেতে পারে " "না, এটি পারে না। ঠিক আছে, এআরবি_শাদার_ভিউপোর্ট_লেয়ার_রে এক্সটেনশন বা এএমডি সমতুল্য না without এগুলির কোনওটিই জিএল 4.5 তে মানক নয়। আপনি সম্ভবত জ্যামিতি শেডারগুলির কথা ভাবছেন।
নিকল বোলাস

@ নিকোল, এই ইঙ্গিতটির জন্য ধন্যবাদ! আমি উল্লেখ করতে ভুলে গেছি, আপনাকে এক্সটেনশনটি অন্তর্ভুক্ত করতে হবে। আমি আমার উত্তর সম্পাদনা করব।
খ্রিস্টান_বি

5

আপনার কেবলমাত্র ভিউপোর্টগুলি বাদে এটি @ উত্তর-এর উত্তরের একটি অনুলিপি। আমি নিশ্চিত নই কেন তার উত্তরে ফ্রেম বাফার / মিশ্রণ সামগ্রী অন্তর্ভুক্ত করা হয়েছে।

//left bottom
glViewport(0, 0, WindowWidth*0.5, WindowHeight*0.5);
scene->draw();

//right bottom
glViewport(WindowWidth*0.5, 0, WindowWidth*0.5, WindowHeight*0.5);
scene->draw();

//left top
glViewport(0, WindowHeight*0.5, WindowWidth*0.5, WindowHeight*0.5);
scene->draw();

//right top
glViewport(WindowWidth*0.5, WindowHeight*0.5, WindowWidth*0.5, WindowHeight*0.5);
scene->draw();

glViewport(0, 0, WindowWidth, WindowHeight); //restore default

1

এগুলি সব ভাল উত্তর, এবং এখনও অন্য উপায় আছে: (সবসময় আছে না?)

ভার্চুয়াল বাস্তবতার ক্রমবর্ধমান জনপ্রিয়তার কারণে, ওকুলাসভিআর-এর লোকেরা "মাল্টিভিউ" এক্সটেনশনের একটি ত্রয়ী বিকাশ করেছেন:

  1. ওভিআর_ মাল্টিভিউ ,
  2. ওভিআর_ মাল্টিভিউ 2 , এবং
  3. OVR_multiview_multisampled_render_to_texture

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

এই এক্সটেনশনগুলি ব্যবহার করার আগে, বিকাশকারীকে নিম্নলিখিত কোড যুক্ত করে ব্যবহারকারীর গ্রাফিক্স ড্রাইভারটিতে তাদের সমর্থন যাচাই করা উচিত:

const GLubyte* extensions = GL_CHECK( glGetString( GL_EXTENSIONS ) );
char * found_extension = strstr( (const char*)extensions, "GL_OVR_multiview" );
if (NULL == found_extension)
{
     exit( EXIT_FAILURE );
}

সেখান থেকে, এই বৈশিষ্ট্যটি কাজে লাগাতে আপনার ফ্রেমবফার সেটআপ করার বিষয়টি:

glFramebufferTextureMultisampledMultiviewOVR = PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEDMULTIVIEWOVR(eglGetProcAddress("glFramebufferTextureMultisampleMultiviewOVR"));
glFramebufferTextureMultisampledMultiviewOVR (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textureID, 0, 0, 2);

এবং একইভাবে শেডারে:

#version 300 es
#extension GL_OVR_multiview : enable

layout(num_views = 2) in;
in vec3 vertexPosition;
uniform mat4 MVP[2];

void main(){
    gl_Position = MVP[gl_ViewID_OVR] * vec4(vertexPosition, 1.0f);
}

একটি সিপিইউ-বাউন্ড অ্যাপ্লিকেশনটিতে, এই এক্সটেনশনটি রেন্ডারিং সময়কে নাটকীয়ভাবে হ্রাস করতে পারে, বিশেষত আরও জটিল দৃশ্যের সাথে :

মাল্টিভিউ এবং নিয়মিত স্টেরিওর মধ্যে আপেক্ষিক সিপিইউ সময়।  এক্স-অক্ষের ঘনক্ষেত্রের সংখ্যা এবং y- অক্ষের উপর আপেক্ষিক সময় সহ আরও ছোট।

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