ورود

View Full Version : سوال: بریده شدن اشیا در DX9



hi.alir
جمعه 15 مرداد 1389, 03:35 صبح
چطوری می تونم اشیا رو در DX9 برش بزنم؟ منظورم اینه که، مثلا ما با تابع DrawIndexedPrimitive یه مربع کشیدیم و تو Shader هم یه texture انداختیم روش. حالا مثلا میخوایم این مربع رو از وسط به دو تیکه مساوی به طور افقی تقسیم کنیم. راه حل چیه؟
اگر بخوایم مربع رو هر جوری که دلمون خواست و به هر چند تیکه تقسیم کنیم چی؟ ( مثل اشیا Rising )

amsjavan
جمعه 15 مرداد 1389, 10:08 صبح
به نظر من اون شی رو بیار تو Local Space بعد نقاطی که x مثبت دارند رو از Vertex Buffer حذف کن و تو یه Vertex Buffer دیگه بریز. اینجوری از وسط نصف میشه و دوتا شی داری! البته این کار ممکن هست ترتیب مثلث بندی و Index Buffer رو به هم بزنه که می تونی با یکسری تابع optimize کنی. فکر کنم اگر اون شی از اینترفیس ID3DXMesh باشه چند تا تابع برای برش هم داشته باشه.

hi.alir
جمعه 15 مرداد 1389, 13:18 عصر
نقاطی که x مثبت دارند
اون عمودی میشه :لبخند:
بعد اینی که شما گفتی خیلی مشکلات دیگه داره. همونطور که خودت هم می دونی اشیا با مثلث رسم میشن. اگر من بخوام نقاط رو از یه VB حذف کنم بریزم تو یکی دیگه، سر این قضیه مشکل به وجود میاد! هم واسه VB و هم واسه IB.
یه مشکل دیگه هم موقع انداختن Texture روشون به وجود میاد، البته این زیاد مشکل حادی نیست :لبخند:
من خودم داشتم به این فکر می کردم که از تو PS یه بلایی سرش بیارم :متفکر:
ID3DXMesh اصلا این شی رو نداره. مربع هست، مکعب نیست.

kochol
جمعه 15 مرداد 1389, 18:05 عصر
سلام
می تونی مختصات y ها رو از ورتکس شیدر پاس بدی به پیکسل شیدر و تو پیکسل شیدر کلیپش کنی یا اینکه از clip plane ها استفاده کنی.

VS


float4x4 matViewProjection;

struct VS_INPUT
{
float4 Position : POSITION0;
float2 Texcoord : TEXCOORD0;

};

struct VS_OUTPUT
{
float4 Position : POSITION0;
float2 Texcoord : TEXCOORD0;
float pos: TEXCOORD1;
};

VS_OUTPUT vs_main( VS_INPUT Input )
{
VS_OUTPUT Output;

Output.Position = mul( Input.Position, matViewProjection );
Output.pos = Input.Position.y;
Output.Texcoord = Input.Texcoord;

return( Output );

}






PS


sampler2D baseMap;

struct PS_INPUT
{
float2 Texcoord : TEXCOORD0;
float pos: TEXCOORD1;

};

float4 ps_main( PS_INPUT Input ) : COLOR0
{
clip(Input.pos);
return tex2D( baseMap, Input.Texcoord );

}

hi.alir
جمعه 15 مرداد 1389, 19:46 عصر
می تونی مختصات y ها رو از ورتکس شیدر پاس بدی به پیکسل شیدر و تو پیکسل شیدر کلیپش کنی یا اینکه از clip plane ها استفاده کنی.
سعی کردم، نشد. یا حداقل من نتونستم.

khorzu
شنبه 16 مرداد 1389, 08:58 صبح
با منفی کردن نرمال راس نمی شه ؟:متفکر:

kochol
شنبه 16 مرداد 1389, 09:52 صبح
سعی کردم، نشد. یا حداقل من نتونستم.

من که کدش هم گذاشتم
این کد فقط y های منفی رو در حالت local space حذف می کنه یعنی وقتی مدل رو طراحی می کنی هر چی y منفی داشته باشه حذف می کنه
اگر مقدار منفی به دستور clip بدی اون نقطه رسم نمی شه.

اگه می خواهی مثلا y های کمتر از 2 حذف بشن بنویس


Output.pos = Input.Position.y - 2.0;

