تمام سوالات سوالات بدون پاسخ سوال بپرسید

من قصد استفاده از opengl را در یک برنامه اندروید دارم و باید به عنوان یک متد ابتدایی از glVertexPointer استفاده کنم.معمولا آرگومان سوم این متد را 0 قرار می دهند.می خواستم بدانم این آرگومان چه کاربردی دارد،یعنی چه چیزی را تعیین می کند؟

2 پاسخ

تابع glVertexPointer بصورت زیر تعریف میشه:

void glVertexPointer(GLint  size, 
                     GLenum  type,
                     GLsizei  stride,
                     const GLvoid *  pointer);

پارامتر اول تعداد مختصات رو بازای هر نقطه بیان میکنه. مقدارش میتونه 2، 3 و یا 4 باشه. معمولا چون در محیط سه بعدی کار میکنیم، مقدارش رو 3 قرار میدیم.
پارامتر دوم نوع عدد هایی که میخواهیم وارد کنیم را مشخص میکند. مثلا اگر میخواهید از اعداد Float استفاده کنید، مقدارش رو GL_FLOAT قرار بدید. مقادیر ممکن برای اون GL_SHORT، GL_INT، GL_FLOAT، GL_DOUBLE است.
پارامتر سوم فاصله بین هر نقطه در آرایه ورودی است. اجازه بدید این مورد رو بعد از بیان پارامتر چهارم بیشتر بازش کنم
پارامتر چهارم یک اشاره گر به اولین مختص مربوط به اولین نقطه در آرایه است.

GlFloat myVertices[] = {1.1, 2.1, 5.1,      //First Vertex
                        2.3, 7.1, 6.5       //Second Vertex
                       };
glVertexPointer(3, GL_FLOAT, 0, myVertices);

در این مثال، ما یک آرایه از نوع GlFloat درست کردیم (به نام myVertices) و مختصات هر نقطه رو درون اون قرار دادیم. (به ترتیب از چپ به راست x و y و z). یعنی مختصات مربوط به دو نقطه را داده ایم.
در خط بعد تابع glVertexPointer را فراخوانی کردیم. چون مختصات سه بعدی مد نظر ما بود، پارامتر اول را 3 قرار دادیم؛ چون نوع داده ما Float بود پارامتر دوم را GL_FLOAT قرار دادیم؛ چون مختصات یکی یکی درون آرایه و پشت سر هم قرار گرفته اند، مقدار پارامتر سوم را 0 قرار دادیم. (به طور قرار دادی 0 برای آرایه ای به کار میرود که همه مختصات رو پشت سر هم قرار میده)؛ مقدار پارامتر چهارم همان آرایه ما است که داده های مختصات رو به تابع میده.
تصور کنین که ما بخواهیم داده های مربوط به رنگ رو هم توی یک آرایه کنار مختصات نقطه قرار بدیم. دقت کنید که پارامتر سوم چطور تغییر میکنه:

GlFloat myVerticesData[] = {1.1, 2.1, 5.1,     //First vertex coordinates (x, y, z)
                           255.0, 233.0, 187.0 //First vertex color (r, g, b)    
                           2.3, 7.1, 6.5,      //Second vertex coordinates(x, y, z)
                           155.0, 145.0, 123.0 //Second vertex color (r, g, b)
                           };
glVertexPointer(3, GL_FLOAT, 3*sizeof(GlFloat), myVerticesData);

