ضمیمههای فضاها، ماتریسها و خلاصهٔ توابع OpenGL
ضمیمه B — فضاها
گرافیک رایانهای با نمایش و دستکاری مجموعههایی از عناصر هندسی مانند نقطهها و پارهخطها سروکار دارد. ریاضیات لازم برای این کار در مطالعهٔ گونههای مختلف فضاهای انتزاعی یافت میشود. در این ضمیمه قواعد سه فضا را مرور میکنیم: فضای برداری خطی، فضای affine و فضای Euclidean. فضای برداری فقط اسکالر و بردار دارد؛ فضای affine عنصر سومی، یعنی نقطه، را اضافه میکند و فضای Euclidean مفهوم فاصله را نیز وارد میکند.
بردارهای مهم در گرافیک رایانهای شامل پارهخطهای جهتدار و n-تاییهای عددی برای نمایش آنها هستند. در ضمیمه C جبر ماتریسی را برای دستکاری n-تاییها بررسی میکنیم. بهتر است اسکالر، بردار و نقطه را مانند abstract data type و اصول موضوعه را مانند تعریف عملیات مجاز روی این نوعها در نظر بگیریم.
B.1 اسکالرها
اعداد حقیقی با عملهای معمول جمع و ضرب نمونهای از یک scalar field هستند. مجموعهٔ S را از عناصر اسکالر α, β, ... در نظر بگیرید. دو عمل بنیادی جمع + و ضرب · بین زوج اسکالرها تعریف میشوند و بستهاند. برای هر α,β,γ∈S:
\alpha+\beta=\beta+\alpha,\qquad \alpha\beta=\beta\alpha,
\alpha+(\beta+\gamma)=(\alpha+\beta)+\gamma,
\alpha(\beta\gamma)=(\alpha\beta)\gamma,
\alpha(\beta+\gamma)=\alpha\beta+\alpha\gamma.
اگر ابهامی نباشد، بهجای α·β میتوان αβ نوشت.
دو اسکالر ویژه وجود دارد: همانی جمعی 0 و همانی ضربی 1، بهطوریکه برای هر α:
\alpha+0=\alpha,\qquad \alpha\cdot1=\alpha.
هر α معکوس جمعی -α و، برای عنصر غیرصفر، معکوس ضربی α^{-1} دارد:
\alpha+(-\alpha)=0,\qquad \alpha\alpha^{-1}=1.
اعداد حقیقی، اعداد مختلط و تابعهای گویا با عملیات معمول نمونههایی از scalar field هستند.
B.2 فضاهای برداری
فضای برداری علاوه بر اسکالر، بردار دارد. دو عمل اصلی آن جمع بردار–بردار و ضرب اسکالر–بردار است. اگر u,v,w∈V باشند، جمع بردار بسته، جابجایی و شرکتپذیر است:
u+v=v+u,\qquad u+(v+w)=(u+v)+w.
بردار صفر 0 و معکوس جمعی -u نیز تعریف میشوند:
u+0=u,\qquad u+(-u)=0.
برای اسکالر α، حاصل αu نیز در V است و توزیعپذیری برقرار است:
\alpha(u+v)=\alpha u+\alpha v,\qquad (\alpha+\beta)u=\alpha u+\beta u.
شکل B.1 — پارهخطهای جهتدار.
در مثال پارهخط جهتدار، ضرب اسکالر طول بردار را تغییر میدهد اما جهت را، جز در علامت، حفظ میکند. جمع بردار با اصل head-to-tail تعریف میشود: انتهای u را به ابتدای v متصل میکنیم و بردار حاصل u+v است.
شکل B.2 — ضرب اسکالر–بردار.
شکل B.3 — اصل head-to-tail.
نمونهٔ مهم دیگر، فضای n-تاییهای اسکالر است:
v=(v_1,v_2,\ldots,v_n).
جمع و ضرب اسکالر مؤلفهبهمؤلفهاند:
u+v=(u_1+v_1,\ldots,u_n+v_n),\qquad \alpha v=(\alpha v_1,\ldots,\alpha v_n).
برای اسکالرهای حقیقی این فضا را R^n مینامیم.
مفاهیم استقلال خطی و basis بنیادیاند. ترکیب خطی n بردار عبارت است از:
u=\alpha_1u_1+\cdots+\alpha_nu_n.
اگر تنها راه رسیدن به بردار صفر این باشد که همهٔ ضرایب صفر باشند، بردارها linearly independent هستند. بیشترین تعداد بردار مستقل خطی، dimension فضا را میدهد. در فضای n-بعدی هر n بردار مستقل یک basis میسازند و هر بردار نمایش یکتایی نسبت به basis دارد.
اگر v_1,...,v_n یک basis و v'_1,...,v'_n basis دیگری باشند، بردار یکسان با دو مجموعه ضریب نمایش داده میشود و ماتریس n×nای وجود دارد که یک نمایش را به دیگری تبدیل میکند. پس پس از انتخاب basis میتوان محاسبات فضای انتزاعی را به محاسبات روی n-تاییها و ماتریسها کاهش داد.
B.3 فضاهای Affine
فضای برداری مفهوم مکان ندارد. بردار هندسی اندازه و جهت دارد، اما موقعیت ندارد؛ بنابراین دو پارهخط جهتدار هماندازه و همجهت در مکانهای مختلف همان بردارند.
شکل B.4 — بردارهای یکسان.
برای حل این مسئله، فضای affine علاوه بر اسکالر و بردار، نقطه را نیز وارد میکند. میتوان نقطه و بردار را با هم جمع کرد تا نقطهٔ جدیدی بهدست آید، و تفاضل دو نقطه یک بردار است. اصل head-to-tail برای نقاط به شکل زیر نوشته میشود:
(P-Q)+(Q-R)=P-R.
یک frame از یک نقطهٔ مرجع P0 و basis برداری v1,...,vn تشکیل میشود. هر بردار و نقطه بهصورت یکتا نوشته میشوند:
v=\alpha_1v_1+\cdots+\alpha_nv_n,
P=P_0+\beta_1v_1+\cdots+\beta_nv_n.
ضرایب αi نمایش بردار و ضرایب βi نمایش نقطهاند. P0 نقش origin frame را دارد. در گرافیک رایانهای تغییر frame اهمیت زیادی دارد، زیرا اشیا ممکن است در frame فیزیکی تعریف شوند اما برای تشکیل تصویر بهتر است نسبت به frame دوربین نمایش داده شوند.
B.4 فضاهای Euclidean
فضای affine برای مدلسازی هندسی کافی است، اما هنوز مفهوم طول بردار یا فاصلهٔ دو نقطه را ندارد. فضای Euclidean با افزودن inner product (dot product) این مفهوم را فراهم میکند. برای بردارهای u,v,w و اسکالرهای α,β:
u\cdot v=v\cdot u,
(\alpha u+\beta v)\cdot w=\alpha(u\cdot w)+\beta(v\cdot w),
v\cdot v>0\quad(v\neq0),\qquad 0\cdot0=0.
اگر u·v=0 باشد، دو بردار orthogonal هستند. طول بردار و فاصلهٔ دو نقطه از رابطههای زیر بهدست میآیند:
|v|=\sqrt{v\cdot v},\qquad |P-Q|=\sqrt{(P-Q)\cdot(P-Q)}.
همچنین زاویهٔ دو بردار با
u\cdot v=|u||v|\cos\theta
تعریف میشود.
B.5 Projection
مفهوم projection از یافتن کوتاهترین فاصلهٔ یک نقطه تا خط یا صفحه ناشی میشود. اگر بخواهیم w را به مؤلفهای موازی v و مؤلفهای عمود بر v تجزیه کنیم، مینویسیم:
w=\alpha v+u,
که u·v=0 است. بنابراین:
w\cdot v=\alpha(v\cdot v),
و در نتیجه:
\alpha=\frac{w\cdot v}{v\cdot v}.
پس projection بردار w روی v برابر است با
\operatorname{proj}_v(w)=\frac{w\cdot v}{v\cdot v}v,
و بخش عمود:
u=w-\frac{w\cdot v}{v\cdot v}v.
شکل B.7 — Projection یک بردار روی بردار دیگر.
B.6 عمودسازی Gram-Schmidt
از basis دلخواه a1,...,an در فضای n-بعدی میتوان basis دیگری b1,...,bn ساخت که orthonormal باشد:
b_i\cdot b_j=\begin{cases}1&i=j\\0&i\ne j.\end{cases}
ابتدا برداری از شکل
b_2=a_2+\alpha b_1
میخواهیم که بر b1 عمود باشد. شرط b2·b1=0 میدهد:
\alpha=-\frac{a_2\cdot b_1}{b_1\cdot b_1},
پس:
b_2=a_2-\frac{a_2\cdot b_1}{b_1\cdot b_1}b_1.
در گام عمومی:
b_k=a_k+\sum_{i=1}^{k-1}\alpha_i b_i,
\qquad
\alpha_i=-\frac{a_k\cdot b_i}{b_i\cdot b_i}.
در پایان یا در هر مرحله بردارها را normalize میکنیم.
منابع پیشنهادی و تمرینها
برای دیدگاه مبتنی بر vector space و linear algebra، منابع [Bow83] و [Ban83] مناسباند؛ برای توسعهٔ هندسی affine space نیز [Fol90] را ببینید.
B.1 ثابت کنید اعداد مختلط یک scalar field میسازند و همانیهای جمعی و ضربی را مشخص کنید.
B.2 ثابت کنید تابعهای گویا scalar field هستند.
B.3 ثابت کنید تابعهای گویا با ضرایب حقیقی یک vector space میسازند.
B.4 ثابت کنید تعداد عناصر یک basis یکتا است.
B.5 برای مجموعهٔ n تابع حقیقی {fi(x)} یک vector space از تابعها بسازید و basis و dimension آن را تعریف کنید.
B.6 نشان دهید polynomialهای با درجهٔ حداکثر n یک vector space متناهیبعدی میسازند.
B.7 در R^n جمع بردار و ضرب اسکالر–بردار را تعریف و dot product را مشخص کنید.
B.8 اگر سه بردار در R^3 داده شود، چگونه تشخیص میدهید basis میسازند؟
B.9 نشان دهید (1,0,0)، (1,1,0) و (1,1,1) مستقل خطیاند و با شروع از (1,0,0) از آنها یک basis orthonormal بسازید.
این صفحه در نسخهٔ اصلی عمداً خالی است.
ضمیمه C — ماتریسها
در گرافیک رایانهای کاربرد اصلی ماتریسها نمایش تغییر coordinate system و frame است. در linear algebra اصطلاح vector گاهی به row/column matrix گفته میشود، اما در این کتاب «بردار» برای پارهخط جهتدار یا عنصر انتزاعی vector space رزرو شده و برای آرایههای یکسطر/یکستون از row matrix و column matrix استفاده میکنیم.
تقریباً همیشه با ماتریسهای 4×4 سروکار داریم؛ بنابراین بسیاری از الگوریتمهای عمومی ماتریس اهمیت کمتری دارند و وارونسازی 4×4 اغلب مستقیماً در نرمافزار یا سختافزار پیادهسازی میشود.
C.1 تعریفها
ماتریس، آرایهای n×m از اسکالرها در n سطر و m ستون است. اگر m=n باشد ماتریس square با dimension n است. عناصر ماتریس A را با {aij} نشان میدهیم:
A=[a_{ij}].
transpose ماتریس n×m با جابهجایی سطر و ستون ساخته میشود:
A^T=[a_{ji}].
ماتریسهای n×1 و 1×m بهترتیب column matrix و row matrix هستند. column matrix را با حروف کوچک مانند b=[bi] نشان میدهیم و transpose آن یک row matrix است.
C.2 عملیات ماتریسی
سه عمل اصلی عبارتاند از scalar–matrix multiplication، matrix addition و matrix multiplication.
\alpha A=[\alpha a_{ij}].
برای دو ماتریس هماندازه:
C=A+B=[a_{ij}+b_{ij}].
اگر A ابعاد n×l و B ابعاد l×m داشته باشد:
C=AB=[c_{ij}],\qquad c_{ij}=\sum_{k=1}^{l}a_{ik}b_{kj}.
ضرب ماتریسی وقتی تعریف میشود که تعداد ستونهای A با تعداد سطرهای B برابر باشد. میگوییم A، B را premultiply یا B، A را postmultiply میکند.
جمع ماتریسی جابجایی و شرکتپذیر است:
A+B=B+A,\qquad A+(B+C)=(A+B)+C.
ضرب ماتریسی شرکتپذیر است:
A(BC)=(AB)C,
اما تقریباً هرگز جابجایی نیست؛ معمولاً AB≠BA. این موضوع در گرافیک مهم است، زیرا ترتیب transformationها نتیجه را تغییر میدهد. rotation سپس translation با translation سپس rotation یکسان نیست.
ماتریس همانی I روی قطر مقدار ۱ و در جای دیگر ۰ دارد و، در ابعاد سازگار:
AI=A,\qquad IB=B.
C.3 Row Matrix و Column Matrix
نقطه یا بردار سهبعدی را میتوان نسبت به یک frame با column matrix نمایش داد:
p=\begin{bmatrix}x\\y\\z\end{bmatrix},\qquad p^T=[x\ y\ z].
اگر ماتریس square A یک transformation باشد:
p'=Ap.
و زنجیرهٔ transformationها به شکل
p'=ABCp
نوشته میشود. چون ضرب ماتریسی associative است پرانتز لازم نیست. در نمایش row matrix با استفاده از
(AB)^T=B^TA^T
همان زنجیره به شکل
p'^T=p^TC^TB^TA^T
درمیآید. بیشتر ادبیات علمی از column matrix استفاده میکند و این کتاب نیز همان قرارداد را ترجیح میدهد؛ هنگام استفاده از API باید قرارداد آن را دقیق دانست.
C.4 Rank و وارونپذیری
اگر
q=Ap,
میخواهیم بدانیم آیا ماتریس B وجود دارد که p=Bq باشد. اگر
BA=I,
آنگاه B=A^{-1} و A nonsingular است. ماتریس غیرقابلوارون singular است. وارون ماتریس square دقیقاً زمانی وجود دارد که determinant آن غیرصفر باشد.
محاسبهٔ determinant و inverse برای ماتریس عمومی n×n از مرتبهٔ O(n^3) است، اما در گرافیک ابعاد کوچکاند. مفهوم rank تعداد سطرها/ستونهای مستقل خطی را بیان میکند. ماتریس square دقیقاً وقتی nonsingular است که rank کامل داشته باشد.
C.5 تغییر نمایش
فرض کنید یک بردار نسبت به دو basis متفاوت نمایشهای a و b دارد. تغییر basis را میتوان با ماتریس M نوشت:
b=Ma.
ستونهای M از نمایش بردارهای basis قدیم در basis جدید ساخته میشوند. ماتریس تبدیل معکوس M^{-1} است. بنابراین تغییر coordinate system یک linear transformation روی مختصات است، نه تغییر خود شیء هندسی.
اگر transformation هندسی T در یک basis با ماتریس A نمایش داده شود و basis را با ماتریس M عوض کنیم، نمایش همان transformation در basis جدید از یک similarity transformation بهدست میآید:
A'=MAM^{-1}
یا بسته به قرارداد جهت تغییر basis، فرم معادل M^{-1}AM. این رابطه توضیح میدهد چرا transformation و تغییر نمایش باید از هم تفکیک شوند.
C.6 Cross Product
در R^3 برای دو بردار u و v، cross product برداری عمود بر هر دو است:
u\times v=
\begin{bmatrix}
u_2v_3-u_3v_2\u_3v_1-u_1v_3\u_1v_2-u_2v_1
\end{bmatrix}.
اندازهٔ آن:
|u\times v|=|u||v||\sin\theta|,
و جهت با قاعدهٔ دست راست تعیین میشود. cross product جابجایی نیست:
u\times v=-(v\times u).
C.7 Eigenvalue و Eigenvector
ماتریس square یک operator است که column matrix را به column matrix همبعد تبدیل میکند. میپرسیم چه زمانی
Mu=\lambda u
برای u≠0 برقرار است. چنین uای eigenvector و λ eigenvalue است. با بازنویسی:
(M-\lambda I)u=0.
راهحل غیرصفر زمانی وجود دارد که
|M-\lambda I|=0.
برای ماتریس n×n determinant یک polynomial درجهٔ n در λ میدهد. برای هر eigenvalue متمایز میتوان eigenvector متناظر یافت؛ چندبرابر هر eigenvector نیز eigenvector است و میتوان آن را unit length کرد. eigenvectorهای مربوط به eigenvalueهای متمایز linearly independent هستند.
هر rotation matrix نقطه/محور ثابت خود را بدون تغییر نگه میدارد و بنابراین eigenvalue برابر ۱ دارد.
اگر T nonsingular و
Q=T^{-1}MT,
باشد، Q و M similar هستند و eigenvalueهای یکسان دارند. eigenvectorهای آنها نیز با T به هم مرتبطاند. بنابراین تغییر coordinate system ویژگیهای بنیادی مانند eigenvalue را عوض نمیکند.
تفسیر هندسی: ellipsoid هممرکز با مبدأ و همراستا با محورهای مختصات را میتوان با
\lambda_1x^2+\lambda_2y^2+\lambda_3z^2=1
نوشت. λ1,λ2,λ3 eigenvalueهای ماتریس قطری و با طول محورهای ellipsoid مرتبطاند. با rotation دستگاه مختصات، جهت ellipsoid تغییر میکند ولی طول محورهای آن ثابت میماند.
C.8 کلاسهای Vector و Matrix
چون GLSL اصطلاح vector را برای آرایههای مؤلفهای بهکار میبرد، نمونههای کتاب کلاسهای C++ جداگانهای برای vector و matrix دارند که در vector.h و matrix.h تعریف و از Angel.h وارد میشوند.
کلاس vector نوعهای vec2، vec3 و vec4، operatorهای حسابی overload شده، constructorهای لازم و تابعهای normalization، cross product، dot product و length را فراهم میکند. کلاس matrix از mat2، mat3 و mat4 پشتیبانی میکند و عملیات ماتریس–ماتریس و ماتریس–بردار را overload میکند. همچنین بسیاری از تابعهای transformation/viewing نسخههای قدیمی OpenGL مانند Rotate، Scale، Translate، Ortho، Frustum و LookAt را ارائه میدهد.
منابع پیشنهادی
از منابع استاندارد linear algebra میتوان Strang [Str93] و Banchoff و Werner [Ban83] را نام برد؛ Rogers و Adams [Rog90] و مجموعهٔ Graphics Gems نیز مفیدند. بحث row در برابر column matrix تاریخی است؛ کتابهای قدیمیتر اغلب row matrix و منابع جدیدتر غالباً column matrix را ترجیح میدهند.
تمرینها
C.1 در R^3 ماتریسهای تغییر نمایش میان basis {(1,0,0),(1,1,0),(1,1,1)} و basis استاندارد را بیابید و نشان دهید معکوس یکدیگرند.
C.2 در فضای polynomialهای درجهٔ حداکثر ۲ نشان دهید {1,x,x^2} و {1,1+x,1+x+x^2} هر دو basis هستند؛ نمایش 1+2x+3x^2 و ماتریس تبدیل را بیابید.
C.3 نشان دهید cross product در R^3 با determinant رسمی شامل i,j,k و مؤلفههای u,v بهدست میآید.
C.4 ثابت کنید |u×v|=|u||v||sinθ|.
C.5 eigenvalueها و eigenvectorهای ماتریس rotation دوبعدی را پیدا کنید:
R=\begin{bmatrix}\cos\theta&-\sin\theta\\\sin\theta&\cos\theta\end{bmatrix}.
C.6 همین کار را برای rotation سهبعدی حول محور z انجام دهید:
R=\begin{bmatrix}
\cos\theta&-\sin\theta&0\\sin\theta&\cos\theta&0\0&0&1
\end{bmatrix}.
این صفحه در نسخهٔ اصلی عمداً خالی است.
ضمیمه D — خلاصهٔ توابع OpenGL
D.1 تابعهای Initialization و Window
void glutInit(int *argc, char **argv)
GLUT را مقداردهی اولیه میکند. آرگومانهای main به آن داده میشوند و برنامه میتواند از آنها استفاده کند.
در صورت استفاده، GLEW را مقداردهی اولیه میکند.
int glutCreateWindow(char *title)
پنجرهای با عنوان title میسازد و شناسهای برای ارجاع به آن بازمیگرداند.
void glutInitDisplayMode(unsigned int mode)
ویژگیهای display را با OR منطقی گزینههایی مانند GLUT_RGB، GLUT_INDEX، GLUT_SINGLE و GLUT_DOUBLE تعیین میکند.
void glutInitWindowSize(int width, int height)
عرض و ارتفاع اولیهٔ پنجره را بر حسب پیکسل تعیین میکند.
void glutInitWindowPosition(int x, int y)
موقعیت اولیهٔ گوشهٔ بالا-چپ پنجره را بر حسب پیکسل تعیین میکند.
void glViewport(int x, int y, GLsizei width, GLsizei height)
viewport با ابعاد width×height و گوشهٔ پایین-چپ (x,y) را مشخص میکند.
برنامه را وارد event-processing loop میکند و معمولاً آخرین دستور main است.
void glutDisplayFunc(void (*func)(void))
تابع display callback را ثبت میکند.
درخواست اجرای display callback پس از بازگشت callback فعلی را میدهد.
front و back buffer را جابهجا میکند.
اجرای فرمانهای bufferشدهٔ OpenGL را وادار میکند.
void glutSetWindow(int id)
پنجرهٔ جاری را روی شناسهٔ id قرار میدهد.
void glutContextVersion(int major_version, int minor_version)
نسخهٔ context درخواستی را تعیین میکند، مثلاً (3,1) برای OpenGL 3.1؛ در freeglut موجود است.
void glutContextProfile(int profile)
profile را روی GLUT_CORE_PROFILE یا GLUT_COMPATIBILITY_PROFILE میگذارد؛ profile سازگاری backward compatibility را ممکن میکند.
D.2 Vertex Buffer Objectها
void glGenVertexArrays(GLsizei n, GLuint *array)
n شناسهٔ آزاد برای vertex array object تولید میکند.
void glBindVertexArray(GLuint id)
vertex array object با id را ایجاد/فعال میکند.
void glGenBuffers(GLsizei n, GLuint *buffer)
n شناسهٔ آزاد برای buffer object تولید میکند.
void glBindBuffer(GLenum target, GLint id)
buffer object با شناسهٔ id و نوع target را ایجاد/فعال میکند؛ برای دادهٔ vertex attribute معمولاً GL_ARRAY_BUFFER است.
void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
size بایت حافظه برای buffer نوع target تخصیص داده و داده را بارگذاری میکند. usage الگوی استفاده مانند GL_STATIC_DRAW یا GL_DYNAMIC_DRAW را مشخص میکند.
void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
size بایت از buffer جاری را از offset با دادهٔ جدید بهروزرسانی میکند.
void glVertexAttrib[1234][sfd](GLuint index, TYPE data)
void glVertexAttrib[1234][sfd]v(GLuint index, TYPE *data)
مقدار vertex attribute با index مشخص را تعیین میکند.
void glVertexAttribPointer(GLuint index, GLint size, GLenum type,
GLboolean normalized, GLsizei stride, const GLvoid* data)
محل و layout دادهٔ attribute را مشخص میکند. size تعداد مؤلفهها، type نوع داده و stride فاصلهٔ رکوردهاست؛ اگر normalized=GL_TRUE باشد داده هنگام ذخیره normalize میشود.
void glEnableVertexAttribArray(GLuint index)
vertex attribute array با index را فعال میکند.
void glDrawArrays(GLenum mode, GLint first, GLsizei count)
count primitive/vertex را از first با modeهایی مانند GL_TRIANGLES یا GL_LINES رندر میکند.
D.3 Interaction
void glutMouseFunc(void *f(int button, int state, int x, int y))
mouse callback را ثبت میکند؛ button، state و موقعیت mouse نسبت به گوشهٔ بالا-چپ پنجره به callback داده میشود.
void glutReshapeFunc(void *f(int width, int height))
reshape callback را ثبت میکند و اندازهٔ جدید پنجره را تحویل میدهد.
void glutKeyboardFunc(void *f(char key, int width, int height))
keyboard callback را ثبت میکند؛ کد ASCII کلید و موقعیت mouse را تحویل میدهد.
void glutIdleFunc(void (*f)(void))
callbackای را ثبت میکند که وقتی event دیگری وجود ندارد اجرا میشود.
int glutCreateMenu(void (*f)(int value))
یک menu سطح بالا میسازد، callback آن را ثبت میکند و شناسهٔ menu را برمیگرداند.
menu جاری را انتخاب میکند.
void glutAddMenuEntry(char *name, int value)
یک entry به menu جاری میافزاید؛ انتخاب آن value را به callback میدهد.
void glutAttachMenu(int button)
menu جاری را به mouse button مشخص متصل میکند.
void glutAddSubMenu(char *name, int menu)
submenu با شناسهٔ menu را اضافه میکند.
void glutTimerFunc(int delay, void (*f)(int v), int value)
timer callback را ثبت میکند؛ پس از delay میلیثانیه f اجرا میشود.
void glutMotionFunc(void (*f)(int x, int y))
callback حرکت mouse هنگام فشردهبودن دستکم یک button را ثبت میکند.
void glutPassiveMotionFunc(void (*f)(int x, int y))
callback حرکت mouse بدون الزام به فشردن button را ثبت میکند.
D.4 تنظیم Attributeها و فعالکردن Featureها
void glEnable(GLenum feature)
void glDisable(GLenum feature)
featureهایی مانند GL_DEPTH_TEST، انواع texture، smoothing و GL_BLEND را فعال/غیرفعال میکنند.
void glPolygonMode(GLenum faces, GLenum mode)
mode رندر polygon را برای faceهای مشخص روی GL_POINTS، GL_LINES یا GL_FILL میگذارد.
void glClearColor(GLclampf r, GLclampf g, GLclampf b, GLclampf a)
رنگ RGBA مورد استفاده هنگام پاککردن color buffer را تعیین میکند.
void glPointSize(GLfloat size)
اندازهٔ point را بر حسب پیکسل تنظیم میکند.
void glPolygonOffset(GLfloat factor, GLfloat units)
عمق polygon را با ترکیبی از factor و units offset میدهد.
glDepthMask(GLboolean flag)
depth buffer را با GL_FALSE فقطخواندنی و با GL_TRUE قابلنوشتن میکند.
void glBlendFunc(GLenum source, GLenum destination)
factorهای blend مبدأ و مقصد را تعیین میکند؛ گزینههایی مانند GL_ONE، GL_ZERO، GL_SRC_ALPHA و GL_ONE_MINUS_SRC_ALPHA پشتیبانی میشوند.
D.5 تابعهای Texture و Image
glTexImage2D[ui us f]v(GLenum target, GLint level, GLint iformat,
GLsizei width, GLsizei height, GLint border, GLenum format,
GLenum type, GLvoid *texels)
texture دوبعدی width×height را از texelهای مشخص میسازد.
glTexParameter[if](GLenum target, GLenum param, TYPE value)
glTexParameter[if]v(GLenum target, GLenum param, TYPE *value)
پارامتر texture را تنظیم میکند.
glGenTextures(GLsizei n, GLuint name)
شناسههای آزاد برای texture object تولید میکند.
glBindTexture(GLenum target, GLuint name)
name را به texture نوع target متصل میکند.
glDeleteTextures(GLsizei n, GLuint *namearray)
n texture object را حذف میکند.
D.6 دستکاری State و Buffer
void glDrawBuffer(GLenum buffer)
color buffer مقصد رندر را انتخاب میکند.
void glLogicOp(GLenum op)
در صورت فعالبودن GL_COLOR_LOGIC_OP یکی از ۱۶ حالت منطقی نوشتن مانند GL_COPY یا GL_XOR را انتخاب میکند.
glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
GLenum format, GLenum type, GLvoid *image)
مستطیلی از pixelها را از read buffer به آرایهٔ image میخواند.
glPixelStore[if](GLenum param, TYPE value)
پارامترهای packing/unpacking pixel مانند alignment و swap bytes را تنظیم میکند.
D.7 Query Functionها
void glGetBooleanv(GLenum name, GLboolean *param)
void glGetIntegerv(GLenum name, GLint *param)
void glGetFloatv(GLenum name, GLfloat *param)
مقدار جاری state مشخص را در param مینویسند.
void glGetDoublev(GLenum name, GLdouble *param)
void glGetPointerv(GLenum name, GLvoid **param)
int glutGet(GLenum state)
دو تابع نخست state جاری را برمیگردانند؛ glutGet مقدار stateهای GLUT مانند GLUT_WINDOW_WIDTH، GLUT_WINDOW_HEIGHT و GLUT_ELAPSED_TIME را میدهد.
D.8 تابعهای GLSL
program object خالی میسازد و شناسهاش را برمیگرداند.
GLuint glCreateShader(GLenum type)
shader object از نوع GL_VERTEX_SHADER یا GL_FRAGMENT_SHADER میسازد.
void glShaderSource(GLuint shader, GLsizei nstrings,
const GLchar **strings, const GLint *lengths)
source code shader را از آرایهای از stringها تعیین میکند.
void glCompileShader(GLuint shader)
void glAttachShader(GLuint program, GLuint shader)
void glLinkProgram(GLuint program)
بهترتیب shader را compile، به program متصل و program را link میکنند.
void glUseProgram(GLuint program)
program object مشخص را فعال میکند.
GLint glGetAttribLocation(GLuint program, const GLchar *name)
index attribute با نام name را از program linked برمیگرداند.
void glVertexAttrib[1234][sfd](GLuint index, TYPE value1, TYPE value2, ...)
void glVertexAttrib[1234][sfd]v(GLuint index, TYPE *value)
مقدار vertex attribute با index مشخص را تعیین میکنند.
GLint glGetUniformLocation(GLuint program, const GLchar *name)
index متغیر uniform را برمیگرداند.
void glUniform1234[if](GLint index, TYPE value)
void glUniform1234[if]v(GLint index, GLsizei num, TYPE value)
void glUniformMatrix[234]f(GLint index, GLsizei num,
GLboolean transpose, const GLfloat *value)
مقدار uniform، آرایه یا ماتریس uniform را تنظیم میکنند.
void glGetProgram(GLuint program, GLenum pname, GLint *param)
پارامترهایی مانند GL_LINK_STATUS و GL_INFO_LOG_LENGTH را برای program برمیگرداند.
void glGetShaderiv(GLuint shader, GLenum pname, GLint *param)
پارامترهایی مانند GL_COMPILE_STATUS و GL_INFO_LOG_LENGTH را برای shader برمیگرداند.
void getProgramInfoLog(GLuint program, GLsizei maxL, GLsizei *len,
GLchar *infoLog)
information log برنامه را در infoLog و طول آن را در len قرار میدهد.
void getShaderInfoLog(GLuint shader, GLsizei maxL, GLsizei *len,
GLchar *infoLog)
information log shader را برمیگرداند.
این صفحه در نسخهٔ اصلی عمداً خالی است.