[صفحهٔ ۱: جلد تصویری اثر؛ متن مستقلی برای ترجمه در استخراج متنی وجود ندارد.]
این صفحه عمداً خالی گذاشته شده است.
گرافیک رایانهای تعاملی
رویکرد بالا به پایین با OpenGL مبتنی بر شیدر
ویرایش ششم
این صفحه عمداً خالی گذاشته شده است.
گرافیک رایانهای تعاملی
رویکرد بالا به پایین با OpenGL مبتنی بر شیدر
ویرایش ششم
ادوارد اَنجِل
دانشگاه نیومکزیکو
دیو شراینر
ARM, Inc.
اطلاعات نشر و تولید
- مدیر تحریریه: Marcia Horton
- سردبیر: Michael Hirsch
- ویراستار اکتساب: Matt Goldstein
- دستیار تحریریه: Chelsea Bell
- معاون بازاریابی: Patrice Jones
- مدیر بازاریابی: Yezan Alayan
- هماهنگکننده بازاریابی: Kathryn Ferranti
- معاون تولید: Vince O’Brien
- ویراستار اجرایی: Jeff Holcomb
- مدیر ارشد پروژه تولید: Marilyn Lloyd
- سرپرست ارشد عملیات: Alan Fischer
- کارشناس عملیات: Lisa McDowell
- طراح متن: Beth Paquin
- طراح جلد: Central Covers
- تصویر جلد: Hue Walker، پروژه Fulldome، دانشگاه نیومکزیکو
- ویراستار رسانه: Daniel Sandin
- مدیر پروژه رسانه: Wanda Rockwell
- مدیریت کامل پروژه: Coventry Composition
- حروفچینی: Coventry Composition با استفاده از ZzTEX
- چاپ و صحافی: Edwards Brothers
- چاپ جلد و صفحات الحاقی: Lehigh-Phoenix Color
- قلم متن: Minion
اعتبارها و سپاسگزاریهایی که با اجازه از منابع دیگر گرفته و در این کتاب درسی بازتولید شدهاند، در صفحات مربوط در متن درج شدهاند.
حق نشر © سالهای ۲۰۱۲، ۲۰۰۹، ۲۰۰۶، ۲۰۰۳ و ۲۰۰۰ متعلق به Pearson Education, Inc. است که با نام Addison-Wesley منتشر میکند. همه حقوق محفوظ است. اثر در ایالات متحده آمریکا تولید شده است. این انتشار تحت حمایت قوانین حق نشر قرار دارد و برای هرگونه بازتولید ممنوع، ذخیره در سامانه بازیابی، یا انتقال به هر شکل و با هر وسیلهای از جمله الکترونیکی، مکانیکی، فتوکپی، ضبط و مانند آن باید از ناشر اجازه گرفته شود. برای درخواست مجوز استفاده از مواد این اثر، درخواست کتبی به بخش مجوزهای Pearson Education, Inc. در نشانی 501 Boylston Street, Suite 900, Boston, Massachusetts 02116 ارسال میشود.
بسیاری از نامگذاریهایی که تولیدکنندگان و فروشندگان برای متمایز کردن محصولات خود به کار میبرند، علامت تجاری ادعاشدهاند. هرجا چنین نامهایی در کتاب آمده و ناشر از ادعای علامت تجاری آگاه بوده است، آن نامها با حرف آغازین بزرگ یا بهصورت تمامحروف بزرگ چاپ شدهاند.
دادههای فهرستنویسی کتابخانه کنگره
Angel, Edward.
Interactive Computer Graphics: A Top-Down Approach with Shader-Based OpenGL / Edward Angel, David Shreiner. — ویرایش ششم.
اثر شامل منابع کتابشناختی و نمایه است.
ISBN-13: 978-0-13-254523-5
ISBN-10: 0-13-254523-3
موضوعها: ۱. گرافیک رایانهای. ۲. OpenGL.
I. Shreiner, Dave. II. عنوان.
T385.A5133 2012
006.6—dc22
2011004742
Addison-Wesley یکی از نشانهای نشر Pearson است.
ISBN 10: 0-13-254523-3
ISBN 13: 978-0-13-254523-5
تقدیم به Rose Mary — E.A.
تقدیم به Vicki، Bonnie، Bob و Phantom — D.S.
این صفحه عمداً خالی گذاشته شده است.
فهرست مطالب
پیشگفتار — صفحه xxi
فصل ۱: سامانهها و مدلهای گرافیکی — صفحه ۱
- ۱.۱ کاربردهای گرافیک رایانهای — ۲
- ۱.۱.۱ نمایش اطلاعات — ۲
- ۱.۱.۲ طراحی — ۳
- ۱.۱.۳ شبیهسازی و پویانمایی — ۳
- ۱.۱.۴ رابطهای کاربری — ۴
- ۱.۲ یک سامانه گرافیکی — ۵
- ۱.۲.۱ پیکسلها و بافر فریم — ۵
- ۱.۲.۲ CPU و GPU — ۶
- ۱.۲.۳ دستگاههای خروجی — ۷
- ۱.۲.۴ دستگاههای ورودی — ۹
- ۱.۲.۵ دستگاههای ورودی فیزیکی — ۱۰
- ۱.۲.۶ دستگاههای منطقی — ۱۲
- ۱.۲.۷ حالتهای ورودی — ۱۳
- ۱.۳ تصویرها: فیزیکی و مصنوعی — ۱۵
- ۱.۳.۱ اشیا و مشاهدهگران — ۱۵
- ۱.۳.۲ نور و تصویرها — ۱۶
- ۱.۳.۳ مدلهای تصویربرداری — ۱۸
- ۱.۴ سامانههای تصویربرداری — ۲۰
- ۱.۴.۱ دوربین سوراخسوزنی — ۲۰
- ۱.۴.۲ سامانه بینایی انسان — ۲۲
- ۱.۵ مدل دوربین مصنوعی — ۲۳
- ۱.۶ رابط برنامهنویس — ۲۵
- ۱.۶.۱ مدل رسمگر قلمی — ۲۷
- ۱.۶.۲ APIهای سهبعدی — ۲۸
- ۱.۶.۳ دنبالهای از تصویرها — ۳۱
- ۱.۶.۴ الگوی مدلسازی–رندر — ۳۲
- ۱.۷ معماریهای گرافیکی — ۳۳
- ۱.۷.۱ پردازندههای نمایش — ۳۴
- ۱.۷.۲ معماریهای خط لوله — ۳۴
ادامه فصل ۱
- ۱.۷.۳ خط لوله گرافیکی — ۳۵
- ۱.۷.۴ پردازش رأس — ۳۶
- ۱.۷.۵ برش و مونتاژ بدویها — ۳۶
- ۱.۷.۶ رسترسازی — ۳۷
- ۱.۷.۷ پردازش قطعه — ۳۷
- ۱.۸ خط لولههای برنامهپذیر — ۳۷
- ۱.۹ ویژگیهای کارایی — ۳۸
- جمعبندی و یادداشتها — ۳۹
- منابع پیشنهادی — ۴۰
- تمرینها — ۴۱
فصل ۲: برنامهنویسی گرافیکی — صفحه ۴۳
- ۲.۱ واشر سیرپینسکی — ۴۳
- ۲.۲ برنامهنویسی کاربردهای دوبعدی — ۴۶
- ۲.۳ رابط برنامهنویسی کاربردی OpenGL — ۵۰
- ۲.۳.۱ توابع گرافیکی — ۵۱
- ۲.۳.۲ خط لوله گرافیکی و ماشینهای حالت — ۵۳
- ۲.۳.۳ رابط OpenGL — ۵۳
- ۲.۳.۴ دستگاههای مختصات — ۵۵
- ۲.۴ بدویها و ویژگیها — ۵۶
- ۲.۴.۱ مبانی چندضلعی — ۵۸
- ۲.۴.۲ چندضلعیها در OpenGL — ۵۹
- ۲.۴.۳ تقریب یک کره — ۶۰
- ۲.۴.۴ مثلثبندی — ۶۲
- ۲.۴.۵ متن — ۶۴
- ۲.۴.۶ اشیای خمیده — ۶۵
- ۲.۴.۷ ویژگیها — ۶۵
- ۲.۵ رنگ — ۶۷
- ۲.۵.۱ رنگ RGB — ۶۹
- ۲.۵.۲ رنگ نمایهای — ۷۱
- ۲.۵.۳ تنظیم ویژگیهای رنگ — ۷۲
- ۲.۶ مشاهده — ۷۳
- ۲.۶.۱ نمای ارتوگرافیک — ۷۴
- ۲.۶.۲ مشاهده دوبعدی — ۷۷
- ۲.۷ توابع کنترلی — ۷۸
- ۲.۷.۱ تعامل با سامانه پنجره — ۷۸
- ۲.۷.۲ نسبت ابعاد و Viewportها — ۷۹
- ۲.۷.۳ توابع
main، display و init — ۸۰
- ۲.۷.۴ ساختار برنامه — ۸۳
ادامه فصل ۲
- ۲.۸ برنامه واشر — ۸۳
- ۲.۸.۱ رندر کردن نقاط — ۸۴
- ۲.۸.۲ شیدر رأس — ۸۵
- ۲.۸.۳ شیدر قطعه — ۸۶
- ۲.۸.۴ ترکیب بخشها — ۸۶
- ۲.۸.۵ تابع
initShader — ۸۶
- ۲.۹ چندضلعیها و بازگشت — ۸۸
- ۲.۱۰ واشر سهبعدی — ۹۱
- ۲.۱۰.۱ استفاده از نقاط سهبعدی — ۹۱
- ۲.۱۰.۲ استفاده از چندضلعیها در سه بعد — ۹۲
- ۲.۱۰.۳ حذف سطح پنهان — ۹۶
- ۲.۱۱ افزودن تعامل — ۹۸
- ۲.۱۱.۱ استفاده از دستگاه اشارهگر — ۹۸
- ۲.۱۱.۲ رویدادهای پنجره — ۱۰۱
- ۲.۱۱.۳ رویدادهای صفحهکلید — ۱۰۲
- ۲.۱۱.۴ Callback بیکاری — ۱۰۳
- ۲.۱۱.۵ بافرگذاری دوگانه — ۱۰۵
- ۲.۱۱.۶ مدیریت پنجره — ۱۰۶
- ۲.۱۲ منوها — ۱۰۶
- جمعبندی و یادداشتها — ۱۰۸
- منابع پیشنهادی — ۱۰۹
- تمرینها — ۱۱۰
فصل ۳: اشیای هندسی و تبدیلها — صفحه ۱۱۵
- ۳.۱ اسکالرها، نقاط و بردارها — ۱۱۶
- ۳.۱.۱ اشیای هندسی — ۱۱۶
- ۳.۱.۲ هندسه مستقل از مختصات — ۱۱۷
- ۳.۱.۳ دیدگاه ریاضی: فضاهای برداری و آفین — ۱۱۸
- ۳.۱.۴ دیدگاه علوم رایانه — ۱۱۹
- ۳.۱.۵ نوعهای داده انتزاعی هندسی — ۱۱۹
- ۳.۱.۶ خطها — ۱۲۰
- ۳.۱.۷ مجموعهای آفین — ۱۲۱
- ۳.۱.۸ تحدب — ۱۲۲
- ۳.۱.۹ ضرب داخلی و ضرب برداری — ۱۲۲
- ۳.۱.۱۰ صفحهها — ۱۲۳
- ۳.۲ بدویهای سهبعدی — ۱۲۵
- ۳.۳ دستگاههای مختصات و چارچوبها — ۱۲۶
- ۳.۳.۱ نمایشها و N-tupleها — ۱۲۸
- ۳.۳.۲ تغییر دستگاه مختصات — ۱۲۹
ادامه فصل ۳
- ۳.۳.۳ نمونه تغییر نمایش — ۱۳۲
- ۳.۳.۴ مختصات همگن — ۱۳۳
- ۳.۳.۵ نمونه تغییر چارچوب — ۱۳۶
- ۳.۳.۶ کار با نمایشها — ۱۳۷
- ۳.۴ چارچوبها در OpenGL — ۱۳۹
- ۳.۵ کلاسهای ماتریس و بردار — ۱۴۴
- ۳.۶ مدلسازی یک مکعب رنگی — ۱۴۶
- ۳.۶.۱ مدلسازی وجهها — ۱۴۶
- ۳.۶.۲ وجههای رو به داخل و رو به خارج — ۱۴۶
- ۳.۶.۳ ساختارهای داده برای نمایش شیء — ۱۴۷
- ۳.۶.۴ مکعب رنگی — ۱۴۸
- ۳.۶.۵ درونیابی — ۱۵۰
- ۳.۶.۶ نمایش مکعب — ۱۵۱
- ۳.۷ تبدیلهای آفین — ۱۵۲
- ۳.۸ انتقال، چرخش و مقیاسدهی — ۱۵۵
- ۳.۸.۱ انتقال — ۱۵۵
- ۳.۸.۲ چرخش — ۱۵۶
- ۳.۸.۳ مقیاسدهی — ۱۵۸
- ۳.۹ تبدیلها در مختصات همگن — ۱۵۹
- ۳.۹.۱ انتقال — ۱۶۰
- ۳.۹.۲ مقیاسدهی — ۱۶۱
- ۳.۹.۳ چرخش — ۱۶۲
- ۳.۹.۴ برش — ۱۶۳
- ۳.۱۰ الحاق تبدیلها — ۱۶۴
- ۳.۱۰.۱ چرخش حول یک نقطه ثابت — ۱۶۵
- ۳.۱۰.۲ چرخش عمومی — ۱۶۷
- ۳.۱۰.۳ تبدیل نمونه — ۱۶۸
- ۳.۱۰.۴ چرخش حول یک محور دلخواه — ۱۶۹
- ۳.۱۱ ماتریسهای تبدیل در OpenGL — ۱۷۲
- ۳.۱۱.۱ ماتریسهای تبدیل جاری — ۱۷۳
- ۳.۱۱.۲ چرخش، انتقال و مقیاسدهی — ۱۷۴
- ۳.۱۱.۳ چرخش حول نقطه ثابت — ۱۷۵
- ۳.۱۱.۴ ترتیب تبدیلها — ۱۷۶
- ۳.۱۲ چرخاندن مکعب — ۱۷۶
- ۳.۱۲.۱ بهروزرسانی در Callback نمایش — ۱۷۷
- ۳.۱۲.۲ متغیرهای Uniform — ۱۷۸
- ۳.۱۳ رابطهای کاربردهای سهبعدی — ۱۸۰
- ۳.۱۳.۱ استفاده از ناحیههای صفحهنمایش — ۱۸۰
- ۳.۱۳.۲ Trackball مجازی — ۱۸۱
- ۳.۱۳.۳ چرخشهای نرم — ۱۸۴
- ۳.۱۳.۴ چرخش افزایشی — ۱۸۵
ادامه فصل ۳
- ۳.۱۴ کواترنیونها — ۱۸۶
- ۳.۱۴.۱ اعداد مختلط و کواترنیونها — ۱۸۶
- ۳.۱۴.۲ کواترنیونها و چرخش — ۱۸۷
- جمعبندی و یادداشتها — ۱۹۰
- منابع پیشنهادی — ۱۹۰
- تمرینها — ۱۹۱
فصل ۴: مشاهده — صفحه ۱۹۵
- ۴.۱ مشاهده کلاسیک و رایانهای — ۱۹۵
- ۴.۱.۱ مشاهده کلاسیک — ۱۹۷
- ۴.۱.۲ تصویرسازیهای ارتوگرافیک — ۱۹۷
- ۴.۱.۳ تصویرسازیهای آکسونومتریک — ۱۹۸
- ۴.۱.۴ تصویرسازیهای مایل — ۲۰۰
- ۴.۱.۵ مشاهده پرسپکتیو — ۲۰۱
- ۴.۲ مشاهده با رایانه — ۲۰۲
- ۴.۳ موقعیتدهی دوربین — ۲۰۴
- ۴.۳.۱ موقعیتدهی چارچوب دوربین — ۲۰۴
- ۴.۳.۲ دو API مشاهده — ۲۰۹
- ۴.۳.۳ تابع Look-At — ۲۱۲
- ۴.۳.۴ سایر APIهای مشاهده — ۲۱۴
- ۴.۴ تصویرسازیهای موازی — ۲۱۵
- ۴.۴.۱ تصویرسازیهای متعامد — ۲۱۵
- ۴.۴.۲ مشاهده موازی با OpenGL — ۲۱۶
- ۴.۴.۳ نرمالسازی تصویرسازی — ۲۱۷
- ۴.۴.۴ ماتریسهای تصویرسازی متعامد — ۲۱۹
- ۴.۴.۵ تصویرسازیهای مایل — ۲۲۰
- ۴.۴.۶ مشاهدهگر تعاملی — ۲۲۴
- ۴.۵ تصویرسازیهای پرسپکتیو — ۲۲۶
- ۴.۵.۱ تصویرسازیهای پرسپکتیو ساده — ۲۲۶
- ۴.۶ تصویرسازی پرسپکتیو با OpenGL — ۲۲۹
- ۴.۶.۱ توابع پرسپکتیو — ۲۳۰
- ۴.۷ ماتریسهای تصویرسازی پرسپکتیو — ۲۳۲
- ۴.۷.۱ نرمالسازی پرسپکتیو — ۲۳۲
- ۴.۷.۲ تبدیلهای پرسپکتیو OpenGL — ۲۳۶
- ۴.۷.۳ نمونه پرسپکتیو — ۲۳۸
- ۴.۸ حذف سطح پنهان — ۲۳۸
- ۴.۹ نمایش مشها — ۲۴۱
- ۴.۹.۱ نمایش مش بهصورت سطح — ۲۴۴
ادامه فصل ۴
- ۴.۹.۲ جابهجایی چندضلعی — ۲۴۶
- ۴.۹.۳ حرکت درون یک صحنه — ۲۴۷
- ۴.۱۰ تصویرسازیها و سایهها — ۲۴۹
- جمعبندی و یادداشتها — ۲۵۳
- منابع پیشنهادی — ۲۵۴
- تمرینها — ۲۵۴
فصل ۵: نورپردازی و سایهزنی — صفحه ۲۵۷
- ۵.۱ نور و ماده — ۲۵۸
- ۵.۲ منبعهای نور — ۲۶۱
- ۵.۲.۱ منبعهای رنگی — ۲۶۲
- ۵.۲.۲ نور محیطی — ۲۶۲
- ۵.۲.۳ منبعهای نقطهای — ۲۶۳
- ۵.۲.۴ نورافکنها — ۲۶۴
- ۵.۲.۵ منبعهای نور دوردست — ۲۶۴
- ۵.۳ مدل بازتاب Phong (فونگ) — ۲۶۵
- ۵.۳.۱ بازتاب محیطی — ۲۶۷
- ۵.۳.۲ بازتاب پخشی — ۲۶۷
- ۵.۳.۳ بازتاب آینهای — ۲۶۹
- ۵.۳.۴ مدل اصلاحشده فونگ — ۲۷۰
- ۵.۴ محاسبه بردارها — ۲۷۱
- ۵.۴.۱ بردارهای نرمال — ۲۷۲
- ۵.۴.۲ زاویه بازتاب — ۲۷۴
- ۵.۵ سایهزنی چندضلعی — ۲۷۵
- ۵.۵.۱ سایهزنی تخت — ۲۷۶
- ۵.۵.۲ سایهزنی نرم و Gouraud (گورو) — ۲۷۷
- ۵.۵.۳ سایهزنی فونگ — ۲۷۹
- ۵.۶ تقریب کره با تقسیمبندی بازگشتی — ۲۸۰
- ۵.۷ تعیین پارامترهای نورپردازی — ۲۸۳
- ۵.۷.۱ منبعهای نور — ۲۸۳
- ۵.۷.۲ مواد — ۲۸۴
- ۵.۸ پیادهسازی یک مدل نورپردازی — ۲۸۶
- ۵.۸.۱ اعمال مدل نورپردازی در برنامه — ۲۸۶
- ۵.۸.۲ کارایی — ۲۸۹
- ۵.۸.۳ نورپردازی در شیدر رأس — ۲۹۰
- ۵.۹ سایهزنی مدل کره — ۲۹۴
- ۵.۱۰ نورپردازی بهازای هر قطعه — ۲۹۵
- ۵.۱۰.۱ سایهزنی غیرواقعگرایانه — ۲۹۷
ادامه فصل ۵
- ۵.۱۱ نورپردازی سراسری — ۲۹۷
- جمعبندی و یادداشتها — ۲۹۹
- منابع پیشنهادی — ۳۰۰
- تمرینها — ۳۰۰
فصل ۶: از رأسها تا قطعهها — صفحه ۳۰۳
- ۶.۱ راهبردهای پایه پیادهسازی — ۳۰۴
- ۶.۲ چهار وظیفه اصلی — ۳۰۶
- ۶.۲.۱ مدلسازی — ۳۰۶
- ۶.۲.۲ پردازش هندسه — ۳۰۷
- ۶.۲.۳ رسترسازی — ۳۰۸
- ۶.۲.۴ پردازش قطعه — ۳۰۹
- ۶.۳ برش — ۳۱۰
- ۶.۴ برش پارهخط — ۳۱۰
- ۶.۴.۱ برش Cohen-Sutherland (کوهن–ساترلند) — ۳۱۰
- ۶.۴.۲ برش Liang-Barsky (لیانگ–بارسکی) — ۳۱۳
- ۶.۵ برش چندضلعی — ۳۱۴
- ۶.۶ برش سایر بدویها — ۳۱۷
- ۶.۶.۱ جعبهها و حجمهای محاطی — ۳۱۸
- ۶.۶.۲ منحنیها، سطوح و متن — ۳۱۹
- ۶.۶.۳ برش در بافر فریم — ۳۱۹
- ۶.۷ برش در سه بعد — ۳۱۹
- ۶.۸ رسترسازی — ۳۲۳
- ۶.۹ الگوریتم Bresenham (برزنهم) — ۳۲۵
- ۶.۱۰ رسترسازی چندضلعی — ۳۲۷
- ۶.۱۰.۱ آزمون داخل–خارج — ۳۲۷
- ۶.۱۰.۲ OpenGL و چندضلعیهای مقعر — ۳۲۹
- ۶.۱۰.۳ پرکردن و مرتبسازی — ۳۲۹
- ۶.۱۰.۴ پرکردن سیلابی — ۳۳۰
- ۶.۱۰.۵ تکینگیها — ۳۳۰
- ۶.۱۱ حذف سطح پنهان — ۳۳۱
- ۶.۱۱.۱ رویکردهای فضای شیء و فضای تصویر — ۳۳۱
- ۶.۱۱.۲ مرتبسازی و حذف سطح پنهان — ۳۳۲
- ۶.۱۱.۳ الگوریتمهای Scanline (خط پیمایش) — ۳۳۳
- ۶.۱۱.۴ حذف پشتوجه — ۳۳۴
- ۶.۱۱.۵ الگوریتم z-buffer — ۳۳۵
- ۶.۱۱.۶ تبدیل پیمایشی با z-buffer — ۳۳۸
- ۶.۱۱.۷ مرتبسازی عمق و الگوریتم نقاش — ۳۴۰
- ۶.۱۲ ضدهمپوشانی — ۳۴۲
ادامه فصل ۶
- ۶.۱۳ ملاحظات نمایش — ۳۴۴
- ۶.۱۳.۱ سامانههای رنگ — ۳۴۵
- ۶.۱۳.۲ ماتریس رنگ — ۳۴۸
- ۶.۱۳.۳ تصحیح گاما — ۳۴۹
- ۶.۱۳.۴ دیترینگ و نیمسایهسازی — ۳۴۹
- جمعبندی و یادداشتها — ۳۵۰
- منابع پیشنهادی — ۳۵۲
- تمرینها — ۳۵۲
فصل ۷: روشهای گسسته — صفحه ۳۵۷
- ۷.۱ بافرها — ۳۵۷
- ۷.۲ تصویرهای دیجیتال — ۳۵۹
- ۷.۳ نوشتن در بافرها — ۳۶۲
- ۷.۳.۱ حالتهای نوشتن — ۳۶۳
- ۷.۳.۲ نوشتن با XOR — ۳۶۵
- ۷.۴ روشهای نگاشت — ۳۶۶
- ۷.۵ نگاشت بافت — ۳۶۸
- ۷.۵.۱ نگاشت بافت دوبعدی — ۳۶۸
- ۷.۶ نگاشت بافت در OpenGL — ۳۷۴
- ۷.۶.۱ نگاشت بافت دوبعدی — ۳۷۵
- ۷.۶.۲ اشیای بافت — ۳۷۵
- ۷.۶.۳ آرایه بافت — ۳۷۶
- ۷.۶.۴ مختصات بافت و Samplerها — ۳۷۶
- ۷.۶.۵ نمونهبرداری بافت — ۳۸۲
- ۷.۶.۶ کار با مختصات بافت — ۳۸۴
- ۷.۶.۷ چندبافتی — ۳۸۶
- ۷.۷ تولید بافت — ۳۸۷
- ۷.۸ نگاشتهای محیطی — ۳۸۸
- ۷.۹ نمونه نگاشت بازتاب — ۳۹۳
- ۷.۱۰ نگاشت برجستگی — ۳۹۶
- ۷.۱۰.۱ یافتن نگاشتهای برجستگی — ۳۹۷
- ۷.۱۰.۲ نمونه نگاشت برجستگی — ۴۰۰
- ۷.۱۱ روشهای ترکیب — ۴۰۴
- ۷.۱۱.۱ کدری و آمیختن — ۴۰۴
- ۷.۱۱.۲ ترکیب تصویر — ۴۰۶
- ۷.۱۱.۳ آمیختن و ترکیب در OpenGL — ۴۰۶
- ۷.۱۱.۴ بازنگری ضدهمپوشانی — ۴۰۷
- ۷.۱۱.۵ رندر از پشت به جلو و از جلو به پشت — ۴۰۹
- ۷.۱۱.۶ ضدهمپوشانی صحنه و Multisampling (چندنمونهبرداری) — ۴۱۰
ادامه فصل ۷
- ۷.۱۱.۷ پردازش تصویر — ۴۱۱
- ۷.۱۱.۸ سایر روشهای چندگذره — ۴۱۲
- ۷.۱۲ نمونهبرداری و Aliasing (همپوشانی طیفی) — ۴۱۳
- ۷.۱۲.۱ نظریه نمونهبرداری — ۴۱۳
- ۷.۱۲.۲ بازسازی — ۴۱۸
- ۷.۱۲.۳ کوانتیزهسازی — ۴۲۰
- جمعبندی و یادداشتها — ۴۲۱
- منابع پیشنهادی — ۴۲۲
- تمرینها — ۴۲۲
فصل ۸: مدلسازی و سلسلهمراتب — صفحه ۴۲۵
- ۸.۱ نمادها و نمونهها — ۴۲۶
- ۸.۲ مدلهای سلسلهمراتبی — ۴۲۷
- ۸.۳ یک بازوی ربات — ۴۲۹
- ۸.۴ درختها و پیمایش — ۴۳۲
- ۸.۴.۱ پیمایش مبتنی بر پشته — ۴۳۴
- ۸.۵ استفاده از ساختارهای داده درختی — ۴۳۷
- ۸.۶ پویانمایی — ۴۴۱
- ۸.۷ اشیای گرافیکی — ۴۴۳
- ۸.۷.۱ متدها، ویژگیها و پیامها — ۴۴۳
- ۸.۷.۲ یک شیء مکعب — ۴۴۵
- ۸.۷.۳ پیادهسازی شیء مکعب — ۴۴۷
- ۸.۷.۴ اشیا و سلسلهمراتب — ۴۴۷
- ۸.۷.۵ اشیای هندسی — ۴۴۸
- ۸.۸ گرافهای صحنه — ۴۴۹
- ۸.۹ OpenSceneGraph — ۴۵۱
- ۸.۱۰ گرافیک و اینترنت — ۴۵۳
- ۸.۱۰.۱ Hypermedia (ابررسانه) و HTML — ۴۵۳
- ۸.۱۰.۲ Java و Appletها — ۴۵۴
- ۸.۱۰.۳ گرافیک تعاملی و وب — ۴۵۴
- ۸.۱۰.۴ WebGL — ۴۵۵
- ۸.۱۱ سایر ساختارهای درختی — ۴۵۵
- ۸.۱۱.۱ درختهای CSG — ۴۵۵
- ۸.۱۱.۲ درختهای BSP — ۴۵۷
- ۸.۱۱.۳ Quadtreeها و Octreeها — ۴۵۹
- جمعبندی و یادداشتها — ۴۶۱
- منابع پیشنهادی — ۴۶۱
- تمرینها — ۴۶۲
فصل ۹: روشهای رویهای — صفحه ۴۶۵
- ۹.۱ مدلهای الگوریتمی — ۴۶۵
- ۹.۲ مدلهای مبتنی بر فیزیک و سامانههای ذرهای — ۴۶۷
- ۹.۳ ذرات نیوتنی — ۴۶۸
- ۹.۳.۱ ذرات مستقل — ۴۷۰
- ۹.۳.۲ نیروهای فنری — ۴۷۱
- ۹.۳.۳ نیروهای جاذبه و دافعه — ۴۷۲
- ۹.۴ حل سامانههای ذرهای — ۴۷۳
- ۹.۵ قیود — ۴۷۶
- ۹.۵.۱ برخوردها — ۴۷۶
- ۹.۵.۲ قیود نرم — ۴۷۹
- ۹.۶ یک سامانه ذرهای ساده — ۴۸۰
- ۹.۶.۱ نمایش ذرات — ۴۸۰
- ۹.۶.۲ بهروزرسانی موقعیت ذرات — ۴۸۱
- ۹.۶.۳ برخوردها — ۴۸۲
- ۹.۶.۴ نیروها — ۴۸۳
- ۹.۶.۵ Flocking (رفتار گلهای) — ۴۸۳
- ۹.۷ مدلهای مبتنی بر زبان — ۴۸۴
- ۹.۸ روشهای بازگشتی و فراکتالها — ۴۸۷
- ۹.۸.۱ خطکشها و طول — ۴۸۸
- ۹.۸.۲ بُعد فراکتالی — ۴۸۹
- ۹.۸.۳ تقسیم نقطه میانی و حرکت براونی — ۴۹۰
- ۹.۸.۴ کوههای فراکتالی — ۴۹۲
- ۹.۸.۵ مجموعه Mandelbrot (ماندلبرو) — ۴۹۳
- ۹.۹ نویز رویهای — ۴۹۶
- جمعبندی و یادداشتها — ۵۰۰
- منابع پیشنهادی — ۵۰۱
- تمرینها — ۵۰۱
فصل ۱۰: منحنیها و سطوح — صفحه ۵۰۳
- ۱۰.۱ نمایش منحنیها و سطوح — ۵۰۳
- ۱۰.۱.۱ نمایش صریح — ۵۰۳
- ۱۰.۱.۲ نمایشهای ضمنی — ۵۰۵
- ۱۰.۱.۳ فرم پارامتری — ۵۰۶
- ۱۰.۱.۴ منحنیهای چندجملهای پارامتری — ۵۰۷
- ۱۰.۱.۵ سطوح چندجملهای پارامتری — ۵۰۸
- ۱۰.۲ معیارهای طراحی — ۵۰۹
- ۱۰.۳ منحنیهای چندجملهای مکعبی پارامتری — ۵۱۰
ادامه فصل ۱۰
- ۱۰.۴ درونیابی — ۵۱۱
- ۱۰.۴.۱ توابع آمیختگی — ۵۱۳
- ۱۰.۴.۲ وصله درونیاب مکعبی — ۵۱۵
- ۱۰.۵ منحنیها و سطوح Hermite (هرمیت) — ۵۱۷
- ۱۰.۵.۱ فرم هرمیت — ۵۱۷
- ۱۰.۵.۲ پیوستگی هندسی و پارامتری — ۵۱۹
- ۱۰.۶ منحنیها و سطوح Bézier (بزیه) — ۵۲۰
- ۱۰.۶.۱ منحنیهای بزیه — ۵۲۱
- ۱۰.۶.۲ وصلههای سطح بزیه — ۵۲۳
- ۱۰.۷ B-Splineهای مکعبی — ۵۲۴
- ۱۰.۷.۱ منحنی B-Spline مکعبی — ۵۲۵
- ۱۰.۷.۲ B-Splineها و پایه — ۵۲۸
- ۱۰.۷.۳ سطوح Spline — ۵۲۸
- ۱۰.۸ B-Splineهای عمومی — ۵۲۹
- ۱۰.۸.۱ B-Splineهای تعریفشده بهصورت بازگشتی — ۵۳۰
- ۱۰.۸.۲ Splineهای یکنواخت — ۵۳۲
- ۱۰.۸.۳ B-Splineهای غیریکنواخت — ۵۳۲
- ۱۰.۸.۴ NURBS — ۵۳۲
- ۱۰.۸.۵ Splineهای Catmull-Rom — ۵۳۴
- ۱۰.۹ رندر منحنیها و سطوح — ۵۳۵
- ۱۰.۹.۱ روشهای ارزیابی چندجملهای — ۵۳۶
- ۱۰.۹.۲ تقسیمبندی بازگشتی چندجملهایهای بزیه — ۵۳۷
- ۱۰.۹.۳ رندر سایر منحنیهای چندجملهای با تقسیمبندی — ۵۴۰
- ۱۰.۹.۴ تقسیمبندی سطوح بزیه — ۵۴۱
- ۱۰.۱۰ قوری Utah — ۵۴۲
- ۱۰.۱۱ سطوح جبری — ۵۴۵
- ۱۰.۱۱.۱ سطوح درجه دوم — ۵۴۵
- ۱۰.۱۱.۲ رندر سطوح با Ray Casting (پرتوافکنی) — ۵۴۶
- ۱۰.۱۲ منحنیها و سطوح تقسیمبندی — ۵۴۶
- ۱۰.۱۲.۱ تقسیمبندی مش — ۵۴۷
- ۱۰.۱۳ تولید مش از داده — ۵۵۰
- ۱۰.۱۳.۱ بازنگری میدانهای ارتفاع — ۵۵۱
- ۱۰.۱۳.۲ مثلثبندی Delaunay (دلانی) — ۵۵۱
- ۱۰.۱۳.۳ ابرهای نقطه — ۵۵۵
- جمعبندی و یادداشتها — ۵۵۶
- منابع پیشنهادی — ۵۵۶
- تمرینها — ۵۵۷
فصل ۱۱: رندر پیشرفته — صفحه ۵۵۹
- ۱۱.۱ فراتر رفتن از رندر خط لولهای — ۵۵۹
- ۱۱.۲ Ray Tracing (رهگیری پرتو) — ۵۶۰
- ۱۱.۳ ساخت یک رهگیر پرتوی ساده — ۵۶۴
- ۱۱.۳.۱ رهگیری پرتوی بازگشتی — ۵۶۴
- ۱۱.۳.۲ محاسبه تقاطعها — ۵۶۶
- ۱۱.۳.۳ گونههای رهگیری پرتو — ۵۶۸
- ۱۱.۴ معادله رندرینگ — ۵۶۹
- ۱۱.۵ Radiosity (رادیوسیتی) — ۵۷۱
- ۱۱.۵.۱ معادله رادیوسیتی — ۵۷۲
- ۱۱.۵.۲ حل معادله رادیوسیتی — ۵۷۴
- ۱۱.۵.۳ محاسبه ضرایب فرم — ۵۷۵
- ۱۱.۵.۴ اجرای رادیوسیتی — ۵۷۷
- ۱۱.۶ RenderMan — ۵۷۸
- ۱۱.۷ رندر موازی — ۵۷۹
- ۱۱.۷.۱ رندر Sort-Middle — ۵۸۱
- ۱۱.۷.۲ رندر Sort-Last — ۵۸۳
- ۱۱.۷.۳ رندر Sort-First — ۵۸۶
- ۱۱.۸ رندر حجمی — ۵۸۸
- ۱۱.۸.۱ مجموعهدادههای حجمی — ۵۸۸
- ۱۱.۸.۲ نمایش دیداری توابع ضمنی — ۵۸۹
- ۱۱.۹ Isosurfaceها و Marching Cubes — ۵۹۱
- ۱۱.۱۰ سادهسازی مش — ۵۹۴
- ۱۱.۱۱ رندر مستقیم حجم — ۵۹۵
- ۱۱.۱۱.۱ تخصیص رنگ و کدری — ۵۹۶
- ۱۱.۱۱.۲ Splatting — ۵۹۶
- ۱۱.۱۱.۳ رهگیری پرتوی حجمی — ۵۹۸
- ۱۱.۱۱.۴ نگاشت بافت حجمها — ۵۹۹
- ۱۱.۱۲ رندر مبتنی بر تصویر — ۶۰۰
- ۱۱.۱۲.۱ یک نمونه ساده — ۶۰۰
- جمعبندی و یادداشتها — ۶۰۲
- منابع پیشنهادی — ۶۰۳
- تمرینها — ۶۰۴
ضمیمه A: برنامههای نمونه — صفحه ۶۰۷
- A.1 تابع مقداردهی اولیه شیدر — ۶۰۸
- A.1.1 کد برنامه کاربردی — ۶۰۸
ادامه ضمیمه A
- A.2 برنامه واشر سیرپینسکی — ۶۱۰
- A.2.1 کد برنامه کاربردی — ۶۱۰
- A.2.2 شیدر رأس — ۶۱۲
- A.2.3 شیدر قطعه — ۶۱۲
- A.3 تولید بازگشتی واشر سیرپینسکی — ۶۱۳
- A.3.1 کد برنامه کاربردی — ۶۱۳
- A.3.2 شیدر رأس — ۶۱۵
- A.3.3 شیدر قطعه — ۶۱۵
- A.4 مکعب چرخان با چرخش در شیدر — ۶۱۵
- A.4.1 کد برنامه کاربردی — ۶۱۵
- A.4.2 شیدر رأس — ۶۲۰
- A.4.3 شیدر قطعه — ۶۲۰
- A.5 تصویرسازی پرسپکتیو — ۶۲۱
- A.5.1 کد برنامه کاربردی — ۶۲۱
- A.5.2 شیدر رأس — ۶۲۵
- A.5.3 شیدر قطعه — ۶۲۶
- A.6 مکعب چرخان سایهزده — ۶۲۶
- A.6.1 کد برنامه کاربردی — ۶۲۶
- A.6.2 شیدر رأس — ۶۳۱
- A.6.3 شیدر قطعه — ۶۳۲
- A.7 نورپردازی بهازای هر قطعه برای مدل کره — ۶۳۲
- A.7.1 کد برنامه کاربردی — ۶۳۲
- A.7.2 شیدر رأس — ۶۳۷
- A.7.3 شیدر قطعه — ۶۳۸
- A.8 مکعب چرخان دارای بافت — ۶۳۸
- A.8.1 کد برنامه کاربردی — ۶۳۸
- A.8.2 شیدر رأس — ۶۴۴
- A.8.3 شیدر قطعه — ۶۴۵
- A.9 شکل با پیمایش درخت — ۶۴۶
- A.9.1 کد برنامه کاربردی — ۶۴۶
- A.9.2 شیدر رأس — ۶۵۹
- A.9.3 شیدر قطعه — ۶۵۹
- A.10 رندرکننده قوری — ۶۵۹
- A.10.1 کد برنامه کاربردی — ۶۵۹
- A.10.2 شیدر رأس — ۶۶۴
- A.10.3 شیدر قطعه — ۶۶۴
ضمیمه B: فضاها — صفحه ۶۶۵
- B.1 اسکالرها — ۶۶۵
- B.2 فضاهای برداری — ۶۶۶
ادامه ضمیمه B
- B.3 فضاهای آفین — ۶۶۸
- B.4 فضاهای اقلیدسی — ۶۶۹
- B.5 تصویرسازیها — ۶۷۰
- B.6 متعامدسازی Gram-Schmidt — ۶۷۱
- منابع پیشنهادی — ۶۷۲
- تمرینها — ۶۷۲
ضمیمه C: ماتریسها — صفحه ۶۷۵
- C.1 تعریفها — ۶۷۵
- C.2 عملیات ماتریسی — ۶۷۶
- C.3 ماتریسهای سطری و ستونی — ۶۷۷
- C.4 رتبه — ۶۷۸
- C.5 تغییر نمایش — ۶۷۹
- C.6 ضرب برداری — ۶۸۱
- C.7 مقدارهای ویژه و بردارهای ویژه — ۶۸۲
- C.8 کلاسهای بردار و ماتریس — ۶۸۳
- منابع پیشنهادی — ۶۸۴
- تمرینها — ۶۸۴
ضمیمه D: خلاصه توابع OpenGL — صفحه ۶۸۷
- D.1 توابع مقداردهی اولیه و پنجره — ۶۸۷
- D.2 اشیای بافر رأس — ۶۸۹
- D.3 تعامل — ۶۹۰
- D.4 تنظیم ویژگیها و فعالسازی قابلیتها — ۶۹۲
- D.5 توابع بافت و تصویر — ۶۹۳
- D.6 دستکاری حالت و بافر — ۶۹۴
- D.7 توابع پرسوجو — ۶۹۴
- D.8 توابع GLSL — ۶۹۵
منابع — ۶۹۹
نمایه توابع OpenGL — ۷۰۹
نمایه موضوعی — ۷۱۱
پیشگفتار
موارد جدید در ویرایش ششم
- استفاده سراسری از OpenGL مدرن مبتنی بر شیدر.
- عدم استفاده از توابع OpenGL که از نسخه 3.1 منسوخ اعلام شدهاند.
- جزئیات بیشتر درباره پیادهسازی تبدیلها و مشاهده، هم در کد برنامه کاربردی و هم در شیدرها.
- سازگاری با OpenGL ES 2.0 و WebGL.
- استفاده از C++ بهجای C.
- افزودن کلاسهای بردار و ماتریس برای ساخت کد کاربردی سازگار با OpenGL Shading Language (GLSL).
- بحث درباره نورپردازی بهازای هر رأس و بهازای هر قطعه.
- افزودن مثلثبندی چندضلعی و Delaunay.
- مقدمهای بر رندر حجمی.
- بازنویسی همه نمونههای کد برای سازگاری با OpenGL 3.1.
- افزودهشدن همنویسنده جدید، Dave Shreiner، نویسنده OpenGL Programming Guide.
این کتاب مقدمهای بر گرافیک رایانهای است که بر برنامهنویسی کاربردها تأکید دارد. ویرایش نخست که در سال ۱۹۹۷ منتشر شد، تا حدی انقلابی بود؛ زیرا از یک کتابخانه گرافیکی استاندارد و رویکرد بالا به پایین استفاده میکرد. در ۱۳ سال بعد و طی پنج ویرایش، بیشتر کلاسهای مقدماتی گرافیک رایانهای و تقریباً همه کتابهای رقیب همین رویکرد را پذیرفتند.
تغییرات اساسی سختافزار گرافیکی در چند سال اخیر به تغییرات بزرگی در نرمافزار گرافیکی انجامیده است. در پانزده سال نخست OpenGL، نسخههای جدید همواره با تضمین سازگاری رو به عقب منتشر میشدند. امکان استفاده دوباره از کد هنگام ارتقای نرمافزار زیرین، هم برای توسعهدهندگان کاربردها و هم برای مدرسهای درس گرافیک یک مزیت مهم بود. OpenGL 3.0 تغییرات عمدهای را اعلام کرد؛ یکی از مهمترین آنها این بود که از OpenGL 3.1 به بعد بسیاری از پرکاربردترین توابع منسوخ میشوند. این فاصلهگیری ریشهای از نسخههای پیشین، بازتاب تغییراتی بود که برای استفاده از توانایی واحدهای گرافیکی برنامهپذیر جدید یا GPUها لازم بود.
این تغییرات بخشی از OpenGL ES 2.0 نیز هستند که برای توسعه برنامه روی دستگاههای همراه مانند تلفن و تبلت به کار میرود، و همینطور بخشی از WebGL که در بسیاری از مرورگرهای جدید پشتیبانی میشود.
ما بهعنوان نویسندگان پنج ویرایش پیشین این کتاب و نیز OpenGL Programming Guide و OpenGL ES 2.0 Programming Guide با این پرسش روبهرو شدیم که چگونه باید به این دگرگونیها واکنش نشان دهیم. سالها کتاب نوشته و دورههای مقدماتی OpenGL را در SIGGRAPH تدریس کرده بودیم. مشاهده کردیم تقریباً هیچکس در جامعه دانشگاهی، و نیز برنامهنویسان کاربردی بیرون از دنیای بازیهای سطح بالا، از این تغییرات آگاه نیستند؛ حتی بسیاری از همکارانی که از آنها خبر داشتند، باور نمیکردند بتوان این مفاهیم را در سطح مقدماتی آموزش داد. همین موضوع برای ما یک چالش جذاب بود. کار را با یک دوره کوتاه نیمروزه در SIGGRAPH آغاز کردیم و نتیجه نشان داد که میتوان به فردی بدون تجربه قبلی برنامهنویسی گرافیک آموخت با اندکی کار بیشتر نسبت به نسخههای قدیمی OpenGL، یک برنامه کاربردی غیرساده و مبتنی بر شیدر بنویسد.
هنگام آمادهسازی این ویرایش، دلایل دیگری نیز یافتیم که ما را متقاعد کرد این رویکرد نهتنها شدنی است، بلکه برای یادگیری گرافیک رایانهای بهتر هم هست. تا همین اواخر یکی از مزایای OpenGL را این میدانستیم که روی Windows، Linux و Mac OS X در دسترس است و دانشجو میتواند در محیط دلخواه خود کار کند. با OpenGL ES و WebGL اکنون دانشجو میتواند برای تلفن همراه یا مرورگر وب نیز برنامه بسازد. باور داریم این امکان دانشجویان و مدرسها را بیشتر به گرافیک رایانهای علاقهمند میکند و فرصتهای آموزشی و تجاری فراوانی میگشاید.
از نظر ما مهمتر از آن، حذف بسیاری از مقادیر پیشفرض و خط لوله با عملکرد ثابت در نسخههای جدید OpenGL است. در نگاه نخست ممکن است تصور شود این حذف، تدریس درس مقدماتی را بسیار دشوارتر میکند. شاید کمی دشوارتر شود، اما به اعتقاد ما بسیار بهتر خواهد بود. بسیاری از دانشجویان به توابع آماده متکی میشدند و چندان به اصولی که کتاب و مدرس قصد آموزش آنها را داشتند توجه نمیکردند. وقتی توابع داخلی میتوانستند مشاهده پرسپکتیو یا نورپردازی را انجام دهند، چه نیازی به فهم سازوکار آن احساس میشد؟ اکنون که آن توابع حذف شدهاند و دانشجو باید برای انجام این کارها شیدر خود را بنویسد، ناگزیر است کار را با درک اصول و ریاضیات زیربنایی آغاز کند.
رویکرد بالا به پایین
پیشرفتهای اخیر و موفقیت پنج ویرایش نخست، باور ما را به رویکرد بالا به پایین و برنامهمحور برای آموزش مقدماتی گرافیک رایانهای تقویت میکند. هرچند بسیاری از گروههای علوم رایانه و مهندسی اکنون بیش از یک درس گرافیک ارائه میکنند، بیشتر دانشجویان تنها یک درس خواهند گذراند. این درس معمولاً پس از آن ارائه میشود که دانشجو برنامهنویسی، ساختار داده، الگوریتم، مهندسی نرمافزار و ریاضیات پایه را آموخته است. درس گرافیک رایانهای به مدرس اجازه میدهد بر این دانشها به روشی هم آموزنده و هم جذاب بنا کند. هدف ما این است که دانشجو هرچه زودتر برنامههای سهبعدی بنویسد. الگوریتمهای سطح پایین مانند رسم خط یا پرکردن چندضلعی را میتوان بعدتر، پس از آنکه دانشجو عملاً گرافیک تولید میکند، بررسی کرد.
John Kemeny، از پیشگامان آموزش رایانه، از تشبیه آشنای خودرو استفاده میکرد: برای باسواد بودن لازم نیست بدانید زیر کاپوت چه میگذرد، اما اگر برنامهنویسی ندانید بهجای رانندگی در صندلی عقب خواهید نشست. همین تشبیه درباره شیوه آموزش گرافیک رایانهای نیز صدق میکند. یک رویکرد، رویکرد الگوریتمی است که در آن همه چیز درباره کارکرد خودرو—موتور، جعبهدنده و فرایند احتراق—آموزش داده میشود. رویکرد دوم، رویکرد پیمایشی است: یک راننده استخدام کنید، عقب بنشینید و جهان را همچون تماشاگر ببینید. رویکرد سوم، یعنی رویکرد برنامهنویسی که در این کتاب برگزیدهایم، به شما رانندگی و رساندن خود به هر مقصد دلخواه را میآموزد. به تعبیر تبلیغ قدیمی اجاره خودرو، هدف این است که شما در صندلی راننده قرار بگیرید.
برنامهنویسی با OpenGL و C++
وقتی Ed بیش از ۲۵ سال پیش تدریس گرافیک رایانهای را آغاز کرد، بزرگترین مانع برای اجرای یک درس برنامهمحور و نوشتن کتاب درسی برای آن، نبود یک کتابخانه گرافیکی یا رابط برنامهنویسی کاربردی پذیرفتهشده بود. هزینه بالا، دسترسی محدود، عمومیت کم و پیچیدگی زیاد از مشکلات اصلی بودند. توسعه OpenGL بیشتر دشواریهایی را که بسیاری از ما با APIهایی مانند GKS و PHIGS یا با نرمافزارهای دستساز تجربه کرده بودیم برطرف کرد. امروزه OpenGL روی همه پلتفرمها پشتیبانی میشود، همراه Microsoft Windows و Mac OS X عرضه میشود، برای تقریباً همه کارتهای گرافیکی Driver وجود دارد و API سازگاری به نام Mesa نیز در بسیاری از توزیعهای Linux موجود است.
درس گرافیک بسیار بیش از استفاده از یک API خاص را آموزش میدهد، اما یک API خوب آموزش موضوعات کلیدی مانند گرافیک سهبعدی، نورپردازی و سایهزنی، گرافیک Client-Server، مدلسازی و الگوریتمهای پیادهسازی را آسانتر میکند. به باور ما قابلیتهای گسترده OpenGL و معماری روشن آن، پایهای قوی برای آموزش جنبههای نظری و عملی این حوزه و مفاهیم پیشرفتهای مانند نگاشت بافت، ترکیب تصاویر و شیدرهای برنامهپذیر فراهم میآورد.
Ed حدود پانزده سال پیش کلاسهای خود را به OpenGL منتقل کرد و نتیجه برای او شگفتآور بود. تا میانه نیمسال، هر دانشجو میتوانست برنامهای سهبعدی با پیچیدگی متوسط بنویسد که نیازمند درک مشاهده سهبعدی و ورودی رویدادمحور بود؛ نتیجهای که در سالهای قبل هرگز به آن نزدیک نشده بود. همان کلاس زمینه ویرایش نخست این کتاب را فراهم کرد.
این کتاب، کتاب درسی گرافیک رایانهای است نه راهنمای جامع OpenGL. بنابراین همه جنبههای API را پوشش نمیدهد و فقط آنچه برای تسلط بر محتوای کتاب لازم است توضیح میدهد. OpenGL در سطحی ارائه شده که کاربران APIهای دیگر نیز بتوانند مطالب را بدون دشواری جدی دنبال کنند.
برخلاف ویرایشهای قبلی، زبان غالب برنامهنویسی در این ویرایش C++ است نه C. دلیل اصلی به OpenGL Shading Language یا GLSL مربوط میشود که برای نوشتن شیدرهای کنترلکننده GPU استفاده میشود. GLSL زبانی شبیه C است که نوعهای داده اتمی شامل بردارها و ماتریسها دارد و عملگرهای پایه برای کار با آنها Overload شدهاند.
همه نسخههای مدرن OpenGL از هر برنامه کاربردی میخواهند دو شیدر فراهم کند؛ ازاینرو دانشجو باید از قابلیتهایی استفاده کند که در C++ نیز پشتیبانی میشوند. با استفاده از همین بخش محدود C++—کلاسهای ساده، سازندهها و عملگرهای Overloadشده—میتوان مفاهیم بنیادی گرافیک مانند تبدیلها و نورپردازی را در برنامه کاربردی یا در شیدر با کدی تقریباً یکسان پیادهسازی کرد. همچنین کلاسهای ساده ماتریس و بردار ارائهشده در وبسایت کتاب، کد را کوتاهتر و روشنتر میکنند. دانشجویانی که با Java یا C شروع کردهاند نیز نباید در فهم کد کتاب مشکل جدی داشته باشند.
مخاطبان کتاب
این کتاب برای دانشجویان کارشناسی سالهای پایانی و دانشجویان سال نخست تحصیلات تکمیلی در علوم رایانه و مهندسی، و نیز دانشجویان رشتههای دیگر که مهارت برنامهنویسی خوبی دارند مناسب است. برای بسیاری از متخصصان نیز کاربردی خواهد بود. مجموعاً بیش از ۱۰۰ دوره کوتاه برای متخصصان تدریس کردهایم و تجربه ما با این فراگیران غیرسنتی تأثیر زیادی بر انتخاب مطالب کتاب داشته است.
پیشنیازهای کتاب شامل مهارت مناسب برنامهنویسی در C++، Java یا C؛ درک ساختارهای داده پایه مانند فهرست پیوندی و درخت؛ و آشنایی مقدماتی با جبر خطی و مثلثات است. مشاهده کردهایم پیشزمینه ریاضی دانشجویان علوم رایانه، چه کارشناسی و چه تحصیلات تکمیلی، بسیار متفاوت است؛ بنابراین مقدار قابلتوجهی از جبر خطی و هندسه لازم برای گرافیک بنیادی را در خود متن گنجاندهایم.
سازماندهی کتاب
فصل ۱ نمایی کلی از حوزه ارائه میکند و تشکیل تصویر با ابزارهای نوری را معرفی میکند؛ بنابراین از همان آغاز وارد مفاهیم سهبعدی میشویم. فصل ۲ برنامهنویسی با OpenGL را معرفی میکند. نخستین برنامه نمونه دوبعدی است، اما در بستری سهبعدی قرار دارد و به توسعه سهبعدی منتهی میشود. در همین فصل گرافیک تعاملی و برنامههای گرافیکی رویدادمحور نیز معرفی میشوند. فصلهای ۳ و ۴ بر مفاهیم سهبعدی تمرکز دارند: فصل ۳ تعریف و دستکاری اشیای سهبعدی را بررسی میکند و فصل ۴ به مشاهده آنها میپردازد. فصل ۵ تعامل نور و ماده و سایهزنی را معرفی میکند. این فصلها بهتر است به همین ترتیب تدریس شوند و حدود ده هفته از یک نیمسال پانزدههفتهای را پوشش میدهند.
شش فصل بعدی را تقریباً میتوان با هر ترتیبی خواند. هر شش فصل تا حدی باز هستند و میتوان آنها را در سطح مروری یا با تمرکز عمیق بر موضوعهای برگزیده تدریس کرد. فصل ۶ رسترسازی را مرور میکند و برای هر گام پایه مانند برش، تولید خط و پرکردن چندضلعی یک یا دو الگوریتم اصلی ارائه میدهد. فصل ۷ بسیاری از تواناییهای گسسته جدیدی را معرفی میکند که اکنون سختافزار گرافیکی و OpenGL پشتیبانی میکنند و همگی بهنوعی با بافرهای مختلف کار دارند. فصل با بحث کوتاهی درباره مسائل Aliasing در گرافیک رایانهای پایان مییابد. فصلهای ۶ و ۷ بحث خط لوله مشاهده استاندارد مورد استفاده همه سامانههای گرافیک تعاملی را تکمیل میکنند.
فصل ۸ مجموعهای از موضوعها را دربر میگیرد که بهطور کلی زیر عنوان مدلسازی سلسلهمراتبی قرار میگیرند؛ از ساخت مدلهایی که روابط میان اجزای یک مدل را در خود کپسوله میکنند تا رویکردهای سطحبالا برای گرافیک روی اینترنت. این فصل مقدمهای بر گرافهای صحنه و OpenSceneGraph نیز ارائه میدهد. فصل ۹ چند روش رویهای مانند سامانههای ذرهای، فراکتالها و نویز رویهای را معرفی میکند. منحنیها و سطوح، از جمله سطوح تقسیمبندی، در فصل ۱۰ بررسی میشوند. فصل ۱۱ رویکردهای جایگزین رندر را مرور میکند و شامل بحث گستردهتر رهگیری پرتو و رادیوسیتی و مقدمهای بر رندر مبتنی بر تصویر و رندر موازی است.
برنامهها که بیشتر از بخش نخست کتاب هستند در ضمیمه A آمدهاند و بهصورت برخط نیز در دسترساند. ضمیمههای B و C مرور ریاضیات پیشنیاز را ارائه میکنند و ضمیمه D خلاصهای از توابع OpenGL مورد استفاده در کتاب است.
تغییرات نسبت به ویرایش پنجم
واکنش خوانندگان به پنج ویرایش نخست بسیار مثبت بود، بهویژه در مورد استفاده از OpenGL و رویکرد بالا به پایین. هر ویرایش برای همگامی با تحولات حوزه مطالبی افزوده بود، اما ویرایش پنجم با معرفی شیدرهای برنامهپذیر و GLSL تغییر مهمی ایجاد کرد. این بخش تا حدی اختیاری بود، زیرا نسخههای موجود OpenGL سازگاری رو به عقب داشتند و بسیاری از مدرسها بر شش فصل نخست تمرکز میکردند و به شیدرهای برنامهپذیر نمیرسیدند.
همانطور که در آغاز پیشگفتار اشاره شد، در OpenGL مدرن هر برنامه باید شیدرهای خود را فراهم کند. بسیاری از توابع پایه نسخههای قبلی، از جمله توابع تعیین هندسه، تبدیلها و پارامترهای نورپردازی، منسوخ شدهاند؛ بنابراین شیدرهای برنامهپذیر و GLSL باید از فصل ۲ معرفی شوند. بسیاری از مثالها همان خروجی ویرایشهای پیشین را تولید میکنند، اما کد آنها بسیار متفاوت است.
مطالب اصلی تعامل را در فصل ۲ ادغام کردیم و فصل جداگانه ورودی و تعامل را حذف کردیم. فصل ۲ در نتیجه کمی طولانیتر شده است، ولی در مقایسه با ویرایشهای قبلی، به نظر ما مطالب افزوده درباره شیدرهای برنامهپذیر فقط اندکی زمان واگذاری نخستین تمرین برنامهنویسی را به تأخیر میاندازد.
شیدرهای برنامهپذیر به برنامهنویس اجازه میدهند انتخاب کند بسیاری از قابلیتهای اصلی گرافیک کجا اجرا شوند. مطالب را طوری بازسازماندهی کردهایم که گزینههای مربوط به هر موضوع کنار هم دیده شوند؛ برای نمونه محاسبه نورپردازی در برنامه کاربردی، شیدر رأس و شیدر قطعه همگی در فصل ۵ آمدهاند.
با توجه به بازخورد مثبت درباره مطالب اصلی فصلهای ۱ تا ۶ در ویرایشهای پیشین، تلاش کردهایم تغییرات این فصلها—که اکنون فصلهای ۱ تا ۵ هستند—حداقل باشد. همچنان فصلهای ۱ تا ۵ را هسته هر درس مقدماتی گرافیک رایانهای میدانیم. فصلهای ۶ تا ۱۱ را میتوان تقریباً با هر ترتیب بهصورت مرور در یک درس یکنیمساله یا بهعنوان پایه یک دوره دونیمساله استفاده کرد.
مواد پشتیبان
پشتیبانی کتاب از طریق وبسایت نویسنده و سایت Addison-Wesley ارائه شده است. مواد در دسترس همه خوانندگان شامل این موارد است:
- منابع اطلاعاتی درباره OpenGL؛
- دستورالعمل آغاز کار با OpenGL روی سامانههای پرکاربرد؛
- مطالب تکمیلی برای نوشتن برنامههای OpenGL مقاومتر؛
- کد برنامهها؛
- پاسخ تمرینهای منتخب؛
- اسلایدهای PowerPoint درس؛
- شکلهای کتاب.
مواد پشتیبان بیشتر، از جمله پاسخ همه تمرینهای غیر برنامهنویسی، فقط برای مدرسهایی در دسترس است که کتاب را برای استفاده کلاسی انتخاب کردهاند. برای دریافت اطلاعات دسترسی باید با نماینده Addison-Wesley مؤسسه آموزشی تماس گرفته شود.
سپاسگزاری
Ed طی سالهای گذشته خوششانس بوده که با دانشجویان بسیار خوبی در دانشگاه نیومکزیکو کار کرده است. همین دانشجویان نخستین کسانی بودند که او را به OpenGL علاقهمند کردند و او چیزهای زیادی از آنها آموخت. از جمله Hue (Bumgarner-Kirby) Walker، Ye Cong، Pat Crossno، Tommie Daniel، Chris Davis، Lisa Desjarlais، Kim Edlund، Lee Ann Fisk، Maria Gallegos، Brian Jones، Christopher Jordan، Max Hazelrigg، Sheryl Hurley، Thomas Keller، Ge Li، Pat McCormick، Al McPherson، Ken Moreland، Martin Muller، David Munich، Jim Pinkerton، Jim Prewett، Dave Rogers، Hal Smyer، Takeshi Hakamata، Dave Vick، Brian Wylie و Jin Xiong. بسیاری از مثالهای صفحات رنگی توسط همین دانشجویان ساخته شدهاند.
ویرایش نخست کتاب در دوره فرصت مطالعاتی Ed نوشته شد و بخشهای مختلف آن در پنج کشور شکل گرفت. این کار بدون کمک افراد و مؤسساتی که امکانات خود را در اختیار او گذاشتند ممکن نبود. او از Jonas Montilva و Chris Birkbeck در Universidad de los Andes در ونزوئلا؛ Rodrigo Gallegos و Aristides Novoa در Universidad Tecnologica Equinoccial در اکوادور؛ Long Wen Chang در National Tsing Hua University در تایوان؛ و Kin Hong Wong و Pheng Ann Heng در Chinese University of Hong Kong بسیار سپاسگزار است. Ramiro Jordan از ISTEC و دانشگاه نیومکزیکو بسیاری از این سفرها را ممکن کرد. John Brayer و Jason Stewart در دانشگاه نیومکزیکو و Helen Goldstein در Addison-Wesley نیز هرجا Ed بود، راهی برای رساندن اقلام مورد نیاز به او پیدا میکردند. وبسایت او شرح ماجراهای نگارش ویرایش نخست را در خود دارد.
David Kirk و Mark Kilgard در NVIDIA با لطف خود کارتهایی برای آزمایش بسیاری از الگوریتمها در اختیار نویسنده گذاشتند. افراد دیگری نیز کمک مهمی کردند، از جمله Ben Bederson، Gonzalo Cartagenova، Tom Caudell، Kathi Collins و دیگرانی که نامشان در ادامه آمده است.
ادامه سپاسگزاری شامل Kathleen Danielson، Roger Ehrich، Robert Geist، Chuck Hansen، Mark Henne، Bernard Moret، Dick Nordhaus، Helena Saona، Dave Shreiner، Vicki Shreiner، Gwen Sylvan و Mason Woo است. جامعه OpenGL نیز مدیون Mark Kilgard، Brian Paul و Nate Robins است که نرمافزارهایی ایجاد کردند تا کد OpenGL روی پلتفرمهای مختلف توسعه یابد.
در دانشگاه نیومکزیکو، آزمایشگاه Art, Research, Technology, and Science یا ARTS Lab و مرکز High Performance Computing از بسیاری از پروژههای Ed پشتیبانی کردهاند. گروه علوم رایانه، Arts Technology Center در دانشکده هنرهای زیبا، بنیاد National Science Foundation، Sandia National Laboratories و Los Alamos National Laboratory از بسیاری از دانشجویان و پروژههای پژوهشی او که به بخشهایی از این کتاب انجامید پشتیبانی کردهاند. David Beining، که پیشتر در Lodestar Astronomy Center و اکنون در ARTS Lab است، پشتیبانی فراوانی از پروژه Fulldome ارائه کرده است. Sheryl Hurley، Christopher Jordan، Laurel Ladwig، Jon Strawn و Hue (Bumgarner-Kirby) Walker از طریق پروژههای Fulldome برخی تصاویر صفحات رنگی را فراهم کردند. Hue Walker جلدهای زیبای سه ویرایش قبلی را ساخته و تصاویر او پایه جلد این ویرایش نیز بوده است.
Dave ابتدا از Ed تشکر میکند که از او خواست در این پروژه مشارکت کند. آن دو سالها درباره OpenGL و شیوه آموزش آن ایده ردوبدل کردهاند و گسترش این مفاهیم برای مخاطبان تازه هیجانانگیز است. Dave از همکاران سابق خود در Silicon Graphics Computer Systems که OpenGL را ایجاد کردند و از OpenGL Working Group در Khronos Group که API را همچنان تکامل میدهند سپاسگزاری میکند. همانگونه که Ed اشاره کرد، SIGGRAPH در توسعه این مواد نقش مهمی داشته و بهسبب فراهم کردن دسترسی به شرکتکنندگان مشتاق برای آزمودن ایدههای آموزشی نیز سزاوار تشکر است.
بازبینهای پیشنویس دستنوشته دیدگاههای گوناگونی درباره محتوای لازم و سطح ارائه عرضه کردند. فهرست بازبینهای ویرایشهای قبلی شامل Gur Saran Adhar، Mario Agrular، Michael Anderson، C. S. Bauer، Marty Barrett، Kabekode V. Bhat، Eric Brown، Robert P. Burton، Sam Buss، Kai H. Chang، Ron DiNapoli، Eric Alan Durant، David S. Ebert، Richard R. Eckert، Jianchao (Jack) Han، Chenyi Hu، Mark Kilgard، Lisa B. Lancor، Chung Lee، John L. Lowther، R. Marshall، Hugh C. Masterman، Bruce A. Maxwell، James R. Miller، Rodrigo Obando، Andrea Salgian، Lori L. Scarlatos، Han-Wei Shen، Oliver Staadt، Stephen L. Stepoway، Bill Toll، Michael Wainer و افراد دیگری است که نامشان در صفحه بعد ادامه مییابد. هرچند تصمیمهای نهایی همیشه بازتاب نظر آنان نبود و دیدگاهها گاهی تفاوت زیادی داشت، هر بازبین ما را واداشت درباره تکتک صفحات دستنوشته دوباره بیندیشیم.
فهرست بازبینهای پیشین با Yang Wang، Steve Warren، Mike Way، George Wolberg، Xiaoyu Zhang، Ye Zhao و Ying Zhu ادامه مییابد.
بازبینهای این ویرایش حمایت ویژهای داشتند: Norman I. Badler، Mike Bailey، Bedrich Benes، Isabelle Bichindaritz، Cory D. Boatright، Eric Brown، James Cremer، John David N. Dionisio، W Randolph Franklin، Natacha Gueorguieva، George Kamberov، Hugh Masterman، Tim McGraw، Jon A. Preston و Bill Toll. از آنان خواسته شده بود مطالبی را بررسی کنند که در درسهای خودشان نبود و پذیرش آنها میتوانست ساختار درس را بهطور جدی تغییر دهد. همه اهمیت این رویکرد را تشخیص دادند و آمادگی خود را برای بهکارگیری آن نشان دادند.
از تمام گروه تولید Addison-Wesley نیز سپاسگزاری میکنیم. ویراستاران Ed یعنی Peter Gordon، Maite Suarez-Rivas و Matt Goldstein طی شش ویرایش این کتاب و کتاب مقدماتی OpenGL همکارانی بسیار خوشایند بودهاند. Paul Anagnostopoulos در Windfall Software طی شش ویرایش در حل مشکلات TEX همواره یاریرسان بوده است. Ed بهویژه از Lyn Dupré سپاسگزار است؛ اگر خوانندگان پیشنویس اولیه ویرایش نخست را میدیدند، بهتر متوجه میشدند Lyn چه تحول چشمگیری در یک دستنوشته ایجاد میکند.
Ed بهطور خاص از همسرش Rose Mary Molnar یاد میکند که شکلهای نخستین کتاب گرافیک او را تهیه کرد؛ بسیاری از آن شکلها پایه شکلهای این کتاب هستند. احتمالاً فقط نویسندگان دیگر میتوانند میزان تلاش لازم در فرایند تولید کتاب و مشارکت و فداکاری شریک زندگی نویسنده را کاملاً درک کنند. تقدیم کتاب، هرچند صمیمانه، باز هم قدردانی ناکافی از همه کمکهای Rose Mary به کار Ed است.
Dave نیز از حمایت و تشویق همسرش Vicki یاد میکند؛ بدون او خلق آثاری از این دست ممکن نبود. او علاوه بر گرمی و همراهی، بازخوردی بسیار ارزشمند درباره شیوه ارائه و مواد آموزشی میدهد و شریکی مهم اما کمتر دیدهشده در همه فعالیتهای OpenGL Dave بوده است.
Ed Angel
Dave Shreiner
گرافیک رایانهای تعاملی
رویکرد بالا به پایین با OpenGL مبتنی بر شیدر
ویرایش ششم
این صفحه عمداً خالی گذاشته شده است.