در این مثال ما داده ها مربوط به رنگ نقطه رو در کنار مختصاتش قرار دادیم. (صرف نظر از اینکه برنامه نویسی احتمالا به این صورت کد نمیزنه!). بنابراین باید برای OpenGL مشخص کنیم که مختصات هر نقطه سه GlFloat در میان است، مقدار پارامتر سوم را معادل 3 مقدار GlFloat قرار دادیم. بدین ترتیب تابع glVertexPointer مقدار سه GlFloat را به عنوان سه مختص نقطه خوانده و سپس به اندازه سه GlFloat پرش میکنه تا به ابتدای مقادیر مختصات نقطه بعدی برسه.
نکته: انواع داده ای مورد استفاده توسط OpenGL توسط خودش پیاده سازی شده. یعنی برای نوع داده int مقدار معادل آن GlInt و برای float مقدار معادل آن GlFloat است. اینکار برای اینه که در پیاده سازی های مختلف ناسازگاری احتمالی وجود نداشته باشه. (مثلا احیانا طول داده float در سیستم های متفاوت، متفاوت نباشه)

اگر قدری طولانی بیان شد عذر خواهی میکنم.
منابع:
سایت مرجع OpenGL
Code-Project
GameDev
موفق باشید

1

دوست عزیز،در مورد اینکه گفته اید:"برنامه نویسی احتمالا به این صورت کد نمیزنه!" من فکر می کنم ممکن است در مواردی این کار انجام شود،مثلا در صورتی که یک تعدادی از نقاط در راس چند شکل متفاوت قرار داشته باشند و نخواهیم اطلاعات مربوط به رنگ و مختصات و ... را در مورد آنها چند بار بیاوریم.نمونه ساده آن تلاش برای رسم یک مکعب با استفاده از ترسیم مثلث ها است.(http://www.songho.ca/opengl/gl_vertexarray.html)

(12 آوریل '12, 09:07) hasanghaforian

آرگومان سوم برای مشخص کردن گام به کار می رود.شما به عنوان پارامتر چهارم متد glVerTexPointer یک آرایه به کار می برید که شامل اطلاعات مختصات نقاط می باشد.اما ممکن است که شما به همراه اطلاعات مربوط به مختصات هر راس،اطلاعات دیگری(مثلا رنگ و ...)را نیز در آرایه وارد کرده باشید.در اینجا باید به OpenGL اطلاع دهید که پس از خواندن اطلاعات مربوط به مختصات هر راس،گامی به چه طول بردارد که به مختصات راس بعدی در آن آرایه برسد.به طور معمول ما این کار را انجام نمی دهیم ولی اگر به دنبال مثالی در این مورد هستید می توانید به این آدرس مراجعه نمایید.
منبع:
songho

toggle preview



آموزش زبان برنامه نویسی C#
آموزش jquery
آموزش برنامه نویسی
آموزش طراحی وبسایت
آموزش مدیریت وبسایت
آموزش جاوا Java
آموزش پایتون Python
آموزش سی شارپ C#‎
آموزش HTML و CSS
آموزش JavaScript جاوااسکریپت
آموزش jQuery جی کوئری
آموزش ساخت ربات تلگرام
آموزش برنامه‌نویسی PHP
آموزش برنامه‌نویسی اندروید
● آموزش‌های رایگان

سوالات مرتبط

راهنمای استفاده از ویرایشگر
  • *ایتالیک*‌ یا __ایتالیک__
  • **ضخیم** یا __ضخیم__
  • آدرس:[متن](http://url.com/ "عنوان")
  • عکس?![alt متن](/path/img.jpg "عنوان")
  • لیست عددی: 1. Foo 2. Bar
  • برای رفتن به خط بعد، هر جا مایلید که خط جدید شروع شود دو کاراکتر فاصله (space) قرار دهید
  • تگ‌های ساده HTML هم پشتیبانی می‌شوند

تگها:
  • ×364
  • ×20
  • ×1
  • پرسیده شده: 09 آوریل '12, 14:01
  • بازدید: 2,874 بار
  • آخرین بروزرسانی: 15 آوریل '12, 08:58

این سوال را دنبال کنیدتوسط ایمیل: ایمیل شما (باید معتبر باشد, هرگز به دیگران نمایش داده نمیشود):

هنگامی که شما به سیستم وارد شوید،قادر خواهید بود برای بروز رسانی ها مشترک شوید.


توسط RSS:

پاسخها

پاسخها و نظرها