আপনি ওপেনজিএলে ওয়্যারফ্রেম হিসাবে আদিমকে কীভাবে রেন্ডার করবেন?


220

আপনি ওপেনজিএলে ওয়্যারফ্রেম হিসাবে আদিমকে কীভাবে রেন্ডার করবেন?

opengl 

2
আপনি যে ওপেনজিএল সংস্করণটি ব্যবহার করছেন সে সম্পর্কে আরও সুনির্দিষ্ট হন।
ভার্টেক্সওয়াহন

সঙ্গে ModernGL আপনি simpli ব্যবহার করতে পারেন wireframe এর অ্যাট্রিবিউট কনটেক্সট বর্গ
কাজ Szabolcs Dombi

ওয়্যারফ্রেমগুলি আঁকতে GL_LINES ব্যবহার করুন
অক্সাইন

উত্তর:


367
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );

চালু করতে,

glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );

স্বাভাবিক অবস্থায় ফিরে যেতে

নোট করুন যে টেক্সচার-ম্যাপিং এবং লাইটিংয়ের মতো জিনিসগুলি সক্ষম করা থাকলে এখনও তারের ফ্রেম লাইনে প্রয়োগ করা হবে, যা অদ্ভুত দেখাচ্ছে look


2
আমি তোমাকে পছন্দ করি. আরও 4 টি যেতে হবে।
জো সো

37

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);

75
দুটি কল করা নিরর্থক। ব্যবহারের GL_FRONT_AND_BACK
shoosh

6
@ শুশ-এর মন্তব্যে সংযোজন হিসাবে, রেড বুকটিতে বলা হয়েছে যে ওপেনজিএল ৩.১ এবং তার থেকে GL_FRONT এবং GL_BACK অবমূল্যায়ন এবং সরানো হয়েছে। এখন, আপনি এখনও এটি সামঞ্জস্যতা এক্সটেনশনের মাধ্যমে ব্যবহার করতে পারেন, তবে আপনার যদি ফরোয়ার্ড-সামঞ্জস্যপূর্ণ এবং পশ্চাদপট-সামঞ্জস্যপূর্ণ কোনও বিকল্প থাকে, তবে আমি প্রাক্তন হয়ে যাওয়ার পরামর্শ দেব।
চৌকিক

1
এই উত্তরটি লিংকে 404. ফেরৎ
Ondrej Slinták

1
@ ওেন্ড্রেজস্লিন্টাক এটি এখন ঠিক।
ম্যাক্সিমাউস

24

ওপেনজিএল 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)তিনটি ত্রিভুজ ছেদচিহ্ন জন্য (আদেশ, না সত্যিই ব্যাপার ত্রিভুজ পটির মধ্যে সম্ভাব্য সহজ প্যাকিং করে তোলে যা)।

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


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

2
অবশ্যই আছে। আপনি কারও স্ট্যাকওভারফ্লো . com/ প্রশ্নস / 666১82৫২ / এ একই ধারণা বাস্তবায়নের উল্লেখ করতে পারেন ।
সোয়াইন

1
আপনার প্রস্তাবিত বাস্তবায়নটি ব্যবহার করার চেষ্টা করার ক্ষেত্রে আমি যে সমস্যাটি চালাচ্ছি তা হ'ল, আমি মনে করি, শেডারটি কখনই অবজেক্টের বাইরে অঙ্কিত হবে না বলে উল্লেখ করা যেতে পারে। সুতরাং এটিরূপরেখাটি কি রূপরেখা তৈরি করবে? অন্য কথায়, বাহ্যরেখাটি আঁকতে মূল বস্তুর মধ্যে খাঁটিভাবে অন্তর্ভুক্ত থাকবে?
ব্যবহারকারী 1167662

