আপনি ওপেনজিএলে ওয়্যারফ্রেম হিসাবে আদিমকে কীভাবে রেন্ডার করবেন?
আপনি ওপেনজিএলে ওয়্যারফ্রেম হিসাবে আদিমকে কীভাবে রেন্ডার করবেন?
উত্তর:
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
চালু করতে,
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
স্বাভাবিক অবস্থায় ফিরে যেতে
নোট করুন যে টেক্সচার-ম্যাপিং এবং লাইটিংয়ের মতো জিনিসগুলি সক্ষম করা থাকলে এখনও তারের ফ্রেম লাইনে প্রয়োগ করা হবে, যা অদ্ভুত দেখাচ্ছে look
Http://cone3d.gamedev.net/cgi-bin/index.pl?page=tutorials/ogladv/tut5 থেকে
// Turn on wireframe mode
glPolygonMode(GL_FRONT, GL_LINE);
glPolygonMode(GL_BACK, GL_LINE);
// Draw the box
DrawBox();
// Turn off wireframe mode
glPolygonMode(GL_FRONT, GL_FILL);
glPolygonMode(GL_BACK, GL_FILL);
ওপেনজিএল 3 এবং glPolygonMode
তারপরে একটি ফরওয়ার্ড-সামঞ্জস্যপূর্ণ প্রসঙ্গ ধরে, আপনি হয় আগে উল্লিখিত হিসাবে ব্যবহার করতে পারেন তবে নোট করুন যে 1px এর বেশি পুরুত্বের রেখাগুলি এখন হ্রাস করা হয়েছে। সুতরাং যখন আপনি তারের ফ্রেম হিসাবে ত্রিভুজ আঁকতে পারেন, সেগুলি খুব পাতলা হওয়া দরকার। ওপেনজিএল ইএসে, আপনি GL_LINES
একই সীমাবদ্ধতার সাথে ব্যবহার করতে পারেন ।
ওপেনএল-তে আগত ত্রিভুজগুলি গ্রহণের জন্য জ্যামিতির ছায়াগুলি ব্যবহার করা, তাদেরকে পৃথক করে আনা এবং পুরু লাইনগুলি অনুকরণকারী কোয়াড (সত্যিকারের ত্রিভুজগুলির জোড়া) হিসাবে রাস্টারাইজেশনের জন্য প্রেরণ করা সম্ভব। খুব সহজ, সত্যই, জ্যামিতির শেডারগুলি বাদ দিয়ে দুর্বল পারফরম্যান্স স্কেলিংয়ের জন্য কুখ্যাত।
পরিবর্তে আপনি কী করতে পারেন এবং ওপেনজিএল ইএসেও কী কাজ করবে তা হ'ল খণ্ড খণ্ডনকারীকে নিয়োগ দেওয়া । ত্রিভুজটিতে তারের ফ্রেম ত্রিভুজের একটি টেক্সচার প্রয়োগ করার কথা ভাবুন। কোনও জমিনের প্রয়োজন না বাদে এটি প্রক্রিয়াগতভাবে উত্পন্ন করা যেতে পারে। তবে যথেষ্ট আলাপ, কোড দিন। টুকরা শেডার:
in vec3 v_barycentric; // barycentric coordinate inside the triangle
uniform float f_thickness; // thickness of the rendered lines
void main()
{
float f_closest_edge = min(v_barycentric.x,
min(v_barycentric.y, v_barycentric.z)); // see to which edge this pixel is the closest
float f_width = fwidth(f_closest_edge); // calculate derivative (divide f_thickness by this to have the line width constant in screen-space)
float f_alpha = smoothstep(f_thickness, f_thickness + f_width, f_closest_edge); // calculate alpha
gl_FragColor = vec4(vec3(.0), f_alpha);
}
এবং ভার্টেক্স শ্যাডার:
in vec4 v_pos; // position of the vertices
in vec3 v_bc; // barycentric coordinate inside the triangle
out vec3 v_barycentric; // barycentric coordinate inside the triangle
uniform mat4 t_mvp; // modeview-projection matrix
void main()
{
gl_Position = t_mvp * v_pos;
v_barycentric = v_bc; // just pass it on
}
এখানে, barycentric স্থানাঙ্ক কেবল হয় (1, 0, 0)
, (0, 1, 0)
এবং (0, 0, 1)
তিনটি ত্রিভুজ ছেদচিহ্ন জন্য (আদেশ, না সত্যিই ব্যাপার ত্রিভুজ পটির মধ্যে সম্ভাব্য সহজ প্যাকিং করে তোলে যা)।
এই পদ্ধতির সুস্পষ্ট অসুবিধা হ'ল এটি কিছু টেক্সচারের স্থানাঙ্কগুলি খাবে এবং আপনাকে আপনার ভার্টেক্স অ্যারেটি সংশোধন করতে হবে। খুব সাধারণ জ্যামিতি শেডার দিয়ে সমাধান করা যেতে পারে তবে আমি এখনও সন্দেহ করতে পারি যে এটি আরও ডেটা সহ জিপিইউ খাওয়ানোর চেয়ে ধীর হবে।
আপনি যদি স্থির পাইপলাইন (ওপেনজিএল <3.3) বা সামঞ্জস্যতা প্রোফাইল ব্যবহার করতে পারেন তবে
//Turn on wireframe mode
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
//Draw the scene with polygons as lines (wireframe)
renderScene();
//Turn off wireframe mode
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
এই ক্ষেত্রে আপনি glLineWidth কল করে লাইন প্রস্থ পরিবর্তন করতে পারেন
অন্যথায় আপনাকে আপনার আঁকার পদ্ধতির অভ্যন্তরে বহুভুজ মোড পরিবর্তন করতে হবে (glDrawElements, glDrawArrays, ইত্যাদি) এবং আপনি কিছু মোটামুটি ফলাফল নিয়ে আসতে পারেন কারণ আপনার ভার্টেক্স ডেটা ত্রিভুজগুলির জন্য এবং আপনি লাইন আউটপুট করছেন। সেরা ফলাফলের জন্য জ্যামিতি শেডার ব্যবহার করা বা তারের ফ্রেমের জন্য নতুন ডেটা তৈরি করা বিবেচনা করুন ।
সবচেয়ে সহজ উপায় হ'ল আদিমদের আঁকুন GL_LINE_STRIP
।
glBegin(GL_LINE_STRIP);
/* Draw vertices here */
glEnd();
আধুনিক ওপেনজিএল (ওপেনজিএল 3.2 এবং উচ্চতর) এ আপনি এর জন্য জ্যামিতি শেডার ব্যবহার করতে পারেন:
#version 330
layout (triangles) in;
layout (line_strip /*for lines, use "points" for points*/, max_vertices=3) out;
in vec2 texcoords_pass[]; //Texcoords from Vertex Shader
in vec3 normals_pass[]; //Normals from Vertex Shader
out vec3 normals; //Normals for Fragment Shader
out vec2 texcoords; //Texcoords for Fragment Shader
void main(void)
{
int i;
for (i = 0; i < gl_in.length(); i++)
{
texcoords=texcoords_pass[i]; //Pass through
normals=normals_pass[i]; //Pass through
gl_Position = gl_in[i].gl_Position; //Pass through
EmitVertex();
}
EndPrimitive();
}
বিজ্ঞপ্তি:
layout (line_strip, max_vertices=3) out;
করতেlayout (points, max_vertices=3) out;
অ্যান্টি-অ্যালাইজেড রেন্ডার টার্গেটে অ্যান্টি-অ্যালাইজড লাইনগুলি আঁকার একটি ভাল এবং সহজ উপায় হ'ল pha ০, ১, ১, ০, ০. এর আলফা চ্যানেল মান সহ, 1x4 টেক্সচার সহ 4 পিক্সেল প্রস্থের আয়তক্ষেত্র অঙ্কন করা} , এবং মিপ-ম্যাপিং বন্ধ সহ রৈখিক ফিল্টারিং ব্যবহার করুন। এটি লাইনগুলিকে 2 পিক্সেল ঘন করবে, তবে আপনি বিভিন্ন বেধ জন্য টেক্সচার পরিবর্তন করতে পারেন। এটি ব্যারিমেট্রিক গণনার চেয়ে দ্রুত এবং সহজ।
এই ফাংশনটি ব্যবহার করুন: অকার্যকর glPolygonMode (GLenum মুখ, GLenum মোড);
মুখ: মোডে প্রযোজ্য বহুভুজগুলি নির্দিষ্ট করে। বহুভুজটির সামনের দিকে GL_FRONT এবং তার পিঠের জন্য GL_BACK এবং উভয়ের জন্য GL_FRONT_AND_BACK হতে পারে।
মোড: তিনটি মোড সংজ্ঞায়িত করা হয় এবং মোডে নির্দিষ্ট করা যায়:
GL_POINT: সীমানা প্রান্তের সূচনা হিসাবে চিহ্নিত বহুভুজ শীর্ষগুলি পয়েন্ট হিসাবে আঁকা হয়।
জিএল_লাইন: বহুভুজের সীমানা প্রান্তগুলি রেখাংশ হিসাবে অঙ্কিত। (আপনার লক্ষ্য)
জিএল_ফিল: বহুভুজের অভ্যন্তর পূর্ণ হয়েছে filled
PS: glPolygonMode গ্রাফিক্স পাইপলাইনে রাস্টারাইজেশনের জন্য বহুভুজগুলির ব্যাখ্যা নিয়ন্ত্রণ করে।
আরও তথ্যের জন্য খ্রোনস গোষ্ঠীর ওপেনগিএল রেফারেন্স পৃষ্ঠাগুলি দেখুন: https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glPolygonMode.xhtml
যদি এটি ওপেনজিএল ইএস ২.০ আপনি ব্যবহার করছেন তবে আপনি যে কোনও ড্র অঙ্কন মোড থেকে বেছে নিতে পারেন
GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES,
লাইন আঁকতে,
GL_POINTS
(যদি আপনাকে কেবল শীর্ষ কোণ আঁকার প্রয়োজন হয়), বা or
GL_TRIANGLE_STRIP
, GL_TRIANGLE_FAN
এবংGL_TRIANGLES
ভরাট ত্রিভুজ আঁকতে
আপনার প্রথম যুক্তি হিসাবে
glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices)
অথবা
glDrawArrays(GLenum mode, GLint first, GLsizei count)
কল।