hi.alir
شنبه 16 مرداد 1389, 15:42 عصر
اخه فقط این نیست.
فرض کنید که من یک هندوانه دارم. تا وقتی که هندوانه سالم هست، یک Object هست. وقتی می زنی از وسط نصفش می کنی، میشه دو تا Object و دو رفتار گوناگون که هر کدوم هم خواص خاص خودشون رو دارن. مثلا هندوانه کامل 5 کیلو بوده، زدی نصفش کردی میشه دو تا تیکه ی 2.5 کیلویی!
حالا فرض کنید که همون تیکه ها رو هم باز تیکه تیکه کنیم :لبخند:
دقیقا مثل Rising. اگه دیده باشید همه ی Object های توش رو می تونید بزنید تیکه تیکه اش کنید. این جوریم نیست که واسه خودش تصمیم بگیره چطوری تیکه کنه، دقیقا شما بهش می گید و نتیجه چیزی هست که شما انتظار دارید.
حالا البته من فعلا نمی خوام که ببینم Rising چی کار کرده ( گذشته از اینکه دوست دارم بدونم :کف: ). فعلا می خوام همون دو تا تیکه رو واسه یک Object خاص یاد بگیرم. بعدش حالا به کار های دیگه هم می رسم.

kochol
شنبه 16 مرداد 1389, 18:11 عصر
اخه فقط این نیست.
فرض کنید که من یک هندوانه دارم. تا وقتی که هندوانه سالم هست، یک Object هست. وقتی می زنی از وسط نصفش می کنی، میشه دو تا Object و دو رفتار گوناگون که هر کدوم هم خواص خاص خودشون رو دارن. مثلا هندوانه کامل 5 کیلو بوده، زدی نصفش کردی میشه دو تا تیکه ی 2.5 کیلویی!
حالا فرض کنید که همون تیکه ها رو هم باز تیکه تیکه کنیم :لبخند:
دقیقا مثل Rising. اگه دیده باشید همه ی Object های توش رو می تونید بزنید تیکه تیکه اش کنید. این جوریم نیست که واسه خودش تصمیم بگیره چطوری تیکه کنه، دقیقا شما بهش می گید و نتیجه چیزی هست که شما انتظار دارید.
حالا البته من فعلا نمی خوام که ببینم Rising چی کار کرده ( گذشته از اینکه دوست دارم بدونم :کف: ). فعلا می خوام همون دو تا تیکه رو واسه یک Object خاص یاد بگیرم. بعدش حالا به کار های دیگه هم می رسم.

پس یاد گرفتی به من هم یاد بده

SeganX
یک شنبه 17 مرداد 1389, 13:43 عصر
برای این کار باید کمی هندسه فضایی بلد باشی. بعدش به این فکر کنی که چطور میشه سرعت محاسبات مربوطه و انتقال دیتا ها ( vertices, triangles ) رو افزایش داد.
مثلا شاید یکی از راه ها این باشه که یک صفحه فضایی در نظر بگیری که معادلش میشه
ax+by+cz-d=0
که a, b, c ,d پارامتر های یک صفحه تو فضا هستش. با وارد کردن مقادیر x, y, z که مختصات یک نقطه در فضا هستش این نتیجه حاصل میشه:
اگر ax+by+cz-d=0 انوقت نقطه مورد نظر روی صفحه قرار داره.
اگر ax+by+cz-d>0 اوقت نقطه مورد نظر در یک سو و اگر ax+by+cz-d<0 اونوقت نقطه مورد نظر در سمت مخالف ( سمت دیگر ) صفحه قرار داره.
حالا فرص کن که همون هندوانه را میخواهی به دو نیم تقسیم کنی.
می تونی vertex های هندوانه را با این معادله چک کنی و بسته به نوع جواب که مثبت باشه یا منفی دو تا جئومتری بافر جدا از هم درست کنی.
اما راه ساده تر و سریعتر اینه که به index buffer رجوع کنی و مثلث ها رو بکشی بیرون و بعد مرکز هر مثلث رو با این معاده چک کنی و دو دسته index buffer تولید کنی. اینطور نیازی نیست vertex buffer رو lock کنی و بعدش دوباره index buffer بسازی و ازین حرفا.
دیگه بقیش برمیگرده به دیزاین موتور که object هایی داشته باشه که به راحتی بتونی vertex buffer رو براشون مشترک کنی و index buffer های جدا بهشون بدی و در نهایت با world matrix های مختلف رسمشون کنی.