ورود

View Full Version : Geometry shader



pswin.pooya
شنبه 21 فروردین 1389, 19:37 عصر
امروز بعد از کلی دردسر تونستم یه شیدر هندسی (geometry) برای ویرایش OpenGL 3.2 بنویسم.
فکر نوشتن این شیدر از روی یه مقاله که picking رو به کمک این شیدرها بررسی کرده بود به سرم زد. شروع کردم به نوشتن شیدر اما نیجتا کامپایل نشد بعد از کلی دردسر که کامپایل شد. هیچی نشون نداد و بعد از یک روز سر و کله متوجه شدم که تقریبا کل گرامر این نوع شیدر مثل بقیه انواع داخل OpenGL 3.x بهم ریخته و دیگه مثل OpenGL 2.1 نیستش. پس کل کد رو اصلاح کردم و بعد از سرو کله زدن داخل فروم ها ویکی ها تونستم بالاخره این شیدر ساده رو نویسم که هر شکلی رو بگیره 6 تا از روش تولید میکنه. مثلا اینجا یه مثلث میگیره و 6 تا مثلث تولید میکنه.

این ساده ترین شیدر ممکن به شمار میره و حکم hello world داره و هدف از قرار دادن اون اینجا تنها یک راهنمایی ساده برای کسانی هست که هنوز از این نوع شیدر استفاده نکردن (حداقل تحت OpenGL 3.2)

کد شیدر:

#version 150

layout(triangles) in;

layout(triangle_strip, max_vertices = 36) out;


uniform mat4 in_ModelViewMatrix;

in vec2 geo_tex_coord[3];

out vec2 tex_coord;


void main(void)
{

//increment variables
int i,j;

for ( j =0 ; j < 3;j++ )
{
for(i=0; i< gl_in.length() ; i++)
{
gl_Position = in_ModelViewMatrix * (gl_in[i].gl_Position + vec4(j * .5,0,0,0));

tex_coord = geo_tex_coord[i];
EmitVertex();
}
EndPrimitive();
}

for ( j =0 ; j < 3;j++ )
{
for(i=0; i< gl_in.length() ; i++)
{
gl_Position = in_ModelViewMatrix * (gl_in[i].gl_Position + vec4(j * .5,-0.5,0,0));

tex_coord = geo_tex_coord[i];
EmitVertex();
}
EndPrimitive();
}

} // main

تابع EndPrimitive شکل رو تکمیل میکنه و تابع EmitVertex ورتکس واردی رو برای شکل ثبت میکنه. متغییر gl_in هم ورتکس ورودی واطلاعات اون رو نگه میداره. و layot ها هم نوع شکل ورودی/ خروجی و بیشترین تعداد ورتکسهای خروجی رو مشخص میکنه که اینجا 36 تا هستش.

باز هم یکسری مثال (مثلا برای reduce کردن ) دیگه رو بعد از اینکه نوشتم قرار میدم.

نکته: شیدر بالا فقط با OpenGL 3.2+ کار میکنه. و احتمال کار کردنش با ویرایش های پایین تر وجود نداره. (مگر اینکه درایور از OpenGL 3.2 به بعد ساپورت کنه)