1
@ ব্রুনো লেভী আপনি কি ওয়েবজিএলে আরও সমন্বিত হতে পারেন, না? আপনি যদি ভাগ্যবান হন তবে আপনার কাছে খুব সাধারণ মডেল থাকলে আপনি টেক্সকর্ডগুলি থেকে এই সমন্বয়গুলি পেতে সক্ষম হতে পারেন তবে অন্যথায় আপনার কেবল নতুন স্থানাঙ্ক যুক্ত করতে হবে। এটি ছাড়া এটি কাজ করে খুব সুন্দর হবে :)। আপনার যা দরকার তা হ'ল ভার্টেক্স প্রতি একক স্কেলার (এবং তারপরে এটি ভার্টেক্স শ্যাডারে 3-ভেক্টর প্রসারিত)।
সোয়াইন

2
আহ, এখন আমি দেখছি ... f_width () আমার বন্ধু, এই ক্ষেত্রে। ধন্যবাদ
নীল গ্যাটেনবি

5

আপনি যদি স্থির পাইপলাইন (ওপেনজিএল <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, ইত্যাদি) এবং আপনি কিছু মোটামুটি ফলাফল নিয়ে আসতে পারেন কারণ আপনার ভার্টেক্স ডেটা ত্রিভুজগুলির জন্য এবং আপনি লাইন আউটপুট করছেন। সেরা ফলাফলের জন্য জ্যামিতি শেডার ব্যবহার করা বা তারের ফ্রেমের জন্য নতুন ডেটা তৈরি করা বিবেচনা করুন ।


3

সবচেয়ে সহজ উপায় হ'ল আদিমদের আঁকুন GL_LINE_STRIP

glBegin(GL_LINE_STRIP);
/* Draw vertices here */
glEnd();

এটি যদি GL_TRIANGLES এর গোছা না হয়: আপনি তাদের মধ্যে লাইন পাবেন। ওপেনজিএল 1.x বা লিগ্যাসিতে আপনি গ্লোপলিগনমড ব্যবহার করেন। সাম্প্রতিক ওপেনজিএলে আপনি জ্যামিতি শেডার দিয়ে খেলবেন।
ফ্যাব্রিস নাইরেট

এটি এমন কাজ করার একটি প্রাচীন পদ্ধতি যা পিছনে ফেলে রাখা দরকার।
বেনি ম্যাকনি

2

আধুনিক ওপেনজিএল (ওপেনজিএল 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();
}

বিজ্ঞপ্তি:


1

আপনি এই জাতীয় পেটুক গ্রন্থাগার ব্যবহার করতে পারেন:

  1. একটি গোলকের জন্য:

    glutWireSphere(radius,20,20);
    
  2. সিলিন্ডারের জন্য:

    GLUquadric *quadratic = gluNewQuadric();
    gluQuadricDrawStyle(quadratic,GLU_LINE);
    gluCylinder(quadratic,1,1,1,12,1);
    
  3. একটি কিউব জন্য:

    glutWireCube(1.5);
    

0

অ্যান্টি-অ্যালাইজেড রেন্ডার টার্গেটে অ্যান্টি-অ্যালাইজড লাইনগুলি আঁকার একটি ভাল এবং সহজ উপায় হ'ল pha ০, ১, ১, ০, ০. এর আলফা চ্যানেল মান সহ, 1x4 টেক্সচার সহ 4 পিক্সেল প্রস্থের আয়তক্ষেত্র অঙ্কন করা} , এবং মিপ-ম্যাপিং বন্ধ সহ রৈখিক ফিল্টারিং ব্যবহার করুন। এটি লাইনগুলিকে 2 পিক্সেল ঘন করবে, তবে আপনি বিভিন্ন বেধ জন্য টেক্সচার পরিবর্তন করতে পারেন। এটি ব্যারিমেট্রিক গণনার চেয়ে দ্রুত এবং সহজ।


0

এই ফাংশনটি ব্যবহার করুন: অকার্যকর 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


-1

যদি এটি ওপেনজিএল ইএস ২.০ আপনি ব্যবহার করছেন তবে আপনি যে কোনও ড্র অঙ্কন মোড থেকে বেছে নিতে পারেন

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) কল।

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