OpenGL Tutorial
OpenGL Tutorial
ﺑﻬﺎر 91
ﺗﻘﺪﯾﻢ ﺑﻪ :
اﺣﻤﺪ ﭘﻮررﺿﺎ
2
ﻣﻘﺪﻣﻪ :
OpenGL ،ﻣﺨﻔﻒ ﮐﻠﻤﺎت اﺑﺘﺪا از ﻧﺎم OpenGLﺷﺮوع ﻣﯽ ﮐﻨﯿﻢ ﮐﻪ ﻧﺸﺎن دﻫﻨﺪه ﻣﻔﻬﻮم آن ﻧﯿﺰ ﻣﯽ ﺑﺎﺷﺪ
Open source Graphic Libraryﻣﯽ ﺑﺎﺷﺪ ،ﺧﻮب اﺑﺘﺪا ﻣﺨﺘﺼﺮي درﺑﺎره ﻧﺮم اﻓﺰار ﻫﺎي open sourceﯾﺎ ﻫﻤﺎن ﻣﺘﻦ
ﺑﺎز ﺗﻮﺿﯿﺢ ﻣﯽ دﻫﯿﻢ :
ﺣﺘﻤﺎ ﺑﺎ ﻧﺮم اﻓﺰار ﻫﺎي ﻣﺘﻦ ﺑﺎز ﯾﺎ ﺑﻪ اﺻﻄﻼح اﺻﻠﯽ open sourceآﺷﻨﺎﯾﯽ دارﯾﺪ و ﻣﯽ داﻧﯿﺪ ﮐﻪ اﯾﻦ ﻧﺮم اﻓﺰار ﻫﺎ ﺑﻪ ﺻﻮرت راﯾﮕﺎن
در اﺧﺘﯿﺎر ﻋﻤﻮم ﻗﺮار ﻣﯽ ﮔﯿﺮﻧﺪ و ﺗﻬﯿﻪ ﮐﻨﻨﺪه ﮔﺎن آﻧﻬﺎ ﺳﻮرس اﺻﻠﯽ ﺑﺮﻧﺎﻣﻪ را ﺑﯿﺸﺘﺮ ﺑﻪ ﻣﻨﻈﻮر ﻋﯿﺐ ﯾﺎﺑﯽ و ﮐﺎﻫﺶ ﺧﻄﺎ ﻫﺎ و bugﻫﺎي
اﺣﺘﻤﺎﻟﯽ ﺑﺮﻧﺎﻣﻪ در اﺧﺘﯿﺎر ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﺎن ﻗﺮار ﻣﯽ دﻫﻨﺪ ﺗﺎ ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﺎن و ﻋﻼﻗﻤﻨﺪان ﺑﺘﻮاﻧﻨﺪ ﺑﻪ راﺣﺘﯽ ﮐﺪ آن ﺑﺮﻧﺎﻣﻪ را وﯾﺮاﯾﺶ ﮐﺮده و
ﺗﻐﯿﯿﺮات دﻟﺨﻮاه را روي آن اﻧﺠﺎم دﻫﻨﺪ ) ﯾﮑﯽ از ﻣﻌﺮوﻓﺘﺮﯾﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎي open surceﺳﯿﺴﺘﻢ ﻋﺎﻣﻞ ﻟﯿﻨﻮﮐﺲ اﺳﺖ و اﻟﺒﺘﻪ ﭘﯿﺸﺮﻓﺖ
ﻫﺎ و ﻣﻮﻓﻘﯿﺖ ﻫﺎي ﺟﺪﯾﺪ آن را ،ﮐﻪ ﻣﻬﻤﺘﺮﯾﻦ ﻋﺎﻣﻞ اﯾﻦ ﭘﯿﺸﺮﻓﺖ ﻫﺎ ﻫﻤﯿﻦ ﻣﺘﻦ ﺑﺎز ﺑﻮدن ﻟﯿﻨﻮﮐﺲ ﺑﻮده و اﺳﺖ ( .
openglﻫﻢ ﻫﻤﺎﻧﻄﻮر ﮐﻪ از ﻧﺎم آن ﻣﺸﺨﺺ اﺳﺖ ﺟﺰء ﻧﺮم اﻓﺰار ﻣﺘﻦ ﺑﺎز ﺑﻪ ﺷﻤﺎر ﻣﯽ رود ﮐﻪ ﯾﮏ از ﻣﺰﯾﺖ ﻫﺎ و اﻣﺘﯿﺎزات آن ﻧﯿﺰ ﺑﻪ
ﺷﻤﺎر ﻣﯽ رود ،ﺣﺎل ﻧﻮﺑﺖ ﺑﻪ graphic libraryﻣﯽ رﺳﺪ :
graphic libraryﯾﺎ ﻫﻤﺎن ﮐﺘﺎﺑﺨﺎﻧﻪ ﮔﺮاﻓﯿﮑﯽ ﺑﻪ ﻣﺠﻤﻮﻋﻪ ﮐﺘﺎﺑﺨﺎﻧﻪ ﻫﺎ ﯾﺎ ﮐﺎﻣﭙﻮﻧﻨﺖ ﻫﺎي ﮔﻔﺘﻪ ﻣﯽ ﺷﻮد ﮐﻪ ﺑﺮاي اﺳﺘﻔﺎده از
دﺳﺘﻮرات ﻣﺨﺼﻮص ﮔﺮاﻓﯿﮑﯽ ﺗﻬﯿﻪ ﺷﺪه اﺳﺖ و ﺑﺎ اﻟﺼﺎق ) ( includeآن ﻫﺎ ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺻﻠﯽ ) ﻫﻨﮕﺎم ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ ( ﻣﯽ ﺗﻮاﻧﯿﻢ ،از
دﺳﺘﻮرات ﮔﺮاﻓﯿﮑﯽ ﻣﺠﺎز ﺑﺮاي اﯾﺠﺎد راﺑﻄﻪ ﺑﺎ ﺑﺨﺶ ﮔﺮاﻓﯿﮏ ﺳﯿﺴﺘﻢ اﺳﺘﻔﺎده ﻧﻤﺎﯾﯿﻢ ) از ﺟﻤﻠﻪ ﮐﺎر ﻫﺎﯾﯽ ﮐﻪ ﺑﺎ ﮔﺮاﻓﯿﮏ ﺳﯿﺴﺘﻢ ﺳﺮ و ﮐﺎر
دارد ﻧﻮﺷﺘﻦ ﺑﺎزي ﻫﺎ و اﺷﮑﺎل ﺳﻪ ﺑﻌﺪي و دو ﺑﻌﺪي و ﮐﻼ ﺑﺮﻧﺎﻣﻪ ﻫﺎﯾﯽ ﮐﻪ ﺑﺎ ﻣﺎﻧﯿﺘﻮر در ارﺗﺒﺎط ﺑﺎﺷﻨﺪ (.
ﮐﺘﺎﺑﺨﺎﻧﻪ ﻫﺎ ﯾﺎ ﻫﻤﺎن ﻓﺎﯾﻞ ﻫﺎي ﺑﺎ ﭘﺴﻮﻧﺪ libﮐﻪ ﻣﺨﻔﻒ ﺷﺪه libraryﻣﯽ ﺑﺎﺷﺪ ،ﺑﻪ ﻣﻨﻈﻮر آﺳﺎن ﺗﺮ ﺷﺪن ﮐﺎر ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﺎن در
ﻣﻮﻗﻊ ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ اﯾﺠﺎد و ﺗﻬﯿﻪ ﻣﯽ ﺷﻮﻧﺪ ،ﺑﻪ اﯾﻦ ﺻﻮرت ﮐﻪ ﻣﺜﻼ ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ داﺧﻞ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺧﻮد از ﺗﺎﺑﻊ ﺧﺎﺻﯽ ﭼﻨﺪﯾﻦ ﺑﺎر )
ﺷﺎﯾﺪ ﻫﻢ ﺻﺪ ﻫﺎ و ﻫﺰاران ﺑﺎر ( ﺑﻪ ﺻﻮرت ﻣﺘﻮاﻟﯽ اﺳﺘﻔﺎده ﻣﯽ ﮐﻨﺪ ،ﺧﻮب ﻧﻮﺷﺘﻦ اﯾﻦ ﺗﺎﺑﻊ ﺧﺎص ﺑﻪ اﯾﻦ ﺗﻌﺪاد در ﮐﺪ اﺻﻠﯽ ﺑﺮﻧﺎﻣﻪ ﺣﺠﻢ
ﻓﺎﯾﻞ ﻧﻬﺎﯾﯽ را ﺑﺎﻻ ﺑﺮده و اﻟﺒﺘﻪ وﻗﺖ ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺲ را ﻫﻢ ﺧﻮاﻫﺪ ﮔﺮﻓﺖ ،اﯾﻨﺠﺎﺳﺖ ﮐﻪ ﮐﺘﺎﺑﺨﺎﻧﻪ ﻫﺎ ﯾﺎ libﻫﺎ وارد ﻋﻤﻞ ﻣﯽ ﺷﻮﻧﺪ و ﺗﺎﺑﻊ
ﺧﺎص را داﺧﻞ ﺧﻮد ﻗﺮار ﻣﯽ دﻫﻨﺪ ﺗﺎ ﻣﻮﻗﻊ ﻧﯿﺎز ﺑﻪ ﺗﺎﺑﻊ از آن اﺳﺘﻔﺎده ﺷﻮد .
اﯾﻦ ﻫﻢ از ﻣﻔﻬﻮم ، graphic libraryﺣﺎل ﺷﻤﺎ ﺑﺎ ﻣﻔﻬﻮم اﺳﻢ OpenGLﯾﺎ ﻫﻤﺎن Open source Graphic
Libraryآﺷﻨﺎﯾﯽ ﮐﺎﻣﻞ را دارﯾﺪ .
ﭘﺲ در اﯾﻨﺠﺎ ﻧﺘﯿﺠﻪ ﻣﯽ ﮔﯿﺮﯾﻢ ﮐﻪ OpenGLﯾﮏ زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ ﻧﯿﺴﺖ ،ﯾﮏ ﺳﺮي ﮐﺘﺎﺑﺨﺎﻧﻪ از ﭘﯿﺶ ﺗﻌﺮﯾﻒ ﺷﺪه ﻣﯽ ﺑﺎﺷﺪ ﮐﻪ
ﮐﺎر اﯾﻦ ﮐﺘﺎﺑﺨﺎﻧﻪ ارﺗﺒﺎط راﺣﺖ ﺗﺮ ﺑﺎ ﺑﺨﺶ ﺳﺨﺖ اﻓﺰاري ﮔﺮاﻓﯿﮏ ﺳﯿﺴﺘﻢ ﻣﯽ ﺑﺎﺷﺪ ،ﺑﺮاي درك ﺑﯿﺸﺘﺮ اﯾﻦ ﻣﻄﻠﺐ ﺑﺎﯾﺪ ﺗﻮﺿﯿﺤﯽ ﻫﻢ
درﺑﺎره راﺑﻂ ﻫﺎي ﻧﺮم اﻓﺰاري ﯾﺎ ﻫﻤﺎن APIﻫﺎ ﺑﺪﻫﯿﻢ :
ﺑﺮاي اﯾﻨﮑﻪ ﺑﺘﻮاﻧﯿﻢ ﺑﺎ ﺳﺨﺖ اﻓﺰار ﻫﺎي ﻣﻮﺟﻮد در ﺳﯿﺴﺘﻢ ﺧﻮد ﻣﺜﻞ ﮐﺎرت ﺷﺒﮑﻪ ،ﮐﺎرت ﮔﺮاﻓﯿﮏ ... ،ﺑﻪ ﺻﻮرت درﺳﺖ و ﺻﺤﯿﺢ ارﺗﺒﺎط
ﺑﺮﻗﺮار ﮐﻨﯿﻢ ) ﺑﻪ زﺑﺎن ﺧﻮد ﻣﺎﺷﯿﻦ ( اﺣﺘﯿﺎج ﺑﻪ راﺑﻂ ﻫﺎﯾﯽ دارﯾﻢ ﮐﻪ ﺑﺘﻮاﻧﻨﺪ اﯾﻦ ﮐﺎر را ﺑﻪ درﺳﺘﯽ اﻧﺠﺎم دﻫﻨﺪ ،ﻓﺮض ﮐﻨﯿﺪ ﯾﮏ ﻓﺎرﺳﯽ
زﺑﺎن ) ﮐﻪ زﺑﺎن دﯾﮕﺮي ﻫﻢ ﻧﻤﯽ داﻧﺪ ( ﺑﺎ ﯾﮏ اﻧﮕﻠﯿﺴﯽ زﺑﺎن ) ﮐﻪ او ﻫﻢ زﺑﺎن ﻓﺎرﺳﯽ را ﻧﻤﯽ داﻧﺪ ( ﺑﺮﺧﻮرد ﻣﯽ ﮐﻨﻨﺪ و ﻣﯽ ﺧﻮاﻫﻨﺪ ﺑﺎ ﻫﻢ
ﺻﺤﺒﺖ ﮐﻨﻨﺪ ،ﺑﻪ ﻧﻈﺮ ﺷﻤﺎ ﭼﺎره ﮐﺎر ﭼﯿﺴﺖ ؟ ﺧﻮب اوﻟﯿﻦ و ﺗﻨﻬﺎ ﮔﺰﯾﻨﻪ ﯾﮏ ﻣﺘﺮﺟﻢ ﻣﯽ ﺑﺎﺷﺪ ﮐﻪ ﻫﻢ زﺑﺎن ﻓﺎرﺳﯽ ﺑﺪاﻧﺪ و ﻫﻢ زﺑﺎن
3
اﻧﮕﻠﯿﺴﯽ ،ﺣﺎل آن دو ﺑﻪ راﺣﺘﯽ ﻣﯽ ﺗﻮاﻧﻨﺪ ﺑﺎ ﻫﻢ ﻣﮑﺎﺗﺒﻪ داﺷﺘﻪ ﺑﺎﺷﻨﺪ .در ﻣﻮرد ﮐﺎﻣﭙﯿﻮﺗﺮ ﻫﻢ دﻗﯿﻘﺎ ﺑﻪ ﻫﻤﯿﻦ ﺻﻮرت اﺳﺖ ،ﻧﺮم اﻓﺰار و
ﺳﺨﺖ اﻓﺰار ﮐﺎﻣﭙﯿﻮﺗﺮ زﺑﺎن ﻫﻢ دﯾﮕﺮ را ﻧﻤﯽ داﻧﻨﺪ و اﺣﺘﯿﺎج ﺑﻪ ﯾﮏ ﺳﺮي ﻣﺘﺮﺟﻢ ﻫﺎﯾﯽ ﺑﻪ ﻧﺎم APIدارﻧﺪ .
APIﻫﺎ راﺑﻂ ﻫﺎي ﻧﺮم اﻓﺰاري ﻫﺴﺘﻨﺪ ﮐﻪ زﺑﺎن ﺳﯿﺴﺘﻢ ) زﺑﺎن ﻣﺎﺷﯿﻦ ( و ﭼﮕﻮﻧﮕﯽ ارﺗﺒﺎط ﺑﺎ ﺳﺨﺖ اﻓﺰار را ﻣﯽ داﻧﻨﺪ .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل
ﻣﻦ ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺲ اﮔﺮ ﺑﺨﻮاﻫﻢ ﯾﮏ ﭘﯿﮑﺴﻞ از ﻣﺎﻧﯿﺘﻮر را روﺷﻦ ﮐﻨﻢ ﺑﻪ APIﻣﺮﺑﻮﻃﻪ ﻓﺮﻣﺎن ﻣﯽ دﻫﻢ ﮐﻪ اﯾﻦ ﮐﺎر را ) ﺑﺎ زﺑﺎﻧﯽ ﮐﻪ ﺑﻠﺪ
ﻫﺴﺘﯽ ( ﺑﺮاي ﻣﻦ اﻧﺠﺎم ﺑﺪه و ﻣﺴﺘﻘﯿﻢ ﺑﺎ ﺳﺨﺖ اﻓﺰار ﺻﺤﺒﺖ ﻧﺨﻮاﻫﻢ ﮐﺮد API ،ﻣﺮﺑﻮﻃﻪ دﺳﺘﻮر را ﮔﺮﻓﺘﻪ و ﺑﻪ ﺳﺨﺖ اﻓﺰار ﻣﯽ رﺳﺎﻧﺪ
،ﺑﻪ ﻫﻤﯿﻦ راﺣﺘﯽ ...
APIﻫﺎي ﻣﺨﺘﻠﻔﯽ ﺑﺮاي ﺑﺨﺶ ﻫﺎي ﻣﺨﺘﻠﻒ ﺳﺨﺖ اﻓﺰار وﺟﻮد دارد ،اﻣﺎ در اﯾﻨﺠﺎ و اﯾﻦ ﻣﻘﺎﻟﻪ APIﻫﺎي ﮔﺮاﻓﯿﮑﯽ ﻣﺪ ﻧﻈﺮ ﻣﺎ ﻣﯽ
ﺑﺎﺷﺪ ،ﮐﻪ ﻣﻌﺮوﻓﺘﺮﯾﻦ آﻧﻬﺎ OpenGlو DirectXﻣﯽ ﺑﺎﺷﻨﺪ .
اﻟﺒﺘﻪ ﺳﺨﺖ اﻓﺰار ﻫﺎي ﻣﻮﺟﻮد ﻧﯿﺰ ﺑﺎﯾﺪ از APIﻫﺎ ﭘﺸﺘﯿﺒﺎﻧﯽ ﮐﻨﻨﺪ ،ﮐﻪ ﺑﻌﻀﯽ ﺷﺮﮐﺖ ﻫﺎي ﺳﺎزﻧﺪه ﺳﺨﺖ اﻓﺰار و ﮐﺎرت ﻫﺎي ﮔﺮاﻓﯿﮑﯽ از
APIﻫﺎي OpenGLﭘﺸﺘﯿﺒﺎﻧﯽ و ﻫﻤﺎﯾﺖ ﻣﯽ ﮐﻨﻨﺪ و ﺑﻌﻀﯽ ﻫﻢ از DirectXﮐﻪ ﻣﺤﺼﻮل ﺷﺮﮐﺖ ﻣﺎﮐﺮوﺳﺎﻓﺖ اﺳﺖ .ﻫﺮ ﯾﮏ از
اﯾﻦ واﺳﻂ ﻫﺎي ﻧﺮم اﻓﺰاري OpenGlو DirectXﻣﻌﺎﯾﺐ و ﻣﺰاﯾﺎي ﺧﻮاص ﺧﻮد را دارﻧﺪ ﮐﻪ در اﯾﻨﺠﺎ ﻗﺼﺪ ﻣﻘﺎﯾﺴﻪ اﯾﻦ دو را ﻧﺪارم .
ﺳﺎزﻧﺪه OpenGLﯾﺎ ﺑﻬﺘﺮ ﺑﮕﻮﯾﯿﻢ ﺗﻮﺳﻌﻪ دﻫﻨﺪه و ﺑﻬﯿﻨﻪ ﮐﻨﻨﺪه آن ﺷﺮﮐﺖ Silicon Graphicsﻣﯽ ﺑﺎﺷﺪ ) ﮐﻪ ﺑﻪ اﺧﺘﺼﺎر SGI
ﻧﯿﺰ ﻧﺎﻣﯿﺪه ﻣﯽ ﺷﻮد و ﯾﮑﯽ از ﺑﺰرﮔﺎن ﺻﻨﻌﺖ ﮔﺮاﻓﯿﮏ ﮐﺎﻣﭙﯿﻮﺗﺮي ﻣﯽ ﺑﺎﺷﺪ ( ،ﺧﻮد OpenGLﺗﻮﺳﻌﻪ ﯾﺎﻓﺘﻪ ﮐﺘﺎﺑﺨﺎﻧﻪ دوﺑﻌﺪي IRIS
GLﮐﻪ آن ﻫﻢ ﻣﺤﺼﻮل ﺷﺮﮐﺖ SGLﺑﻮد ،ﻣﯽ ﺑﺎﺷﺪ .ﺷﺮﮐﺖ ﻫﺎي دﯾﮕﺮي ﻧﯿﺰ ﺑﻪ ﺗﻮﺳﻌﻪ اﯾﻦ ﻣﺤﺼﻮل ﻣﺘﻦ ﺑﺎز ﮐﻤﮏ ﮐﺮده اﻧﺪ از
ﺟﻤﻠﻪ ﺷﺮﮐﺖ D Labs3ﮐﻪ ﺗﮑﻨﯿﮏ و ﻗﺎﺑﻠﯿﺖ ﺳﺎﯾﻪ زﻧﯽ را ﺑﻪ OpenGLاﺿﺎﻓﻪ ﻧﻤﻮد .در ﺳﺎﻟﻬﺎي اﺧﯿﺮ ﮐﺘﺎﺑﺨﺎﻧﻪ ﻫﺎي
OpenALو OpenILﻧﯿﺰ ﺑﻪ ﻣﻮازات OpenGLدر ﺣﺎل ﭘﯿﺸﺮوي و ﮐﺴﺘﺮش ﻫﺴﺘﻨﺪ ﮐﻪ اوﻟﯽ ﺑﺮاي ﮐﻨﺘﺮل و ﻣﺪﯾﺮﯾﺖ ﺳﺨﺖ
اﻓﺰار ﻫﺎي ﺻﻮﺗﯽ ) (Audioو اﯾﺠﺎد ﺻﺪا ﻫﺎي ﺳﻪ ﺑﻌﺪي و دوﻣﯽ ﺑﺮاي ﻣﺪﯾﺮﯾﺖ و ﮐﻨﺘﺮل دﺳﺘﮕﺎه ﻫﺎي ورودي ) ( Inputﻫﺎ اﯾﺠﺎد
ﺷﺪه اﻧﺪ .
رﻗﯿﺐ اﺻﻠﯽ OpenGLﻫﻤﺎن DirectXﻣﺤﺼﻮل ﺷﺮﮐﺖ Microsoftﻣﯽ ﺑﺎﺷﺪ ﮐﻪ در ﺳﺎل 1995وارد ﻋﺮﺻﻪ رﻗﺎﺑﺖ API
ﻫﺎ ﺷﺪ ،در اواﯾﻞ رﻗﺎﺑﺖ ﺑﯿﻦ اﯾﻦ دو اﭘﻦ ﺟﯽ ال ﮐﺎﻣﻼ ﯾﮏ ﺳﺮ و ﮔﺮدن از ﺣﺮﯾﻒ ﺧﻮد ﺟﻠﻮ ﺑﻮد ،اﻣﺎ ﮐﺎر ﺑﻪ ﻫﻤﯿﻦ روال ﭘﯿﺶ ﻧﺮﻓﺖ و
ﺷﺮك ﻣﺎﮐﺮوﺳﺎﻓﺖ ﯾﺎ اﺳﺘﻔﺎده از ﻗﺪرت ﺗﺠﺎري ﺧﻮد ﺗﻮاﻧﺴﺖ از رﻗﯿﺐ ﺧﻮد ﺟﻠﻮ ﺑﺰﻧﺪ ،اﻟﺒﺘﻪ ﻣﺘﻦ ﺑﺎز ﺑﻮدن OpenGLﻫﻢ ﺑﯽ ﺗﻘﺼﯿﺮ ﻧﺒﻮد
ﺑﻪ ﮔﻮﻧﻪ اي ﮐﻪ ﻣﺎﮐﺮوﺳﺎﻓﺖ از اﯾﻦ وﯾﮋﮔﯽ اﺳﺘﻔﺎده ﻣﯽ ﮐﺮد و ﻣﺤﺼﻮﻻت ﺧﻮد را ﺗﻘﺮﯾﺒﺎ ﻣﺸﺎﺑﻪ ﺑﺎ ﻣﺤﺼﻮﻻت OpenGLاراﺋﻪ ﻣﯽ داد ﺗﺎ
اﯾﻨﮑﻪ در ﺗﺎرﯾﺦ 2000ﻣﯿﻼدي DirectX 8ﻣﻨﺘﺸﺮ ﺷﺪ ﮐﻪ اﻣﮑﺎﻧﺎت ﺑﯿﺸﺘﺮ و ﺑﻬﺘﺮي ﻧﺴﺒﺖ ﺑﻪ OpenGLداﺷﺖ ،در اﯾﻦ ﺑﺮﻫﻪ
زﻣﺎﻧﯽ ﺑﻮد ﮐﻪ OpenGLاز رﻗﯿﺐ ﺧﻮد ﻋﻘﺐ اﻓﺘﺎد وﻟﯽ ﻫﻤﭽﻨﺎن رﻗﺎﺑﺖ ﺑﯿﻦ اﯾﻦ دو اداﻣﻪ دارد .
4
1
اﻧﻮاع ﮔﺮاﻓﯿﮏ راﯾﺎﻧﻪ اي :
دو ﻧﻮع ﮔﺮاﻓﯿﮏ راﯾﺎﻧﻪ اي وﺟﻮد دارد :ﻧﻮع اول ﮔﺮاﻓﯿﮏ رﺳﺘﺮي) (Rasterﮐﻪ ﺑﻪ ﮔﺮاﻓﯿﮏ Bitmapﻧﯿﺰ ﺷﻬﺮت دارد .ﮔﺎﻫﯽ ﻧﯿﺰ ﺑﻪ
ﮔﺮاﻓﯿﮏ رﺳﺘﺮي ﮔﺮاﻓﯿﮏ ﭘﯿﮑﺴﻠﯽ ﻫﻢ ﻣﯽ ﮔﻮﯾﻨﺪ .ﻧﻮع دوم آن ﮔﺮاﻓﯿﮏ وﮐﺘﻮر) (Vectorﻣﯽ ﺑﺎﺷﺪ ﮐﻪ ﺑﻪ ﻧﻮع ”ﺑﺮداري“ ﻧﯿﺰ ﺷﻬﺮت دارد.
اﯾﻦ ﻧﻮع ﮔﺮاﻓﯿﮏ ﺗﺸﮑﯿﻞ ﺷﺪه اﺳﺖ از ﺧﺎﻧﻪ ﻫﺎي ﭘﯿﮑﺴﻠﯽ ﮐﻪ داراي درﺟﻪ ﻣﺸﺨﺼﯽ از ﯾﮏ رﻧﮓ ﻣﯽ ﺑﺎﺷﻨﺪ و وﻗﺘﯽ اﯾﻦ ﭘﯿﮑﺴﻞ ﻫﺎ در
ﮐﻨﺎر ﯾﮑﺪﯾﮕﺮ ﺑﺎ درﺟﻪ رﻧﮕﻬﺎﯾﯽ ﻣﺨﺘﻠﻒ از ﻫﻢ ،ﻗﺮار ﻣﯽ ﮔﯿﺮﻧﺪ ،ﺗﺼﺎوﯾﺮ را ﺗﺸﮑﯿﻞ ﻣﯽ دﻫﻨﺪ .در ﮔﺮاﻓﯿﮏ ﭘﯿﮑﺴﻠﯽ ﺑﻪ دﻟﯿﻞ اﯾﻨﮑﻪ ﺷﻤﺎ ﺑﺎ
رﻧﮓ ﭘﯿﮑﺴﻞ ﻫﺎ ﺳﺮو ﮐﺎر دارﯾﺪ ،ﻗﺎدر ﺑﻪ وﯾﺮاﯾﺶ ،ﺣﺬف ﯾﺎ اﯾﺠﺎد ﺗﺼﻮﯾﺮ ﯾﺎ ﻋﮑﺲ ﻧﯿﺴﺘﯿﺪ .ﺗﻨﻬﺎ ﻣﯽ ﺗﻮاﻧﯿﺪ ﻋﮑﺲ ﯾﺎ ﺗﺼﺎوﯾﺮ دﯾﺠﯿﺘﺎل را
ﺗﻮﺳﻂ دﺳﺘﺮﺳﯽ ﺑﻪ ﭘﯿﺴﻠﻬﺎي رﻧﮕﯽ آن ،وﯾﺮاﯾﺶ ﻧﻤﺎﯾﯿﺪ .آﻧﭽﻪ در ﮔﺮاﻓﯿﮏ رﺳﺘﺮي اﻫﻤﯿﺖ دارد ،ﺗﻌﺪاد ﭘﯿﮑﺴﻞ ﻫﺎي رﻧﮕﯽ در اﯾﻨﭻ ﻣﯽ
ﺑﺎﺷﺪ ،زﯾﺮا اﯾﻦ ﺗﻌﺪاد ،ﮐﯿﻔﯿﺖ رﻧﮕﯽ و وﺿﻮع ﺗﺼﻮﯾﺮي ﻋﮑﺲ دﯾﺠﯿﺘﺎل را ﻣﺸﺨﺺ ﻣﯽ ﮐﻨﺪ .ﺑﻪ ﺗﻌﺪاد ﭘﯿﮑﺴﻞ ﻫﺎي رﻧﮕﯽ در اﯾﻨﭻ،
رزوﻟﻮﺷﻦ ﻣﯽ ﮔﻮﯾﻨﺪ .و ﻣﻘﺪار رزوﻟﻮﺷﻦ ،ﻫﻤﺎن ﻣﻘﺪار ﭘﯿﮑﺴﻞ ﻫﺎ را در واﺣﺪ اﯾﻨﭻ ﻣﺸﺨﺺ ﻣﯽ ﮐﻨﺪ ﮐﻪ اﺻﻄﻼﺣﺎ ﺑﻪ آن واﺣﺪ dpiﻣﯽ
ﮔﻮﯾﻨﺪ )ﯾﻌﻨﯽ Dot Per Inchﯾﺎ ﺗﻌﺪاد ﻧﻘﺎط در اﯾﻨﭻ(.ﻫﻤﯿﻦ واﺣﺪ dpiاﺳﺖ ﮐﻪ ﺑﺎﻋﺚ ﻣﯽ ﺷﻮد وﻗﺘﯽ ﺷﻤﺎ ﯾﮏ ﺗﺼﻮﯾﺮ رﺳﺘﺮي را ﺑﺰرگ
ﻧﻤﺎﯾﯽ ﻣﯽ ﮐﻨﯿﺪ ،ﮐﯿﻔﯿﺖ ﺗﺼﻮﯾﺮ ﭘﺎﯾﯿﻦ ﺗﺮ ﻣﯽ آﯾﺪ .زﯾﺮا ﻫﺮﭼﻪ ﻫﻢ ﮐﻪ آﻧﺮا ﺑﺰرگ ﺗﺮ ﮐﻨﯿﺪ ﻧﻤﯽ ﺗﻮاﻧﯿﺪ رزوﻟﻮﺷﻦ ﯾﺎ ﺗﻌﺪاد ﭘﯿﮑﺴﻞ ﻫﺎي آن را
در واﺣﺪ اﯾﻨﭻ اﻓﺰاﯾﺶ دﻫﯿﺪ .ﮐﯿﻔﯿﺖ اﯾﻦ ﺗﺼﺎوﯾﺮ ﺑﺎ ﺳﺎﯾﺰ ارﺗﺒﺎط ﻣﺴﺘﻘﯿﻢ دارد.
اﯾﻦ ﻧﻮع ﮔﺮاﻓﯿﮏ ،ﮔﺮاﻓﯿﮑﯽ راﯾﺎﻧﻪ اي اﺳﺖ ﮐﻪ ﺑﺎ ﻓﺮﻣﻮﻟﻬﺎي رﯾﺎﺿﯽ ﺳﺮ و ﮐﺎر دارد .از ﺧﻂ ﻫﺎ ،ﻣﻨﺤﻨﯽ ﻫﺎ و اﺷﮑﺎﻟﯽ ﮐﻪ داراي ﺑﻌﺪ و
ﻣﺨﺘﺼﺎت رﯾﺎﺿﯽ ﻣﯽ ﺑﺎﺷﻨﺪ و ﻣﮑﺎن آﻧﻬﺎ ﺑﺎ xو yﺗﻌﺮﯾﻒ ﻣﯽ ﮔﺮدد .داراي ﻃﻮل و ﻋﺮض رﯾﺎﺿﯽ ﻣﯽ ﺑﺎﺷﻨﺪ و رزوﻟﻮﺷﻦ آﻧﻬﺎ ﺑﺎ ﺗﻐﯿﯿﺮ
ﺳﺎﯾﺰ ،ﺗﻐﯿﯿﺮ ﻧﻤﯽ ﯾﺎﺑﺪ .ﺑﻨﺎﺑﺮاﯾﻦ ﮐﯿﻔﯿﺖ ﺗﺼﺎوﯾﺮ در ﻫﺮ ﺳﺎﯾﺰي ﯾﮑﺴﺎن ﻣﯽ ﻣﺎﻧﺪ و اﯾﻦ ﮐﺎر از ﻃﺮﯾﻖ ﻣﺤﺎﺳﺒﺎت رﯾﺎﺿﯽ اﻧﺠﺎم ﻣﯽ ﺷﻮد.اﯾﻦ
ﮔﺮاﻓﯿﮏ ﯾﮑﯽ از ﺑﻬﺘﺮﯾﻦ و ﭘﺮﮐﺎرﺑﺮدﺗﺮﯾﻦ اﻧﻮاع ﮔﺮاﻓﯿﮏ راﯾﺎﻧﻪ اﺳﺖ ،ﺑﺮاي ﮐﺎر ﺗﺼﻮﯾﺮ ﺳﺎزي اﺳﺘﻔﺎده ﻣﯽ ﺷﻮد و ﻃﺮاﺣﯽ آرم ﻫﺎ و ﮔﺎﻫﯽ
ﺗﺼﻮﯾﺮ ﺳﺎزي ﮐﺘﺎب ﻫﺎي ﮐﻮدك و … ﺗﻮﺳﻂ ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﮐﺘﻮري اﻧﺠﺎم ﻣﯽ ﺷﻮد
در ﺗﺼﻮﯾﺮ زﯾﺮ ﺑﻪ ﺻﺮاﺣﺖ ﻣﯿﺘﻮاﻧﯿﺪ ﺗﻔﺎوت ﻣﺎﺑﯿﻦ اﯾﻦ دو ﻧﻮع ﮔﺮاﻓﯿﮏ را ﻣﺸﺎﻫﺪه ﻓﺮﻣﺎﺋﯿﺪ :
1
http://www.howtogeek.com/howto/32597/whats-the-difference-between-pixels-and-vectors/
5
ﻗﻮاﻧﯿﻦ ﻧﻮﺷﺘﺎري در : opengl
· دﺳﺘﻮرات openglﺑﺎ ﭘﯿﺸﻮﻧﺪ glﺷﺮوع ﻣﯿﺸﻮد و ﺑﺎ ﯾﮏ ﺣﺮف ﺑﺰرگ اداﻣﻪ ﻣﯽ ﯾﺎﺑﻨﺪ ﻣﺎﻧﻨﺪ دﺳﺘﻮرﻫﺎي
)( glBeginو ﯾﺎ ) (glutDisplayFunc
GL_COLOR_BUFFER_BIT · ﺛﻮاﺑﺖ ﺑﺎ ﭘﯿﺸﻮﻧﺪ _ GLﺷﺮوع ﻣﯿﺸﻮد و ﺗﻤﺎم ﺣﺮوف ﺑﻌﺪ از آن ﺣﺮوف ﺑﺰرگ اﺳﺖ ﻣﺎﻧﻨﺪ:
· ﺑﻌﻀﯽ از دﺳﺘﻮرات ﻧﯿﺰ ﺑﺎ ﯾﮏ ﻋﺪد وﭼﻨﺪﯾﻦ ﺣﺮف در اﻧﺘﻬﺎ ﺑﺮاي ﯾﺎدآوري ﺗﻌﺪاد و ﻧﻮع آرﮔﻮﻣﺎﻧﻬﺎي ورودي,ﺧﺎﺗﻤﻪ
ﻣﯽ ﯾﺎﺑﻨﺪ .ﺑﺮاي ﻣﺜﺎل در دﺳﺘﻮر )( ‘3’ glVertex3fvﺑﻪ ﻣﻌﻨﺎي وﺟﻮد 3آرﮔﻮﻣﺎن ورودي و ’ ‘fﺑﻪ ﻣﻌﻨﺎي
اﻋﺸﺎري ﺑﻮدن ورودي ﻫﺎ و ’ ‘vﺑﻪ ﻣﻌﻨﺎي ﺑﺮداري 2ﺑﻮدن ورودي ﻫﺎ اﺳﺖ .
2. Vector
6
اﻧﻮاع داده ﻫﺎ ﺑﻪ ﻫﻤﺮاه ﻧﺤﻮه ﺗﻌﺮﯾﻒ در : opengl
7
ﻗﺎﻟﺐ ﮐﻠﯽ ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎ در openglﺑﻪ زﺑﺎن : Visual C++
>#include <GL/glut.h
.
.
.
)(Void init
{
ﻣﻘﺪاردﻫﯽ اوﻟﯿﻪ
}
{
;)(Init
;)(glutMainLoop
;return 0
}
8
ﻧﺤﻮه ﺗﻨﻈﯿﻢ Microsoft Visual C++ 2010ﺑﺮاي ﮐﺎرﮐﺮدن ﺑﺎ : opengl
http://s1.picofile.com/file/7323794515/freeglut_MSVC.zip.html
http://www.opengl.org/resources/libraries/glut
ﺑﻌﺪ از ﺧﺎرج ﮐﺮدن ﻓﺎﯾﻞ از ﺣﺎﻟﺖ ﻓﺸﺮده 3ﻓﻮﻟﺪر وﺟﻮد دارد ﮐﻪ ﻃﺒﻖ زﯾﺮ ﺑﺎﯾﺪ ﮐﭙﯽ ﺷﻮد :
.1در درون ﻓﻮﻟﺪر binﻓﺎﯾﻞ freeglut.dllرا ﺑﻪ اﯾﻦ آدرس ﮐﭙﯽ ﮐﻨﯿﺪ :
C:\windows\system32
و در ﺳﯿﺴﺘﻤﻬﺎي 64ﺑﯿﺘﯽ ﻓﺎﯾﻞ freeglut.dllﻣﻮﺟﻮد در ﻓﻮﻟﺪر x64را ﺑﻪ اﯾﻦ آدرس ﮐﭙﯽ ﮐﻨﯿﺪ :
C:\windows\SysWOW64
.2در درون ﻓﻮﻟﺪر includeﻓﻮﻟﺪري ﺑﻪ ﻧﺎم GLوﺟﻮد دارد .ﻣﺤﺘﻮﯾﺎت اﯾﻦ ﻓﻮﻟﺪر را ﮐﻪ ﺷﺎﻣﻞ 4ﻓﺎﯾﻞ ﺑﺎ ﭘﺴﻮﻧﺪ
.hاﺳﺖ را ﺑﻪ آدرس زﯾﺮ ﮐﭙﯽ ﮐﻨﯿﺪ :
C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\gl
و در ﺳﯿﺴﺘﻤﻬﺎي 64ﺑﯿﺘﯽ ﻧﯿﺰ ﺑﻪ اﯾﻦ آدرس :
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\gl
9
.3در درون ﻓﻮﻟﺪر libﻓﺎﯾﻠﯽ ﺑﻪ ﻧﺎم freeglut.libوﺟﻮد دارد ﮐﻪ آن را ﺑﺎﯾﺪ ﺑﻪ آدرس زﯾﺮ ﮐﭙﯽ ﮐﻨﯿﺪ :
C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib
و درﺳﯿﺴﺘﻤﻬﺎي 64ﺑﯿﺘﯽ ﻧﯿﺰ ﻓﺎﯾﻞ freeglut.libﻣﻮﺟﻮد در ﻓﻮﻟﺪر x64را ﺑﻪ اﯾﻦ آدرس ﮐﭙﯽ ﮐﻨﯿﺪ :
.4ﺑﺮﻧﺎﻣﻪ visual studio 2010را اﺟﺮا ﮐﻨﯿﺪ و ﻣﺮاﺣﻞ زﯾﺮ را دﻧﺒﺎل ﮐﻨﯿﺪ :
10
11
12
ﺑﻌﺪ از اﯾﺠﺎد ﻓﺎﯾﻞ ,ﺳﻮرس ﮐﺪ ﺧﻮد را درون آن ﻣﯿﻨﻮﯾﺴﯿﻢ .
13
ﺣﺎل ﺑﺎﯾﺪ ﻓﺎﯾﻞ ﮐﺘﺎﺑﺨﺎﻧﻪ اي openglرا ﺑﻪ ﭘﺮوژه ﺧﻮد ﻟﯿﻨﮏ ﮐﻨﯿﻢ ﺑﺮاي اﯾﻨﮑﺎر ﻣﺮاﺣﻞ زﯾﺮ را دﻧﺒﺎل ﮐﻨﯿﺪ :
14
ﻣﻘﺪار freeglut.libرا در ﮐﺎدر زﯾﺮ وارد ﮐﺮده و در ﺗﻤﺎﻣﯽ ﭘﻨﺠﺮه ﻫﺎ okﮐﻨﯿﺪ .
15
ﺣﺎل ﮐﺎر ﺑﺮاي وﯾﻨﺪوزﻫﺎي 32ﺑﯿﺘﯽ ﺗﻤﺎم ﺷﺪه و ﺷﻤﺎ ﻓﻘﻂ ﮐﺎﻓﯽ اﺳﺖ ﮐﻪ ﺑﺮﻧﺎﻣﻪ ﺗﺎن را ﻧﻮﺷﺘﻪ و اﺟﺮا ﮐﻨﯿﺪ وﻟﯽ ﺑﺮاي
وﯾﻨﺪوزﻫﺎي 64ﺑﯿﺘﯽ ﺑﺎﯾﺪ ﯾﮏ ﮐﺎر دﯾﮕﺮ ﻧﯿﺰ ﺑﮑﻨﯿﺪ :
16
17
راﻫﻨﻤﺎي ﺑﺮﺧﯽ از دﺳﺘﻮرات : opengl
) : glClearColor (R,G,B,Aرﻧﮓ ﭘﺎك ﮐﻨﻨﺪه ﺟﺎري ﺻﻔﺤﻪ را ﺑﻪ ﻣﻘﺪار RGBAداده ﺷﺪه ﺗﻨﻈﯿﻢ ﻣﯿﮑﻨﺪ .ﮐﻪ o
)Rﻗﺮﻣﺰ( و )Gﺳﺒﺰ( و )Bآﺑﯽ( و )Aآﻟﻔﺎ ﯾﺎ ﺷﻔﺎﻓﯿﺖ( اﺳﺖ .
رﻧﮓ ﭘﯿﺸﻔﺮض ) (0,0,0,0اﺳﺖ ﮐﻪ رﻧﮓ ﺳﯿﺎه اﺳﺖ .ﻣﻘﺎدﯾﺮ ﻣﻮرد ﻧﻈﺮ ﻣﺎ ﺑﯿﻦ 0و 1اﺳﺖ .
) : glClear( GLbitfield maskﺑﺎﻓﺮ ﻫﻤﻮاره ﺑﺎﯾﺪ ﻗﺒﻞ از ﺗﺮﺳﯿﻢ ﺻﻔﺤﻪ ﭘﺎك ﺷﻮد زﯾﺮا ﻣﻘﺎدﯾﺮ رﻧﮓ ﻫﺮ ﭘﯿﮑﺴﻞ در ﺑﺎﻓﺮ o
ﻗﺮار داده ﻣﯿﺸﻮد و اﯾﻦ دﺳﺘﻮر ﻧﯿﺰ ﻫﻤﯿﻦ ﮐﺎر را ﻣﯿﮑﻨﺪ ﻣﻘﺎدﯾﺮ GLbitfield maskﻣﯿﺘﻮاﻧﺪ ﺷﺎﻣﻞ ﻣﻘﺎدﯾﺮ زﯾﺮ ﺑﺎﺷﺪ :
ﺑﺎ ﻓﺮاﺧﻮاﻧﯽ اﯾﻦ ﺗﺎﺑﻊ ﻓﻘﻂ ﺑﺎﻓﺮﻫﺎﯾﯽ ﮐﻪ در آرﮔﻮﻣﺎن ﻣﻌﺮﻓﯽ ﺷﺪه اﻧﺪ ﭘﺎك ﻣﯽ ﺷﻮﻧﺪ و ﺑﻘﯿﻪ ﺑﺎﻓﺮﻫﺎ ﻫﻤﭽﻨﺎن ﺣﺎﻟﺖ ﻗﺒﻠﯽ ﺧﻮد رو ﺣﻔﻆ ﻣﯽ
ﮐﻨﻨﺪ.
) : glColor{3,4}{b,s,f,i,d,ub,us,ui}( red,green, blue,alphaاﯾﻦ ﺗﺎﺑﻊ ﺑﺮاي ﺗﻌﯿﯿﻦ رﻧﮓ اﺷﯿﺎئ روي ﺻﻔﺤﻪ ﺑﻪ ﮐﺎر o
ﻣﯿﺮود و در ﺻﻮرت ﺳﻪ آرﮔﻮﻣﺎﻧﻪ ﺑﻮدن ﻣﻘﺎدﯾﺮ RGBرا ﻣﯿﮕﯿﺮﻧﺪ و در ﺻﻮرت ﭼﻬﺎر آرﮔﻮﻣﺎﻧﻪ ﺑﻮدن ﻣﻘﺎدﯾﺮ RGBAرا ﻣﯿﮕﯿﺮد .ﺑﺮاي
ﻣﺜﺎل :
ﻧﻮع دﯾﮕﺮ ارﺳﺎل ﭘﺎراﻣﺘﺮ ورودي اﯾﻦ ﺗﺎﺑﻊ ﺑﻪ ﺻﻮرت ﺑﺮداري اﺳﺖ ﮐﻪ در اﯾﻦ ﺣﺎﻟﺖ ﺑﺎﯾﺪ ورودي ﻫﺎ آراﯾﻪ ﺑﺎﺷﻨﺪ ﺑﻪ ﺻﻮرت زﯾﺮ :
;}GLfloat color_array[] = {1.0, 0.0, 0.0
;)glColor3fv(color_array
18
): glOrtho(GLdouble left, GLdouble right,GLdouble bottom, GLdouble top,GLdouble zNear, GLdouble zFar o
دﺳﺘﻮري ﮐﻪ دﯾﺪ اورﺗﻮﮔﺮاﻓﯿﮏ ﺣﺠﻢ را ﺑﻪ وﺟﻮد ﻣﯽ آورد در اﯾﻦ ﺣﺎﻟﺖ ﺣﺠﻢ درﺣﺎل ﻣﺸﺎﻫﺪه ﺑﻪ ﺷﮑﻞ ﯾﮏ ﺟﻌﺒﻪ دﯾﺪه ﻣﯿﺸﻮد
)ﺷﮑﻞ زﯾﺮ( :
آرﮔﻮﻣﺎﻧﻬﺎي leftو rightﻣﺨﺘﺼﺎت ﺻﻔﺤﺎت ﻋﻤﻮدي ﺑﺮش ﭼﭗ و راﺳﺖ را ﻣﻌﯿﻦ ﻣﯿﺴﺎزد top .و bottomﻣﺨﺘﺼﺎت
ﺻﻔﺤﺎت اﻓﻘﯽ ﺑﺮش ﺑﺎﻻ و ﭘﺎﺋﯿﻦ را ﻣﺸﺨﺺ ﻣﯿﮑﻨﺪ .و آرﮔﻮﻣﺎﻧﻬﺎي nearو farﻓﺎﺻﻠﻪ ﺑﺎ ﺻﻔﺤﺎت ﺑﺮش ﻧﺰدﯾﮑﺘﺮ و دورﺗﺮ ﻫﺴﺘﻨﺪ .
دﺳﺘﻮر ) gluOrtho2D(left,right,bottom,topﺑﺎ دﺳﺘﻮر ) glOrtho(left,right,bottom,top,-1,1ﺑﺮاﺑﺮ اﺳﺖ ﺑﺎ اﯾﻦ ﺗﻔﺎوت
ﮐﻪ دﺳﺘﻮر اول ﺑﺮاي اﯾﺠﺎد ﺳﯿﺴﺘﻢ دﺳﺘﮕﺎه ﻣﺨﺘﺼﺎت دوﺑﻌﺪي ﺑﻪ ﮐﺎر ﻣﯿﺮود .
19
o
;) glBegin( GLenum mode
.
.
: ;)(glEnd
ﺑﺮاي ﺷﺮوع و ﭘﺎﯾﺎن دﺳﺘﻮرات ﺗﺮﺳﯿﻤﯽ)اﺷﮑﺎل اوﻟﯿﻪ( ﮐﻪ ﺑﺎ رﺋﻮﺳﺸﺎن ﻣﺸﺨﺺ ﻣﯿﺸﻮﻧﺪ ﺑﮑﺎر ﻣﯿﺮوﻧﺪ .آرﮔﻮﻣﺎن GLenum modeﻧﻮع
ﺗﺮﺳﯿﻤﯽ ﮐﻪ ﺑﺎﯾﺪ ﺷﺮوع ﺷﻮد را ﻣﻌﯿﻦ ﻣﯿﺴﺎزد ﺑﺮاي ﻣﺜﺎل glBegin(GL_TRIANGLES) :ﺑﻪ ﻣﻌﻨﺎي اﯾﻦ اﺳﺖ ﮐﻪ ﻣﯿﺨﻮاﻫﯿﻢ رﺳﻢ ﯾﮏ
ﻣﺜﻠﺚ را ﺷﺮوع ﮐﻨﯿﻢ و )( glEndﺑﻪ openglﻣﯿﮕﻮﯾﺪ ﮐﻪ رﺳﻢ ﻣﺜﻠﺚ ﺑﻪ ﭘﺎﯾﺎن رﺳﯿﺪه اﺳﺖ .و ﻣﺎ ﺑﯿﻦ اﯾﻦ دو دﺳﺘﻮر رﺋﻮس ﻣﻮرد ﻧﯿﺎز
ﺑﺮاي رﺳﻢ را وارد ﻣﯿﮑﻨﯿﻢ .ﻣﻘﺎدﯾﺮ ﻣﺠﺎز ﺑﺮاي GLenum modeدر دﺳﺘﻮر glBeginﺑﻪ ﺻﻮرت زﯾﺮ اﺳﺖ .
20
): glVertex{2,3,4}{d,f,I,s}{v}(input parameters o
ﯾﮏ رأس از ﺷﮑﻠﯽ را ﮐﻪ ﺑﺎﯾﺪ ﺑﯿﻦ )( glBeginو )( glEndرﺳﻢ ﺷﻮد را اﯾﺠﺎد ﻣﯿﮑﻨﺪ در openglﺗﻤﺎﻣﯽ اﺷﮑﺎل ﻫﻨﺪﺳﯽ ﺑﺎ ﻣﺠﻤﻮﻋﻪ
اي از رﺋﻮس ﺑﯿﺎن ﻣﯿﺸﻮﻧﺪ .ﺑﺎﯾﺪ ﺑﺪاﻧﯿﺪ ﮐﻪ ﺗﺮﺗﯿﺐ اراﺋﻪ رﺋﻮس ﺑﺴﯿﺎر ﻣﻬﻢ اﺳﺖ .
;)glBegin(GL_LINES
;)glVertex2i(10,10
;)glVertex2i(90,120
;)(glEnd
21
ﺑﺮاي اﻃﻤﯿﻨﺎن ﺣﺎﺻﻞ ﮐﺮدن از ﺗﺮﺳﯿﻢ ﺗﻤﺎم ﻣﻮاردي ﮐﻪ رﺳﻢ ﺷﻮﻧﺪ در ﭘﺎﯾﺎن دﺳﺘﻮرات ﺗﺮﺳﯿﻤﯽ از اﯾﻦ ﺗﺎﺑﻊ اﺳﺘﻔﺎده )(: glFlush o
ﻣﯿﺸﻮد .در واﻗﻊ اﯾﻦ ﺗﺎﺑﻊ ﺑﺎﻓﺮ را ﺧﺎﻟﯽ ﻣﯿﮑﻨﺪ و ﺗﻤﺎﻣﯽ دﺳﺘﻮرات در ﺣﺎل اﻧﺘﻈﺎر را ﺑﻪ ﻃﻮر ﺳﺮﯾﻊ اﺟﺮا ﻣﯿﮑﻨﺪ
ﺑﺮاي ﺗﻐﯿﯿﺮ ﻣﮑﺎن ﺷﺊ و ﻫﻤﭽﻨﯿﻦ ﻣﮑﺎن دورﺑﯿﻨﻬﺎ از ﻣﺎﺗﺮﯾﺲ ﻫﺎ اﺳﺘﻔﺎده ﻣﯿﺸﻮد و اﯾﻦ : glMatrixMode(GLenum
)(GLenum mode
mode o
ﻣﯿﺘﻮاﻧﺪ ﺷﺎﻣﻞ ﻣﻘﺎدﯾﺮ زﯾﺮ ﺑﺎﺷﺪ : GLenum mode ﺗﺎﺑﻊ ﻧﯿﺰ ﻣﺎﺗﺮﯾﺲ ﺟﺎري را ﺗﻌﯿﯿﻦ ﻣﯿﮑﻨﺪ ﻣﻘﺪار
3
GL_MODELVIEW ﺑﺮاي اﻧﺘﻘﺎل و ﺗﻐﯿﯿﺮ ﻣﮑﺎن و دوران و ...اﺷﯿﺎئ اﺳﺘﻔﺎده ﻣﯿﺸﻮد و ﺑﺼﻮرت ﭘﯿﺸﻔﺮض اﯾﻦ ﺣﺎﻟﺖ اﺳﺖ
4
GL_PROJECTION ﺑﺮاي ﺣﺎﻟﺖ دوﺑﻌﺪي اﺳﺘﻔﺎده ﻣﯿﺸﻮد
GL_TEXTURE ﺑﺮاي ﺣﺎﻟﺘﯽ ﮐﻪ ﻣﯿﺨﻮاﻫﯿﻢ از ﺗﮑﺴﺘﭽﺮ)ﺗﺼﻮﯾﺮ ﺑﻪ ﺟﺎري رﻧﮓ( اﺳﺘﻔﺎده ﻣﯿﺸﻮد
ﺗﺼﻮﯾﺮ زﯾﺮ ﯾﮏ ﮐﺮه ﺳﺎده اﺳﺖ ﺑﺎ اﯾﻦ ﺗﻔﺎوت ﮐﻪ دز آن از ﺑﺎﻓﺖ ﺗﮑﺴﺘﭽﺮ ﺑﻪ ﺟﺎي رﻧﮓ اﺳﺘﻔﺎده ﺷﺪه :
lLoadIdentity() o
: glLoadIdentityﻣﺎﺗﺮﯾﺲ ﻗﺎﺑﻞ ﺗﻐﯿﯿﺮ ﺟﺎري را ﺑﻪ ﻣﺎﺗﺮﯾﺲ واﺣﺪﺗﺒﺪﯾﻞ ﻣﯿﮑﻨﺪ ).ﻣﺎﺗﺮﯾﺲ واﺣﺪ ﻣﺎﺗﺮﯾﺴﯽ اﺳﺖ ﮐﻪ ﻣﻮﻟﻔﻪ
ﻫﺎي روي ﻗﻄﺮ اﺻﻠﯽ 1وﻣﺎﺑﻘﯽ 0ﻫﺴﺘﻨﺪ(.
3
http://www.songho.ca/opengl/files/matrixModelView.zip
4
http://www.songho.ca/opengl/files/matrixProjection.zip
22
: ﻣﯽ ﺗﻮاﻧﺪ ﺛﺎﺑﺖ ﻫﺎي زﯾﺮ را ﺑﻪ ﻋﻨﻮان ﭘﺎرﻣﺘﺮﻫﺎي ﺧﻮد ﺑﮕﯿﺮدGLenum cap در ﺗﻮاﺑﻊ ﺑﺎﻻ ﻣﻘﺪار
GL_ALPHA_TEST GL_MAP2_COLOR_4
GL_AUTO_NORMAL GL_MAP2_INDEX
GL_BLEND GL_MAP2_NORMAL
GL_CLIP_PLANEi GL_MAP2_TEXTURE_COORD_1
GL_COLOR_LOGIC_OP GL_MAP2_TEXTURE_COORD_2
GL_COLOR_MATERIAL GL_MAP2_TEXTURE_COORD_3
GL_CULL_FACE GL_MAP2_TEXTURE_COORD_4
GL_DEPTH_TEST GL_MAP2_VERTEX_3
GL_DITHER GL_MAP2_VERTEX_4
GL_FOG GL_NORMALIZE
GL_INDEX_LOGIC_OP GL_POINT_SMOOTH
GL_LIGHTi GL_POLYGON_OFFSET_FILL
GL_LIGHTING GL_POLYGON_OFFSET_LINE
GL_LINE_SMOOTH GL_POLYGON_OFFSET_POINT
GL_LINE_STIPPLE GL_POLYGON_SMOOTH
GL_LOGIC_OP GL_POLYGON_STIPPLE
GL_MAP1_COLOR_4 GL_SCISSOR_TEST
GL_MAP1_INDEX GL_STENCIL_TEST
GL_MAP1_NORMAL GL_TEXTURE_1D
GL_MAP1_TEXTURE_COORD_1 GL_TEXTURE_2D
GL_MAP1_TEXTURE_COORD_2 GL_TEXTURE_GEN_Q
GL_MAP1_TEXTURE_COORD_3 GL_TEXTURE_GEN_R
GL_MAP1_TEXTURE_COORD_4 GL_TEXTURE_GEN_S
GL_MAP1_VERTEX_3 GL_TEXTURE_GEN_T
GL_MAP1_VERTEX_4
اﺳﺘﻔﺎده ﻣﯽ ﮐﻨﺪ و ﯾﮏglut ﮐﻪ از ﮐﺘﺎﺑﺨﺎﻧﻪopenGL اﯾﻦ ﺗﺎﺑﻊ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي: glutInit(int *argc, char **argv) o
. رو ﻣﻌﺮﻓﯽ ﻣﯽ ﮐﻨﻪglut در واﻗﻊ اﯾﻦ ﺗﺎﺑﻊ ﮐﺘﺎﺑﺨﺎﻧﻪ. ﺑﺎر ﻣﻘﺪاردﻫﯽ اوﻟﯿﻪ ﻣﯽ ﺷﻮد
: آرﮔﻮﻣﺎن ﻫﺴﺖ2 اﯾﻦ ﺗﺎﺑﻊ داراي
. ﺗﻌﺪاد آرﮔﻮﻣﺎﻧﻬﺎي ارﺳﺎﻟﯽ رو ذﺧﯿﺮه ﻣﯽ ﮐﻨﺪargc . اﺳﺖmain ﺗﺎﺑﻊargc ﮐﻪ اﺷﺎره ﮔﺮي ﺑﻪ ﻣﺘﻐﯿﺮ:argc
. ﻣﻘﺪار آرﮔﻮﻣﺎﻧﻬﺎ رو ذﺧﯿﺮ ه ﻣﯽ ﮐﻨﺪargv اﺳﺖ وmain ﺗﺎﺑﻊargv اﺷﺎره ﮔﺮي ﺑﻪ ﻣﺘﻐﯿﺮ:argv
ﻫﻤﺎﻧﻄﻮر ﮐﻪ از اﺳﻢ اﯾﻦ ﺗﺎﺑﻊ ﭘﯿﺪاﺳﺖ ﺑﺮاي ﻣﺸﺨﺺ ﮐﺮدن ﻣﻮﻗﻌﯿﺖ ﭘﻨﺠﺮه ﺑﮑﺎر: glutInitWindowPosition(int x,int y) o
. اﺳﺖy وx ﻣﯿﺮود و داراي دو آرﮔﻮﻣﺎن
ﻫﻤﺎﻧﻄﻮر ﮐﻪ از اﺳﻢ اﯾﻦ ﺗﺎﺑﻊ ﭘﯿﺪاﺳﺖ ﺑﺮاي ﻣﺸﺨﺺ ﮐﺮدن اﻧﺪازه ﭘﻨﺠﺮه: glutInitWindowSize(int width,int heigth) o
. ﺑﮑﺎر ﻣﯿﺮود و داراي دو آرﮔﻮﻣﺎن ﻃﻮل وﻋﺮض اﺳﺖ
Test ﺑﺎ ﻓﺮاﺧﻮاﻧﯽ اﯾﻦ ﺗﺎﺑﻊ ﭘﻨﺠﺮه ﻣﺎ ﺳﺎﺧﺘﻪ ﻣﯿﺸﻮد و در ﻋﻨﻮان آن ﻋﺒﺎرت : glutCreateWindow("Test Windows”) o
. را ﻗﺮار ﻣﯽ ﮔﯿﺮدWindows
23
:اﯾﻦ ﺗﺎﺑﻊ ﯾﮏ ﺗﺎﺑﻊ دﯾﮕﺮ را ﻓﺮاﺧﻮاﻧﯽ ﻣﯽ ﮐﻨﺪ ،ﮐﻪ ﻣﺎ ﻧﻮﺷﺘﯿﻢ در واﻗﻊ آرﮔﻮﻣﺎن آن )glutDisplayFunc(Display Function o
ﯾﮏ ﺗﺎﺑﻊ اﺳﺖ.ﺑﻪ اﯾﻨﮕﻮﻧﻪ ﺗﻮاﺑﻊ CallBackﮔﻔﺘﻪ ﻣﯿﺸﻮد .
ﺑﺎﻋﺚ ﺷﺮوع رﺧﺪادﻫﺎي glutﻣﯿﺸﻮد و ﺑﻪ ﻣﺤﺾ رﺳﯿﺪن ﺑﺮﻧﺎﻣﻪ ﺑﻪ اﯾﻦ ﺧﻂ ﺗﻤﺎم ﺗﻌﺎرﯾﻔﯽ ﮐﻪ ﺑﺮاي )(: glutMainLoop o
اﯾﺠﺎد ﭘﻨﺠﺮه ﮐﺮده اﯾﻢ را ﺑﻪ ﮐﺎر ﻣﯽ اﻧﺪازد و ﺑﺎﻋﺚ ﻧﻤﺎﯾﺶ ﭘﻨﺠﺮه ﻣﺎ ﻣﯿﺸﻮد .اﯾﻦ ﭘﻨﺠﺮه ﯾﮏ ﺣﻠﻘﻪ ﭘﺮدازﺷﯽ ﺑﯽ ﻧﻬﺎﯾﺖ اﯾﺠﺎد ﻣﯽ
ﮐﻨﺪ و ﺗﺎ زﻣﺎن ﺑﺴﺘﻦ ﭘﻨﺠﺮه ﺑﻪ ﮐﺎر ﺧﻮدش اداﻣﻪ ﻣﯿﺪﻫﺪ و ﺑﺎرﻫﺎ و ﺑﺎرﻫﺎ ﺗﻤﺎم دﺳﺘﻮراﺗﯽ ﮐﻪ ﺑﺎ glutﻧﻮﺷﺘﻪ اﯾﻢ را اﺟﺮا ﻣﯽ ﮐﻨﺪ
اﯾﻦ ﺣﻠﻘﻪ ﺗﻤﺎم ﺣﺮﮐﺎت ﻣﺎﻧﻨﺪ ﻣﻮس ،ﮐﯿﺒﻮرد رو ﻟﺤﻈﻪ ﺑﻪ ﻟﺤﻈﻪ ﭘﺮدازش و ﺑﺎﻋﺚ ﻣﯿﺸﻮد ﻣﺎ ﺗﻐﯿﯿﺮات را در ﺻﻔﺤﻪ ﻣﺸﺎﻫﺪه ﮐﻨﯿﻢ.
اﯾﻦ ﺗﺎﺑﻊ modeﻧﻤﺎﯾﺸﯽ را ﺑﺮاي ﻣﺎ ﻣﺸﺨﺺ ﻣﯽ ﮐﻨﺪ . ): glutInitDisplayMode(unsigned int display mode o
ﻣﺎﻧﻨﺪ :
;)glutInitDisplayMode(GLUT_SINGLE,GLUT_RGB
دﺳﺘﻮر ﺑﺎﻻ modeﭘﻨﺠﺮه ﺗﮏ ﺑﺎﻓﺮي در modeرﻧﮕﯽ RGBرو ﻣﺸﺨﺺ ﮐﺮده اﺳﺖ .
24
: ﺑﺮﻧﺎﻣﻪ رﺳﻢ ﯾﮏ ﺧﻂ در ﺻﻔﺤﻪ: ﻣﺜﺎل
#include<gl/glut.h>
void init()
{
glClearColor(0,0,0,0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0,100,0,200);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glBegin(GL_LINES);
glVertex2i(30,100);
glVertex2i(50,10);
glEnd();
glFlush();
}
int main(int argc,char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(200,200);
on(200,200);
glutCreateWindow("Line");
);
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
25
: ﺑﺮﻧﺎﻣﻪ رﺳﻢ ﭼﻬﺎر ﻧﻘﻄﻪ ﺑﺎ ﮔﻮﺷﻪ ﻫﺎي ﺻﺎف در ﺻﻔﺤﻪ: ﻣﺜﺎل
#include<gl/glut.h>
void init()
{
glClearColor(0,0,0,0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0,100,0,200);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_POINT_SMOOTH);
glPointSize(10);
glBegin(GL_POINTS);
glColor3f(1.0,0.0,0.4);
glVertex2i(20,65);
glColor3f(0.0,0.3,0.0);
glVertex2i(33,56);
glColor3f(0.3,0.1,0.3);
glVertex2i(10,12);
glEnd();
glFlush();
}
int main(int argc,char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(200,200);
glutCreateWindow("Points"
"Points");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
26
: ﺑﺮﻧﺎﻣﻪ رﺳﻢ ﺧﻂ ﺑﻪ وﺳﯿﻠﻪ ﭘﯿﺪاﮐﺮدن ﺷﯿﺐ: ﻣﺜﺎل
#include<gl/glut.h>
#include<math.h>
double round(double x)
{
return floor(x + 0.5);
}
void DDALine( GLint X1, GLint Y1, GLint X2, GLint Y2)
{
GLint iX, iY, Temp;
float m, X, Y;
if( (X2-X1) > (Y2-Y1))
{
if( X1 > X2)
{
Temp=X1; X1=X2; X2=Temp;
Temp=Y1; Y1=Y2; Y2=Temp;
}
Y=Y1;
m = (GLfloat) (Y2-Y1)/(X2-X1);
for( iX = X1; iX <= X2; iX ++)
{
glBegin(GL_POINTS);
glColor3f(1.0,0.2,0.0);
glVertex2i(iX,round(Y));
glEnd();
Y += m;
}
}
else
{
if( Y1 > Y2)
{
Temp=X1; X1=X2; X2=Temp;
Temp=Y1; Y1=Y2; Y2=Temp;
}
X = X1;
m = (float) (X2-X1)/(Y2-Y1);
for( iY = Y1; iY <= Y2; iY ++)
{
glBegin(GL_POINTS);
glColor3f(1.0,0.2,0.0);
glVertex2i(round(X),iY);
glEnd();
X += m;
}
}
}
void init()
{
glClearColor(0,0,0,0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0,100,0,200);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_POINT_SMOOTH);
glPointSize(10);
DDALine(10,50,50,50);
glFlush();
}
27
int main(int argc,char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(200,200);
glutCreateWindow("Line
"Line With Slope"
Slope");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
28
: ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﯾﺴﯿﺪ ﮐﻪ ﭼﻨﺪﯾﻦ ﻣﺜﻠﺚ ﺟﺪا از ﻫﻢ رﺳﻢ ﮐﻨﺪ: ﻣﺜﺎل
#include<gl/glut.h>
void init()
{
glClearColor(0,0,0,0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(100,100,0,200);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glColor3f(0,0,1.0);
glVertex2f(-0.8, -0.8);
glVertex2f(-0.6, -0.4);
glVertex2f(-0.3, -0.8);
glColor3f(0,1,0);
glVertex2f(0.8, 0.8);
glVertex2f(0.6, 0.4);
glVertex2f(0.3, 0.8);
glColor3f(1,0,0);
glVertex2f(-0.4, 0.0);
glVertex2f(0.0, 0.5);
glVertex2f(0.4, 0.0);
glEnd();
glFlush();
}
int main(int argc,char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(200,200);
"Triangels");
glutCreateWindow("Triangels"
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
: ﮐﻪ ﺧﺮوﺟﯽ زﯾﺮ را ﺗﻮﻟﯿﺪ ﻣﯿﮑﻨﺪ
29
: ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﯾﺴﯿﺪ ﮐﻪ دو ﻣﺜﻠﺚ ﺑﻪ ﻫﻢ ﭼﺴﺒﯿﺪه)ﻣﺸﺘﺮك در ﯾﮏ ﺿﻠﻊ( رﺳﻢ ﮐﻨﺪ: ﻣﺜﺎل
#include<gl/glut.h>
void init()
{
glClearColor(0,0,0,0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(100,100,0,200);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLE_STRIP);
glColor3f(0,0,1.0);
glVertex2f(0.4, 0.0);
glVertex2f(0.0, -0.5);
glVertex2f(-0.4, 0.0);
glColor3f(1,0,0);
glVertex2f(-0.4, 0.0);
glVertex2f(0.0, 0.5);
glVertex2f(0.4, 0.0);
glEnd();
glFlush();
}
int main(int argc,char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(200,200);
osition(200,200);
Strip Triangels"
glutCreateWindow(Strip Triangels");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
: ﮐﻪ ﺧﺮوﺟﯽ زﯾﺮ را ﺗﻮﻟﯿﺪ ﻣﯿﮑﻨﺪ
30
: ﻣﺜﻠﺜﻬﺎﯾﯽ رﺳﻢ ﮐﻨﯿﺪ ﮐﻪ در ﯾﮏ راس ﻣﺸﺘﺮك ﺑﺎﺷﻨﺪ: ﻣﺜﺎل
#include<gl/glut.h>
void init()
{
glClearColor(0,0,0,0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(100,100,0,200);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glBegin(GL_TRIANGLE_FAN);
glVertex2f(-0.0, 0.0);
glVertex2f(-0.7, 0.0);
glVertex2f(-0.7, 0.7);
glVertex2f(0.0, 0.7);
glVertex2f(0.7, 0.7);
glVertex2f(0.7, 0.0);
glVertex2f(0.7, -0.7);
glVertex2f(0.0, -0.7);
glVertex2f(-0.7, -0.7);
glEnd();
glFlush();
}
int main(int argc,char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(200,200);
glutCreateWindow("FAN Triangels");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
: ﮐﻪ ﺧﺮوﺟﯽ زﯾﺮ را ﺗﻮﻟﯿﺪ ﻣﯿﮑﻨﺪ
31
: ﺿﻠﻌﯽ رﺳﻢ ﮐﻨﺪ8 ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﯾﺴﯿﺪ ﮐﻪ ﯾﮏ: ﻣﺜﺎل
#include<gl/glut.h>
void init()
{
glClearColor(0,0,0,0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(100,100,0,200);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glPolygonMode(GL_FRONT_AND_BACK,
GL_FRONT_AND_BACK, GL_LINE);
glBegin(GL_POLYGON);
glVertex2f(-0.7, -0.4);
glVertex2f(-0.7, 0.4);
glVertex2f(-0.4, 0.7);
glVertex2f(0.4, 0.7);
glVertex2f(0.7, 0.4);
glVertex2f(0.7, -0.4);
glVertex2f(0.4, -0.7);
glVertex2f(-0.4, -0.7);
glEnd();
glFlush();
}
int main(int argc,char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(200,200);
glutCreateWindow("Polygon"
"Polygon");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
اﺳﺘﻔﺎده ﻣﯿﺸﻮد ﮐﻪ ﺗﻌﺪاد اﺿﻼع آن ﺗﻮﺳﻂ رﺋﻮس ﺗﻌﺮﯾﻒGL_POLYGON ﺑﺮاي رﺳﻢ ﭼﻨﺪ ﺿﻠﻌﯽ از دﺳﺘﻮر: ﻧﮑﺘﻪ
. ﺷﺪه ﻣﺸﺨﺺ ﻣﯿﺸﻮد
32
ﻧﻮع ﺗﺮﺳﯿﻢ ﺷﮑﻞ را ﻣﺸﺨﺺ ﻣﯿﮑﻨﺪ ﮐﻪ آﯾﺎ ﺗﻮﭘﺮ ﺑﺎﺷﺪ ﯾﺎ ﺗﻮﺧﺎﻟﯽ و ﭘﺎراﻣﺘﺮglPolygonMode(face, mode) دﺳﺘﻮر: ﻧﮑﺘﻪ
را ﺑﻪ ﺧﻮدGL_BACK ﯾﺎGL_FRONT ﯾﺎGL_FRONT_AND_BACK ﻣﯿﺘﻮاﻧﺪ ﻣﻘﺎدﯾﺮface
را ﻣﯿﺘﻮاﻧﺪ ﺑﮕﯿﺮد ﮐﻪGL_LINE ﯾﺎGL_POINT ﯾﺎGL_FILL ﻧﯿﺰ ﻣﻘﺎدﯾﺮmode اﺧﺘﺼﺎص دﻫﺪ و ﭘﺎراﻣﺘﺮ
. اﺳﺖGL_FILL ﭘﯿﺸﻔﺮض آن
: ﺿﻠﻌﯽ رﺳﻢ ﮐﻨﺪ4 ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﯾﺴﯿﺪ ﮐﻪ ﯾﮏ ﻟﻮزي و ﻣﺘﻮازي اﻻﺿﻼع را ﺑﻪ وﺳﯿﻠﻪ: ﻣﺜﺎل
#include<gl/glut.h>
void init()
{
glClearColor(0,0,0,0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(100,100,0,200);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glPolygonMode(GL_FRONT_AND_BACK,
_AND_BACK, GL_LINE);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glBegin(GL_QUADS);
glVertex2f(-0.8, 0);
glVertex2f(-0.4, 0.4);
glVertex2f(0.0, 0.0);
glVertex2f(-0.4, -0.4);
glVertex2f(0.9, 0.5);
glVertex2f(0.2, 0.5);
glVertex2f(0.1, 0.0);
glVertex2f(0.8, 0.0);
glEnd();
glFlush();
}
int main(int argc,char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(200,200);
glutCreateWindow("QUADS");
);
init();
glutDisplayFunc(display);
isplayFunc(display);
glutMainLoop();
return 0;
} : ﮐﻪ ﺧﺮوﺟﯽ زﯾﺮ را ﺗﻮﻟﯿﺪ ﻣﯿﮑﻨﺪ
33
و ﺑﺎ رﻧﮓ زرد رﺳﻢ4 ﮐﻪ ﺑﺎ رﻧﮓ آﺑﯽ ﭘﺮ ﺷﺪه و در وﺳﻂ آن ﻣﺮﺑﻌﯽ ﺑﻪ ﺿﻠﻊ9 ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﯾﺴﯿﺪ ﮐﻪ داﯾﺮه اي ﺗﻮﭘﺮ ﺑﻪ ﺷﻌﺎع: ﻣﺜﺎل
:ﮐﻨﺪ
#include <GL/glut.h>
#include <math.h>
int Height=400, Width=400;
#define edgeOnly 0
void DrawCircle(double radius, int numberOfSides)
{
glutInitDisplayMode(GLUT_DOUBLE);
glutInitWindowSize(Width, Height);
glutCreateWindow("Circle Example");
glutDisplayFunc(display);
glutMainLoop();
}
34
: ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﯾﺴﯿﺪ ﮐﻪ ﯾﮏ ﻣﺜﻠﺚ ﺑﺎ ﻃﯿﻒ رﻧﮕﯽ اﯾﺠﺎد ﮐﻨﺪ: ﻣﺜﺎل
#include <GL/glut.h>
void Init(void)
{
glClearColor(1.0,1.0,1.0,0.0);
};
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
glRotatef(0,0.0,0.0,1.0);
glBegin(GL_POLYGON);
glColor3f(1.0, 0.0, 0.0);
glVertex2f(-0.5, -0.5);
glColor3f(0.0, 1.0, 0.0);
glVertex2f(0.5, -0.5);
glColor3f(0.0, 0.0, 1.0);
glVertex2f(0.0, 0.5);
glEnd();
glPopMatrix();
glutSwapBuffers();
}
35
: 5 رﺳﻢ ﺧﻂ ﺑﻪ وﺳﯿﻠﻪ اﻟﮕﻮرﯾﺘﻢ ﺑﺮزﻧﻬﺎم: ﻣﺜﺎل
#include<GL/glut.h>
#include <stdlib.h>
#include <math.h>
void init(void)
{
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,300.0,0.0,300.0);
}
void setPixel(GLint xCoordinate, GLint yCoordinate)
{
glBegin(GL_POINTS);
glVertex2i(xCoordinate,yCoordinate);
glEnd();
glFlush(); //executes all OpenGL functions as quickly as possible
}
//Bresenham line-drawing procedure for |m| < 1.0
void lineBres(GLint x0, GLint y0, GLint xEnd, GLint yEnd)
{
GLint dx = abs(xEnd - x0);
GLint dy = abs(yEnd - y0);
GLint p = 2 * dy - dx;
GLint twoDy = 2 * dy;
GLint twoDyMinusDx = 2 * (dy-dx);
GLint x,y;
// determine which endpoint to use as start position
if (x0 > xEnd){
x = xEnd;
y = yEnd;
xEnd = x;
}else{
x = x0;
y = y0;
}
setPixel(x,y);
while(x<xEnd){
x++;
if(p<0)
p += twoDy;
else{
y++;
p += twoDyMinusDx;
}
setPixel(x,y);
}
}
void drawMyLine(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glPointSize(4.0);
GLint x0 = 100;
GLint y0 = 150;
GLint xEnd = 200;
GLint yEnd = 200;
lineBres(x0,y0,xEnd,yEnd);
}
void main(int argc, char**argv)
{
5
http://en.wikipedia.org/wiki/Bresenham's_line_algorithm
36
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400,400);
glutInitWindowPosition(0,0);
glutCreateWindow("Bresenham");
init();
glutDisplayFunc(drawMyLine);
glutMainLoop();
}
37
: رﺳﻢ داﯾﺮه ﺑﻪ وﺳﯿﻠﻪ اﻟﮕﻮرﯾﺘﻢ ﻧﻘﻄﻪ ﻣﯿﺎﻧﯽ: ﻣﺜﺎل
#include<GL/glut.h>
class screenPoint
{
private:
GLint x,y;
public:
/* Defult constructor: initializes coordinates position to (0,0) */
screenPoint()
{
x = 0;
y = 0;
}
//Methods
void setCoordinates(GLint xCoordinateValue, GLint yCoordinateValue)
{
x = xCoordinateValue;
y = yCoordinateValue;
}
GLint getx () const
{
return x;
}
GLint gety () const
{
return y;
}
void incrementx ()
{
x++;
}
void decrementy ()
{
y--;
}
};
void setPixel(GLint xCoordinate, GLint yCoordinate)
{
glBegin(GL_POINTS);
glVertex2i(xCoordinate, yCoordinate);
glEnd();
glFlush(); //process all OpenGL functions as quickly as possible
}
void circleMidPoint(GLint xc, GLint yc, GLint raduis)
{
screenPoint circlePoint;
//initialize value for midpoint parameter
GLint p = 1-raduis;
//set coordinates for top point of circle
circlePoint.setCoordinates(0,raduis);
//function prototype
void circlePlotPoints(GLint, GLint, screenPoint);
//plot the initial point in each quadrant
circlePlotPoints(xc, yc, circlePoint);
//calculate the next point and plot in each octant
while(circlePoint.getx() < circlePoint.gety())
{
circlePoint.incrementx();
if(p<0)
p += 2 * circlePoint.getx() + 1;
else{
circlePoint.decrementy ();
p += 2 * (circlePoint.getx () - circlePoint.gety ()) + 1;
38
}
circlePlotPoints(xc, yc, circlePoint);
}
}
void circlePlotPoints(GLint
(GLint xc, GLint yc, screenPoint circPoint)
{
setPixel(xc + circPoint.getx () , yc + circPoint.gety ());
setPixel(xc - circPoint.getx () , yc + circPoint.gety ());
setPixel(xc + circPoint.getx () , yc - circPoint.gety ());
setPixel(xc - circPoint.getx () , yc - circPoint.gety ());
setPixel(xc + circPoint.gety () , yc + circPoint.getx ());
setPixel(xc - circPoint.gety () , yc + circPoint.getx ());
setPixel(xc + circPoint.gety () , yc - circPoint.getx ());
setPixel(xc - circPoint.gety () , yc - circPoint.getx ());
}
//Initialize OpenGL
void init(void)
{
glClearColor(0.0,0.0,0.0,0.0); //set display
display-window color to black
glMatrixMode(GL_PROJECTION); //set projection parameters
gluOrtho2D(0.0,300.0,0.0,300.0);
}
void drawMyCircle(void)
{
glClear(GL_COLOR_BUFFER_BIT); //clear display
display-window
glColor3f(1.0,0.0,0.0); //set pixel color to red
glPointSize(3.0);
GLint xCenter = 150;
GLint yCenter = 150;
GLint raduis = 100;
circleMidPoint(xCenter, yCenter, raduis);
}
void main(int argc, char**argv)
{
glutInit(&argc, argv); //initialize GLUT
glutInitWindowPosition(10,10); //set top
top-left display-window position
glutInitWindowSize(500,500); //set display
display-window width and height to 500
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //set display mode
//Now display the window with a title
glutCreateWindow("Circle Mid Point ");
);
init(); //execute initialization procedure of OpenGL
glutDisplayFunc(drawMyCircle); //send graphics to display window
glutMainLoop(); //display everything and wait
}
: ﮐﻪ ﺧﺮوﺟﯽ زﯾﺮ را ﺗﻮﻟﯿﺪ ﻣﯿﮑﻨﺪ
39
: ﺑﺮﻧﺎﻣﻪ رﺳﻢ داﯾﺮه ﺑﻪ وﺳﯿﻠﻪ اﻟﮕﻮرﯾﺘﻢ ﺑﺮزﻧﻬﺎم: ﻣﺜﺎل
#include<GL/glut.h>
#include<stdlib.h>
#include<math.h>
GLfloat x=10.0 ;
GLfloat y=0.0;
GLfloat x1;
void init()
{
glClearColor(0,0,0,0);
gluOrtho2D(-20,20,-20,20);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
x=15;
y=0;
x1=0;
glColor3f(1,0,0);
while(x>y)
{
glBegin(GL_POINTS);
{
glVertex2f(x,y);
glVertex2f(-x,y);
glVertex2f(x,-y);
glVertex2f(-x,-y);
glVertex2f(y,x);
glVertex2f(-y,x);
glVertex2f(-y,-x);
glVertex2f(y,-x);
}
glEnd();
y++;
x1=sqrt((x*x)-2*y-1); : ﮐﻪ ﺧﺮوﺟﯽ زﯾﺮ را ﺗﻮﻟﯿﺪ ﻣﯿﮑﻨﺪ
x=x1;
}
glFlush();
}
40
: رﺳﻢ داﯾﺮه ﺑﻪ روش دﮐﺎرﺗﯽ: ﻣﺜﺎل
#include<GL/glut.h>
#include <stdlib.h>
#include <math.h>
void init(void)
{
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,300.0,0.0,300.0);
}
void setPixel(GLint xCoordinate, GLint yCoordinate)
{
glBegin(GL_POINTS);
glVertex2i(xCoordinate,yCoordinate);
glEnd();
glFlush(); //executes all OpenGL functions as quickly as possible
}
double round(double x)
{
return floor(x + 0.5);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1,0,0);
floatCircle(150,150,100);
glFlush();
}
init();
glutDisplayFunc(display);
glutMainLoop();
}
41
: رﺳﻢ داﯾﺮه ﺑﻪ روش ﻗﻄﺒﯽ: ﻣﺜﺎل
#include<GL/glut.h>
#include <stdlib.h>
#include <math.h>
const float PI=3.14;
int circle_points=100;
void init(void)
{
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,300.0,0.0,300.0);
}
void setPixel(GLint xCoordinate, GLint yCoordinate)
{
glBegin(GL_POINTS);
glVertex2i(xCoordinate,yCoordinate);
glEnd();
glFlush(); //executes all OpenGL functions as quickly as possible
}
double round(double x)
{
return floor(x + 0.5);
}
init();
glutDisplayFunc(display);
glutMainLoop();
}
42
: ﺑﺮﻧﺎﻣﻪ رﺳﻢ ﺧﻂ ﺑﺎ ﻧﻘﻄﻪ: ﻣﺜﺎل
#include<GL/glut.h>
void init()
{
glClearColor(0.1,0.2,0.1,0);
glutInitWindowPosition(200,60);
glutInitWindowSize(800,400);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0,100,0,200);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
for(int i=1; i<2000 ;i++)
{
glBegin(GL_POINTS);
glVertex2i(i,i*2);
glEnd();
}
glFlush();
}
int main(int argc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutCreateWindow("Test");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
: ﮐﻪ ﺧﺮوﺟﯽ زﯾﺮ را ﺗﻮﻟﯿﺪ ﻣﯿﮑﻨﺪ
43
ﮔﺮاﻓﯿﮏ ﺳﻪ ﺑﻌﺪي در : opengl
ﺑﺮاي رﺳﻢ اﺷﯿﺎي ﺳﻪ ﺑﻌﺪي ﻫﻤﺎﻧﻨﺪ رﺳﻢ اﺷﯿﺎي دو ﺑﻌﺪي ﻋﻤﻞ ﻣﯿﮑﻨﯿﻢ .رﺳﻢ اﺷﯿﺎي ﺳﻪ ﺑﻌﺪي ﺑﺴﯿﺎر ﺑﺴﯿﺎر ﺳﺎده و آﺳﺎن اﺳﺖ و ﺑﺮاي
ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﺎن OpenGLﻟﺬت ﺑﺨﺶ ﺗﺮﯾﻦ ﺑﺨﺶ ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ اﺳﺖ.
ﻗﺎب ﺳﯿﻤﯽ) : (Wire frameﺷﯽ را ﺑﺎ اﺳﺘﻔﺎده از ﺧﻄﻮط رﺳﻢ ﻣﯽ ﻧﻤﺎﯾﺪ ﺗﺎ ﻟﺒﻪ ﻫﺎي ﻣﺮﺋﯽ ﭼﻨﺪ ﺿﻠﻌﯽ ﻫﺎ را ﻧﻤﺎﯾﺶ دﻫﺪ .
:ﺳﻄﺢ ﺷﯽ را ﺑﻪ ﺻﻮرت ﻫﻤﺮاه رﻧﮓ و ﺑﻪ ﺻﻮرت ﻫﻤﻮار ﻧﻤﺎﯾﺶ ﻣﯿﺪﻫﺪ.و اﯾﻦ ﺣﺎﻟﺖ ﺑﺎﻻﺗﺮﯾﻦ ﺳﻄﺢ ﻫﻤﻮار ) (Smooth
واﻗﻊ ﮔﺮاﯾﯽ را داراﺳﺖ.
44
اﯾﻦ دﺳﺘﻮر ﺑﺮاي رﺳﻢ ﻣﮑﻌﺐ ﺑﻪ ﺻﻮرت ﺳﯿﻤﯽ اﺳﺖ glutWireCube(GLdouble size)
اﯾﻦ دﺳﺘﻮر ﺑﺮاي رﺳﻢ ﻣﮑﻌﺐ ﺑﻪ ﺻﻮرت ﻫﻤﻮار اﺳﺖ glutSolidCube(GLdouble size)
glutWireCone(GLdouble base,
اﯾﻦ دﺳﺘﻮر ﺑﺮاي رﺳﻢ ﻣﺨﺮوط ﺑﻪ ﺻﻮرت ﺳﯿﻤﯽ اﺳﺖ GLdouble height,GLint slices, GLint
(stacks
اﯾﻦ دﺳﺘﻮر ﺑﺮاي رﺳﻢ ﻣﺨﺮوط ﺑﻪ ﺻﻮرت ﻫﻤﻮار اﺳﺖ glutSolidCone(GLdouble base,
GLdouble height,GLint slices, GLint
(stacks
45
glutWireTorus(GLdouble
اﯾﻦ دﺳﺘﻮر ﺑﺮاي رﺳﻢ ﺗﯿﻮب ﺑﻪ ﺻﻮرت ﺳﯿﻤﯽ اﺳﺖ innerRadius,GLdouble
outerRadius,GLint nsides, GLint
rings)
glutSolidTorus(GLdouble
اﯾﻦ دﺳﺘﻮر ﺑﺮاي رﺳﻢ ﺗﯿﻮب ﺑﻪ ﺻﻮرت ﻫﻤﻮار اﺳﺖ innerRadius,GLdouble
outerRadius,GLint nsides, GLint
rings)
اﯾﻦ دﺳﺘﻮر ﺑﺮاي رﺳﻢ ﻗﻮري ﺑﻪ ﺻﻮرت ﺳﯿﻤﯽ اﺳﺖ glutWireTeapot(GLdouble size)
اﯾﻦ دﺳﺘﻮر ﺑﺮاي رﺳﻢ ﻗﻮري ﺑﻪ ﺻﻮرت ﻫﻤﻮار اﺳﺖ glutSolidTeapot(GLdouble size)
46
راﻫﻨﻤﺎي ﺑﺮﺧﯽ از دﺳﺘﻮرات :
) : glShadeModel(GLenum Modeﯾﮑﯽ از ﻗﺎﺑﻠﯿﺖ ﻫﺎي ﻣﻬﻢ OpenGLﺗﺮﮐﯿﺐ رﻧﮓ ﻫﺎي ﻣﺨﺘﻠﻒ در ﯾﮏ ﺷﺊ o
اﺳﺖ .ﮐﻪ در اﯾﻦ ﮐﺎر ﻫﺮ راس از ﺷﺊ رﻧﮓ ﻣﺘﻔﺎوﺗﯽ ﻣﯿﮕﯿﺮد .اﯾﻦ ﺗﺎﺑﻊ ﺑﻪ OpenGLﻣﯿﮕﻮﯾﺪ ﮐﻪ اﺷﯿﺎي ﻣﺎ ﻓﻘﻂ ﯾﮏ رﻧﮓ ﺑﮕﯿﺮﻧﺪ ﯾﺎ ﺑﺎ
ﭼﻨﺪ رﻧﮓ ﻣﺨﺘﻠﻒ رﻧﮓ آﻣﯿﺰي ﺷﻮﻧﺪ .اﯾﻦ ﺗﺎﺑﻊ ﺑﻪ ﺟﺎي GLenum Modeﻣﯿﺘﻮاﻧﺪ ﻣﻘﺎدﯾﺮ زﯾﺮ را ﺑﮕﯿﺮد :
در ﺣﺎﻟﺖ ﭘﯿﺶ ﻓﺮض ﻣﻘﺪار ﺗﺎﺑﻊ glShadeModelﺑﺮاﺑﺮ GL_FLATاﺳﺖ ﮐﻪ ﻣﺎ در اﯾﻦ ﺻﻮرت ﻓﻘﻂ ﯾﮏ رﻧﮓ ﻣﯿﺘﻮاﻧﯿﻢ ﺑﻪ ﺷﺊ
ﻣﺎن اﺧﺘﺼﺎص دﻫﯿﻢ.
ﺑﺎﯾﺪ ﻫﻤﯿﺸﻪ اﯾﻦ ﻧﮑﺘﻪ را ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﯿﺪ ﮐﻪ ﺗﺎﺑﻊ glShadeModelﻗﺒﻞ از ﺑﻠﻮك glBegin / glEndﺑﯿﺎﯾﺪ ﮐﻪ در ﻏﯿﺮ اﯾﻦ
ﺻﻮرت ﺧﻄﺎ رخ ﻣﯿﺪﻫﺪ.
) : glViewport(GLint x,GLint y,GLsizei width,GLsizei heightﺑﺮاي اﻧﺘﺨﺎب ﻧﺎﺣﯿﻪ دﯾﺪ اﺳﺘﻔﺎده ﻣﯿﺸﻮد . o
ﮐﻪ در آن ) (x,yﻣﺨﺘﺼﺎت ﭘﯿﮑﺴﻠﯽ ﮔﻮﺷﻪ ﺳﻤﺖ ﭼﭗ ﭘﺎﯾﯿﻦ درﯾﭽﻪ دﯾﺪ ﻧﺴﺒﺖ ﺑﻪ ﮔﻮﺷﻪ ﺳﻤﺖ ﭼﭗ ﭘﺎﯾﯿﻦ ﭘﻨﺠﺮه ﻣﯽ ﺑﺎﺷﺪ.
heightو Widthﻋﺮض و ارﺗﻔﺎع درﯾﭽﻪ دﯾﺪ ﺑﺮ ﺣﺴﺐ ﭘﯿﮑﺴﻞ ﻣﯽ ﺑﺎﺷﺪ .
: glutSwapBuffers() oدر ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ ﺑﺎ openglﻣﯿﺘﻮان از دو ﺑﺎﻓﺮ اﺳﺘﻔﺎده ﮐﺮد ﮐﻪ اﯾﻦ دﺳﺘﻮر ﺑﺎﻓﺮ ﭘﺸﺘﯽ را ﺑﺎ ﺑﺎﻓﺮ
ﺟﻠﻮﯾﯽ ﺟﺎﺑﺠﺎ ﻣﯿﮑﻨﺪ .ﺗﻤﺎم رﺳﻤﻬﺎ در ﺑﺎﻓﺮ ﭘﺸﺘﯽ اﺗﻔﺎق ﻣﯽ اﻓﺘﺪ و ﻫﻨﮕﺎﻣﯽ ﮐﻪ آﻣﺎده ﺷﺪ ﺟﺎي دو ﺑﺎﻓﺮ ﺑﺎ ﻫﻢ ﻋﻮض ﻣﯿﺸﻮداﯾﻦ
ﮐﺎر از ﭘﺮﭘﺮ زدن ﺗﺼﻮﯾﺮ ﺟﻠﻮﮔﯿﺮي ﻣﯿﮑﻨﺪ )ﺑﻪ ﻧﻤﺎﯾﺶ ﺑﺪون ﭘﺮﭘﺮ ﺗﺼﻮﯾﺮ ﻓﻠﯿﮑﺮ ﻧﯿﺰ ﻣﯿﮕﻮﯾﻨﺪ( .
اﺳﺘﻔﺎده ﻣﯿﮑﻨﯿﻢ . glutInitDisplayMode ﯾﺎدآوري :ﻫﻤﺎﻧﻄﻮر ﮐﻪ ﻗﺒﻼ ﮔﻔﺘﯿﻢ ﺑﺮاي ﻣﺸﺨﺺ ﮐﺮدن ﺗﻌﺪاد ﺑﺎﻓﺮﻫﺎ از دﺳﺘﻮر
47
)( : glutPostRedisplayﺑﺎ اﺳﺘﻔﺎده از اﯾﻦ ﺗﺎﺑﻊ ﺑﻪ ﺻﻮرت ﻣﺠﺎزي رﺧﺪاد refreshرا ﺑﺮاي ﭘﻨﺠﺮه ﻓﻌﺎل ﻣﯽ ﺷﻮد. o
زﻣﺎﻧﯽ از اﯾﻦ ﺗﺎﺑﻊ اﺳﺘﻔﺎده ﻣﯽ ﮐﻨﯿﻢ ﮐﻪ ﻣﯽ ﺧﻮاﻫﯿﻢ ﺑﯿﻦ ﯾﮏ ﺗﺎﺑﻊ و ﺗﺎﺑﻊ displayارﺗﺒﺎط ﺑﺮﻗﺮار ﮐﻨﯿﻢ.
)) : glutIdleFunc(void (*func)(voidاﯾﻦ ﺗﺎﺑﻊ ,ﺗﺎﺑﻊ ﻧﻤﺎﯾﺶ را ﻣﮑﺮرا ﺗﮑﺮار ﻣﯿﮑﻨﺪ ﺗﺎزﻣﺎﻧﯽ ﮐﻪ دﯾﮕﺮ ﻫﯿﭻ رﺧﺪادي o
درﯾﺎﻓﺖ ﻧﺸﻮد .
)) : glutMouseFunc(void (*func)(int button, int state,int x, int yﺗﺎﺑﻊ callbackﺑﺮاي ﻣﺎوس در ﭘﻨﺠﺮه o
ﺟﺎري را ﻣﺸﺨﺺ ﻣﯿﮑﻨﺪ.ﺗﺎﺑﻌﯽ ﮐﻪ ﺑﻌﻨﻮان ﺗﺎﺑﻊ ﭘﺮدازش ﻣﺎوس ﺑﻪ ﺗﺎﺑﻊ ﻓﻮق ﻣﻌﺮﻓﯽ ﻣﯽ ﺷﻮد ﺑﺎﯾﺪ ﭼﻬﺎر ورودي داﺷﺘﻪ ﺑﺎﺷﺪ:
ﭘﺎراﻣﺘﺮ اول ﻣﻌﯿﻦ ﻣﯽ ﮐﻨﺪ ﮐﻪ ﮐﺪام دﮐﻤﻪ ﻣﺎوس ﻓﺸﺮده ﯾﺎ رﻫﺎ ﺷﺪه اﺳﺖ ﮐﻪ ﺳﻪ ﺣﺎﻟﺖ دارد :
GLUT_LEFT_BUTTON
GLUT_MIDDLE_BUTTON
GLUT_RIGHT_BUTTON
ﭘﺎراﻣﺘﺮ دوم وﺿﻌﯿﺖ دﮐﻤﻪ ﻣﺮﺑﻮﻃﻪ ،ﯾﻌﻨﯽ ﻓﺸﺮده ﺷﺪن ﯾﺎ رﻫﺎ ﺷﺪن آن اﺳﺖ ﮐﻪ دو ﺣﺎﻟﺖ زﯾﺮ را دارد:
GLUT_DOWN
GLUT_UP
ﭘﺎراﻣﺘﺮ ﺳﻮم و ﭼﻬﺎرم ﻧﯿﺰ ﻣﻮﻗﻌﯿﺖ ﻣﺎوس در ﻣﺨﺘﺼﺎت ﻣﯽ ﺑﺎﺷﺪ.
)) : glutKeyboardFunc(void (*func)(unsigned char key,int x, int yﺗﺎﺑﻊ callbackﺑﺮاي ﮐﯽ ﺑﻮرد در o
ﭘﻨﺠﺮه ﺟﺎري را ﻣﺸﺨﺺ ﻣﯿﮑﻨﺪ .ﺑﺮاي ﭘﺮدازش ﻓﺸﺮده ﺷﺪن ﮐﻠﯿﺪﻫﺎي ﻣﻌﻤﻮﻟﯽ ﺑﻪ ﮐﺎر ﺑﺮده ﻣﯽ ﺷﻮد.ﮐﻠﯿﺪﻫﺎي ﻣﻌﻤﻮﻟﯽ ﻣﺜﻞ ﺣﺮوف
اﻟﻔﺒﺎ و اﻋﺪاد و ﻫﻤﻪ ﮐﺎراﮐﺘﺮﻫﺎﯾﯽ ﮐﻪ داراي ﮐﺪ اﺳﮑﯽ ﻫﺴﺘﻨﺪ.ﺑﺎﺷﺪ در ﺻﻮرﺗﯿﮑﻪ ﭘﺎراﻣﺘﺮ ﺗﺎﺑﻊ ﻓﻮق NULLاز ﮐﻠﯿﺪﻫﺎي ﻣﻌﻤﻮﻟﯽ
ﺻﺮﻓﻨﻈﺮ ﻣﯽ ﺷﻮد.
ﺗﺎﺑﻌﯽ ﮐﻪ ﺑﻌﻨﻮان ﭘﺎراﻣﺘﺮ ﺗﺎﺑﻊ ﻓﻮق ﻣﻌﺮﻓﯽ ﻣﯽ ﺷﻮد ﺑﺎﯾﺴﺘﯽ ﺳﻪ ﭘﺎراﻣﺘﺮ ورودي داﺷﺘﻪ ﺑﺎﺷﺪ :
48
): glutReshapeFunc(reshape o
ﺑﻪ ﻫﻨﮕﺎم ﺗﻐﯿﯿﺮ اﻧﺪازه ﭘﻨﺠﺮه ﺗﺎﺑﻊ reshapeﻓﺮاﺧﻮاﻧﯽ ﺧﻮاﻫﺪ ﺷﺪ . ü
ﺷﺎﻣﻞ اوﻟﯿﻦ رﺳﻢ ﭘﻨﺠﺮه ﻧﯿﺰ ﻣﯽ ﺑﺎﺷﺪ . ü
ﺗﺎﺑﻊ ،ﻋﺮض و ارﺗﻔﺎع ﭘﻨﺠﺮه ﺟﺪﯾﺪ را ﺑﻪ ﺑﻌﻨﻮان ﭘﺎراﻣﺘﺮ درﯾﺎﻓﺖ ﻣﯽ ﮐﻨﺪ. ü
: glPopMatrix() oﻣﺎﺗﺮﯾﺲ ﺑﺎﻻي ﭘﺸﺘﻪ را ﺑﺮداﺷﺘﻪ و ﺑﻌﻨﻮان ﻣﺎﺗﺮﯾﺲ ﻓﻌﻠﯽ ﻗﺮار ﻣﯽ دﻫﺪ.
: glPushMatrix() oﺗﻤﺎم ﺗﻮاﺑﻊ دﯾﮕﺮ ﻣﺎﺗﺮﯾﺲ ﻓﻌﻠﯽ ﺑﻪ ﻏﯿﺮ از ﺑﺎﻻي ﭘﺸﺘﻪ را ﺗﺨﺮﯾﺐ ﻣﯽ ﮐﻨﺪ.
: glTranslate{f,d}( TYPE x, TYPE, y, TYPE z ) oﺑﺮاي اﻧﺘﻘﺎل ﯾﮏ ﺟﺴﻢ از ﻧﻘﻄﻪ اي ﺑﻪ ﻧﻘﻄﻪ دﯾﮕﺮ اﺳﺘﻔﺎده ﻣﯿﺸﻮد و
ﻣﺎﺗﺮﯾﺲ ﺟﺎري را در ﻣﺎﺗﺮﯾﺲ ﺗﺒﺪﯾﻞ ﺿﺮب ﻣﯽ ﮐﻨﺪ .
49
) : glRotate{f,d}( TYPE angle, TYPE x, TYPE y, TYPE zﺑﺮاي دوران ﯾﮏ ﺟﺴﻢ اﺳﺘﻔﺎده ﻣﯿﺸﻮد . o
دوران ﺣﻮل ﻣﺤﻮر دﻟﺨﻮاه ﺑﺎ زاوﯾﻪ اي ﺑﻪ اﻧﺪازه angle ü
دوران ﺣﻮل ﻣﺤﻮر (angle,1.0,0.0,0.0) x ü
دوران ﺣﻮل ﻣﺤﻮر (angle,o.0,1.0,0.0) y ü
دوران ﺣﻮل ﻣﺤﻮر (angle,0.0,0.0,1.0) z ü
: glScale{f,d}( TYPE x, TYPE y, TYPE z) oﺑﺮاي ﻣﻘﯿﺎس ﯾﮏ ﺟﺴﻢ اﺳﺘﻔﺎده ﻣﯿﺸﻮد .
50
): glLight{f,i}{v}(GLenum light,GLenum pname,const GLfloat *params ⃝
ﻧﻮر ﭘﺮدازي در OpenGLﺑﺎﻋﺚ ﻣﯿﺸﻮد ﮐﻪ ﺻﺤﻨﻪ ﻫﺎﯾﯽ ﮐﻪ ﺧﻠﻖ ﻣﯿﺸﻮﻧﺪ ﻃﺒﯿﻌﯽ ﺑﻪ ﻧﻈﺮ ﺑﺮﺳﻨﺪ .در openglﻣﺎ ﭼﻬﺎر ﻧﻮع ﻧﻮر ﭘﺮدازي
دارﯾﻢ Ambientو Diffuseو Specularو . Emmisive
در ﺗﺎﺑﻊ ﺑﺎﻻ آرﮔﻮﻣﺎن GLenum lightﻧﺎم ﻣﻨﺒﻊ ﻧﻮر اﺳﺖ و GLenum pnameﻧﻮع دﺳﺘﺮﺳﯽ ﺑﻪ ﻧﻮر اﺳﺖ ﮐﻪ اﮔﺮ ﯾﮑﯽ از
ﻣﻘﺎدﯾﺮ) (GL_DIFFUSE, GL_ AMBIENT, GL_ SPECULAR, GL_ EMMISIVEﺑﺎﺷﺪ ﺑﯿﺎﻧﮕﺮ اﯾﻦ اﺳﺖ ﮐﻪ آرﮔﻮﻣﺎن
ﺑﻌﺪي رﻧﮓ ﻧﻮر را ﭘﺮدازش ﺧﻮاﻫﺪ ﮐﺮد ﮐﻪ اﯾﻦ آراﯾﻪ داراي 4اﻧﺪﯾﺲ ﯾﺎ ﻋﻀﻮ اﺳﺖ .ﺳﻪ ﻋﻀﻮ اول آراﯾﻪ ﻣﺸﺨﺺ ﮐﻨﻨﺪه ي رﻧﮓ R,G,B
اﺳﺖ و ﻋﻀﻮ آﺧﺮ ﻣﻘﺪار Alphaاﺳﺖ ﮐﻪ ﺷﺪت ﻧﻮر رو ﻣﺸﺨﺺ ﻣﯽ ﮐﻨﺪ .اﻣﺎ اﮔﺮ آرﮔﻮﻣﺎن دوم ﺑﺮاﺑﺮ ﻣﻘﺪار GL_POSITIONﺑﺎﺷﺪ
ﺑﯿﺎﻧﮕﺮ اﯾﻦ اﺳﺖ ﮐﻪ آرﮔﻮﻣﺎن ﺳﻮم ﻣﺤﻞ ﻧﻮر را ﭘﺮدازش ﺧﻮاﻫﺪ ﮐﺮد و اﯾﻦ آراﯾﻪ ﺑﺎﯾﺪ ﺳﻪ ﻋﻨﺼﺮي ﺑﺎﺷﺪ ﮐﻪ ﻣﺸﺨﺺ ﮐﻨﻨﺪه ي X,Y,Z
ﻫﺴﺘﻨﺪ .ﺑﻪ ﻣﻘﺎدﯾﺮ زﯾﺮ ﺗﻮﺟﻪ ﮐﻨﯿﺪ :
;}GLfloat A[4]={1,1,1,1
;}GLfloat Pos1[4]={9,5,1,0
;)glLightfv(GL_LIGHT0,GL_DIFFUSE,A
;)glLightfv(GL_LIGHT0,GL_POSITION,Pos1
ﻻزم ﺑﻪ ذﮐﺮ اﺳﺖ ﮐﻪ ﺑﺮاي اﺳﺘﻔﺎده از ﻣﻨﺒﻊ ﻧﻮر ﺑﺎﯾﺪ آن را ﻓﻌﺎل ﮐﻨﯿﻢ و ﻫﻤﭽﻨﯿﻦ ﻣﻘﺎدﯾﺮ GL_LIGHTINGو GL_DEPTH_TEST
و GL_COLOR_MATERIALﻧﯿﺰ ﺑﺎﯾﺪ ﻓﻌﺎل ﮔﺮدﻧﺪ .
;)glEnable(GL_LIGHTING
;)glEnable(GL_DEPTH_TEST
;)glEnable(GL_COLOR_MATERIAL
;)glEnable(GL_LIGHT0
: glMaterialf
اﯾﻦ ﺗﻮاﺑﻊ ﭘﺎراﻣﺘﺮﻫﺎي ﻣﺎده را ﺑﺮاي ﻣﺪل ﻧﻮر ﭘﺮدازي ﺗﻌﯿﯿﻦ ﻣﯽ ﮐﻨﻨﺪ.
: Faceوﺟﻪ ﯾﺎ وﺟﻮﻫﯽ اﺳﺖ ﮐﻪ ﺑﺎﯾﺪ ﺑﻪ روز در آورده ﺷﻮﻧﺪ و ﯾﮑﯽ از ﺳﻪ ﻣﻘﺪار , GL_FRONT GL_FRONT_AND_BACK ,
GL_BACKﻣﯽ ﺗﻮاﻧﺪ ﺑﺎﺷﺪ .
: Pnameدر اﯾﻦ ﺣﺎﻟﺖ ﻓﻘﻂ GL_SHININESSﻣﯽ ﺗﻮاﻧﺪ ﺑﺎﺷﺪ و paramﻣﻘﺪاري اﺳﺖ ﮐﻪ ﭘﺎراﻣﺘﺮ ﯾﺎد
ﺷﺪه ﺑﻪ آن ﺗﻨﻈﯿﻢ ﺧﻮاﻫﺪ ﺷﺪ.
: glMaterialfv
آرﮔﻮﻣﺎن faceدر آن ﻫﻤﺎﻧﻨﺪ ﺗﺎﺑﻊ ﻗﺒﻠﯽ اﺳﺖ و pnameﻣﻘﺎدﯾﺮ زﯾﺮ را ﻣﯽ ﺗﻮاﻧﺪ داﺷﺘﻪ ﺑﺎﺷﺪ :
GL_AMBIENTو GL_DIFFUSEو : GL_SPECULARﻫﻤﺎﻧﻨﺪ آﻧﭽﻪ ﮐﻪ در ﻗﺴﻤﺖ ﻗﺒﻞ ﮔﻔﺘﻪ ﺷﺪ ﻣﯽ ﺑﺎﺷﻨﺪ .
: GL_EMISSIONدر اﯾﻦ ﺣﺎﻟﺖ ﭘﺎراﻣﺘﺮ paramﺣﺎوي ﭼﻬﺎر ﻋﺪد ﺧﻮاﻫﺪ ﺑﻮد ﮐﻪ ﺷﺪت RGBAﻧﻮر ﺳﺎﺗﻊ ﺷﺪه را ﻣﻌﯿﻦ ﻣﯽ
ﮐﻨﻨﺪ
: GL_SHININESSدر اﯾﻦ ﺣﺎﻟﺖ ﭘﺎراﻣﺘﺮ paramﺣﺎوي ﭼﻬﺎر ﻋﺪد ﺧﻮاﻫﺪ ﺑﻮد ﮐﻪ ﺟﺰء آﯾﻨﻪ اي RGBAرا ﻣﻌﯿﻦ ﻣﯽ ﮐﻨﻨﺪ و در
ﺑﺎزه 0و 128ﻗﺮار دارﻧﺪ.
: GL_AMBIENT_AND_DIFFUSEﮐﻪ ﮐﺎﻣﻼ واﺿﺢ اﺳﺖ .
51
: GL_COLOR_INDEXESدر اﯾﻦ paramﺣﺎوي ﺳﻪ ﻋﺪد ﺧﻮاﻫﺪ ﺑﻮد ﮐﻪ اﻧﺪﯾﺲ ﻫﺎي رﻧﮕﯽ ﻣﺤﯿﻄﯽ اﻧﺘﺸﺎري و آﯾﻨﻪ اي را
ﻣﻌﯿﻦ ﻣﯽ ﮐﻨﻨﺪ .اﯾﻦ ﺳﻪ ﻣﻘﺪار و GL_SHININESSﺗﻨﻬﺎ ﻣﻘﺎدﯾﺮ ﻣﻮاد ﺑﮑﺎر ﮔﺮﻓﺘﻪ ﺷﺪه در اﯾﻦ ﺣﺎﻟﺖ ﻧﻮر ﭘﺮدازي ﻣﯽ ﺑﺎﺷﻨﺪ.
ﺑﺮاي داﺷﺘﻦ ﺣﺮﮐﺖ در ﺑﺮﻧﺎﻣﻪ ﻫﺎ )اﻧﯿﻤﯿﺸﻦ( ﻣﺎ ﻧﯿﺎز ﺑﻪ رﺧﺪادي دارﯾﻢ ﮐﻪ در ﻓﻮاﺻﻞ زﻣﺎﻧﯽ ﻣﺸﺨﺺ ﺑﯿﺎﯾﺪ ﺑﺮاي اﯾﻦ از رﺧﺪاد ﺗﺎﯾﻤﺮ
اﺳﺘﻔﺎده ﻣﯿﮑﻨﯿﻢ.رﺟﯿﺴﺘﺮ ﮐﺮدن اﯾﻦ رﺧﺪاد ﺑﺎ ﺗﺎﺑﻊ glutTimerFuncاﺳﺖ وﻟﯽ اﯾﻦ ﺗﺎﺑﻊ ﺑﺎ ﺗﻮاﺑﻊ ﻣﺸﺎﺑﻪ 3ﺗﻔﺎوت دارد :
-1ﻓﺮاﺧﻮاﻧﯽ اﯾﻦ رﺧﺪاد در دﺳﺖ ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺲ اﺳﺖ )ﭘﺎراﻣﺘﺮ اول زﻣﺎن آن را ﻣﺸﺨﺺ ﻣﯽ ﮐﻨﺪ(
ﺗﻮﺟﻪ :در آﺧﺮ ﺗﻤﺎﻣﯽ ﺗﻮاﺑﻊ ﺑﺎﻻ ﺑﺎﯾﺪ دﺳﺘﻮر glutPostRedisplayرا ﻧﻮﺷﺖ ﺗﺎ ﺗﻐﯿﯿﺮات ﺑﻪ ﺗﺎﺑﻊ displayرود .
;)glutTimerFunc(2000,timerFunc,0
ﺗﮑﻨﯿﮏ ﻣﻪ در اﮐﺜﺮ ﺗﺼﺎوﯾﺮ ﺳﻪ ﺑﻌﺪي ﺑﻪ ﺧﺼﻮص ﺑﺎزي ﻫﺎي ﮐﺎﻣﭙﯿﻮﺗﺮي ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﯽ ﮔﯿﺮد .ﭘﺎراﻣﺘﺮ GLenum
pnameﻣﯿﺘﻮاﻧﺪ ﻣﻘﺎدﯾﺮ GL_FOG_MODE, GL_FOG_DENSITY, GL_FOG_START, GL_FOG_END,
GL_FOG_INDEX, GL_FOG_COORD_SRCرا ﺑﮕﯿﺮد و ﭘﺎراﻣﺘﺮ GLfloat paramﻣﻘﺪار ﺳﺖ ﺷﺪه ﻧﺴﺒﺖ ﺑﻪ
آرﮔﻮﻣﺎن ﻗﺒﻠﯽ را ﻣﺸﺨﺺ ﻣﯿﮑﻨﺪ .
ﺗﮑﻨﯿﮏ fogﺑﻪ ﻃﻮر ﭘﯿﺸﻔﺮض ﻏﯿﺮ ﻓﻌﺎل اﺳﺖ ﺷﻤﺎ ﺑﺮاي اﺳﺘﻔﺎده اول ﺑﺎﯾﺪ آن را ﻓﻌﺎل ﮐﻨﯿﺪﺑﻪ وﺳﯿﻠﻪ ﺗﺎﺑﻊ ). glEnable(GL_FOG
ﺑﻪ اﯾﻦ ﻣﺜﺎﻟﻬﺎ دﻗﺖ ﮐﻨﯿﺪ :
;}GLfloat fogColor[4] = {0, 01, 0, 1.0
;)glFogfv (GL_FOG_COLOR, fogColor
ﯾﺎ
;)glFogf (GL_FOG_DENSITY, 0.1
52
): glLineStipple(GLint factor, GLushort pattern o
اﻟﮕﻮي ﻧﻘﺶ ﯾﮏ ﺧﻂ را ﻣﻌﯿﻦ ﻣﯽ ﮐﻨﺪ .ﭘﺎراﻣﺘﺮ GLint factorدر ﻫﺮ ﺑﯿﺖ اﻟﮕﻮي ﻧﻘﺶ زدن ﺿﺮب ﻣﯽ ﺷﻮد
: Patternﻋﺪد 16ﺑﯿﺘﯽ ﺻﺤﯿﺢ ،ﺑﻄﻮرﯾﮑﻪ اﻟﮕﻮي ﺑﯿﺘﯽ آن ) ﺳﺮي ﺻﻔﺮ و ﯾﮏ ﻫﺎ ( ﻣﻌﯿﻦ ﻣﯽ ﺳﺎزد
ﮐﻪ ﮐﺪام اﺟﺰاء از ﺧﻂ رﺳﻢ ﺧﻮاﻫﻨﺪ ﺷﺪ ) ﻋﺪد ﯾﮏ ﺑﻪ ﻣﻌﻨﺎي ﺗﺮﺳﯿﻢ و ﺻﻔﺮ ﺑﻪ ﻣﻌﻨﺎي ﻋﺪم ﺗﺮﺳﯿﻢ ﻣﯽ ﺑﺎﺷﺪ(.
ﺑﯿﺖ ﺻﻔﺮ در اﺑﺘﺪا ﺑﮑﺎر ﻣﯽ رود و ﺗﻤﺎم اﻟﮕﻮي ﭘﯿﺶ ﻓﺮض از ﯾﮏ ﺗﺸﮑﯿﻞ ﺷﺪه اﺳﺖ.
ﻗﺒﻞ از ﺑﮑﺎ ر ﺑﺮدن اﯾﻦ ﺗﺎﺑﻊ ﺑﺎﯾﺪ از دﺳﺘﻮر ) glEnable(GL_LINE_STIPPLEﺑﺮاي ﻓﻌﺎل ﺳﺎزي اﯾﻦ ﺣﺎﻟﺖ اﺳﺘﻔﺎده ﮐﺮد
ﺑﺮاي ﻣﺜﺎل ﺑﺎ اﻟﮕﻮي $3F07ﮐﻪ در ﻣﺒﻨﺎي دو ﻣﻌﺎدل 0011111100000111ﻣﯽ ﺑﺎﺷﺪ ،ﺧﻄﯽ رﺳﻢ ﺧﻮاﻫﺪ ﺷﺪ ﺑﺎ ﺳﻪ
ﻧﻘﻄﻪ روﺷﻦ 5 ،ﻧﻘﻄﻪ ﺧﺎﻣﻮش 6 ،ﻧﻘﻄﻪ روﺷﻦ و 2ﻧﻘﻄﻪ ﺧﺎﻣﻮش .اﮔﺮ factorﻣﺴﺎوي 2ﺑﺎﺷﺪ ،اﻟﮕﻮ ﮐﺸﯿﺪه ﻣﯽ ﺷﻮد 6 :
ﻧﻘﻄﻪ روﺷﻦ 10 ،ﻧﻘﻄﻪ ﺧﺎﻣﻮش 12 ،ﻧﻘﻄﻪ روﺷﻦ و 4ﻧﻘﻄﻪ ﺧﺎﻣﻮش .در ﺗﺼﻮﯾﺮ زﯾﺮ ﻣﺜﺎﻟﻬﺎي ﯾﺒﺸﺘﺮي اراﺋﻪ ﺷﺪه اﻧﺪ .ﺑﺎﯾﺪ ﺧﺎﻃﺮ
ﻧﺸﺎ ن ﮐﺮد ﮐﻪ اﻋﺪاد ﻣﺒﻨﺎي 16در زﺑﺎن Cﺑﺎ 0Xآﻏﺎز ﻣﯽ ﺷﻮﻧﺪ .
اﻟﮕﻮي ﻧﻘﺶ ﯾﮏ ﭼﻨﺪﺿﻠﻌﯽ را ﻣﻌﯿﻦ ﻣﯽ ﮐﻨﺪ mask .اﺷﺎره ﮔﺮي اﺳﺖ ﺑﻪ ﯾﮏ اﻟﮕﻮي32در 32ﺑﯿﺘﯽ .ﻗﺒﻞ از ﺑﮑﺎر ﮔﯿﺮي
ﺗﺎﺑﻊ ﺑﺎﯾﺪ اﯾﻦ ﺣﺎﻟﺖ را ﺑﻮﺳﯿﻠﻪ دﺳﺘﻮر ) glEnable(GL_POLYGON_STIPPLEﻓﻌﺎل ﻧﻤﻮد .ﺑﺼﻮرت ﭘﯿﺶ ﻓﺮض ﺗﻤﺎم ﭼﻨﺪ ﺿﻠﻌﯽ ﻫﺎ ﺑﺎ
ﯾﮏ اﻟﮕﻮي ﺗﻮﭘﺮ ﺗﺮﺳﯿﻢ ﻣﯽ ﺷﻮﻧﺪ.
): glBitmap(GLsizei width, GLsizei height,GLfloat xorig, GLfloat yorig,GLfloat xmove, GLfloat ymove,const GLubyte *bitmap o
ﺑﯿﺖ ﻣﭗ ﻫﺎ آراﯾﻪ اي ﻣﺴﺘﻄﯿﻠﯽ از ﻧﻘﺎط ﻣﯽ ﺑﺎﺷﻨﺪ ﮐﻪ در ﻫﺮ ﻧﻘﻄﻪ آن ﯾﮏ ﺗﮏ ﺑﯿﺖ ﻗﺮار دارد دﺳﺘﻮرات glBitmapو
glRasterPosﺑﺮاي ﻗﺮار دادن و ﻧﻤﺎﯾﺶ ﯾﮏ ﺑﯿﺖ ﻣﭗ ﺑﺮ روي ﺻﻔﺤﻪ ﺑﮑﺎر ﻣﯽ روﻧﺪ .ﻋﻤﻮﻣﺎ ﺑﯿﺖ ﻣﭗ ﻫﺎ ﺑﺮاي ﻧﻤﺎﯾﺶ
ﻓﻮﻧﺖ ﻫﺎ ك ارﺑﺮد دارﻧﺪ .ﺑﺮاي ﻣﺜﺎل ﮐﺎراﮐﺘﺮ Fرا ﺑﺼﻮرت زﯾﺮ ﻣﯽ ﺗﻮان ﻃﺮاﺣﯽ ﮐﺮد.
53
داده ﻫﺎي ﺑﯿﺖ ﻣﭗ ﻫﺎ ﻫﻤﻮاره در ﻗﻄﻌﺎﺗﯽ ﮐﻪ ﻣﻀﺮﺑﯽ از 8ﺑﯿﺖ ﻫﺴﺘﻨﺪ ذﺧﯿﺮه ﻣﯽ ﺷﻮﻧﺪ .ﺑﯿﺖ ﻫﺎﯾﯽ ﮐﻪ ﺑﯿﺖ ﻣﭗ ﻫﺎ را ﺗﺸﮑﯿﻞ
ﻣﯽ دﻫﻨﺪ از ﮔﻮﺷﻪ ﺳﻤﺖ ﭼﭗ ﭘﺎﯾﯿﻦ ﺷﺮوع ﻣﯽ ﺷﻮﻧﺪ ،ﺳﭙﺲ ردﯾﻒ ﭘﺎﯾﯿﻦ رﺳﻢ ﻣﯽ ﺷﻮد در اداﻣﻪ ردﯾﻒ ﺑﺎﻻﯾﯽ و ﺑﻪ ﻫﻤﯿﻦ
ﺗﺮﺗﯿﺐ.
در دﺳﺘﻮر ﺑﺎﻻ ﺑﯿﺖ ﻣﭙﯽ را ﮐﻪ ﺗﻮﺳﻂ آرﮔﻮﻣﺎن const GLubyte *bitmapﻣﻌﯿﻦ ﮔﺸﺘﻪ ﺗﺮﺳﯿﻢ ﻣﯽ ﮐﻨﺪ .اﮔﺮ ﻣﺤﻞ ﻗﺮار
ﮔﯿﺮي آن در ﺻﻔﺤﻪ ﻣﺠﺎز ﻧﺒﺎﺷﺪ ،ﭼﯿﺰي رﺳﻢ ﻧﺨﻮاﻫﺪ ﺷﺪ.
: GLsizei height , GLsizei widthﻃﻮل و ﻋﺮض ﺑﯿﺖ ﻣﭗ را ﻣﺸﺨﺺ ﻣﯽ ﮐﻨﻨﺪ.
: GLfloat yorig, GLfloat xorigﻣﻮﻗﻌﯿﺖ ﻣﺒﺪا را در ﺑﯿﺖ ﻣﭗ ﻣﺸﺨﺺ ﻣﯽ ﮐﻨﻨﺪ .ﻣﺒﺪا از ﮔﻮﺷﻪ ﭘﺎﯾﯿﻦ ،ﺳﻤﺖ ﭼﭗ اﻧﺪازه
ﮔﯿﺮي ﻣﯽ ﺷﻮد.
x : GLfloat ymove, GLfloat xmoveو yاﯾﯽ ﻫﺴﺘﻨﺪ ﮐﻪ ﺑﻪ ﻣﻮﻗﻌﯿﺖ rasterﺟﺎري ﭘﺲ از اﯾﻨﮑﻪ ﺑﯿﺖ ﻣﭗ رﺳﻢ ﻣﯽ
ﺷﻮد ،اﺿﺎﻓﻪ ﻣﯽ ﮔﺮدﻧﺪ.
)… :glRasterPos{2,3,4}{i,d,f,s}{v}(Glint x,Glint y,ﺑﺮاي ﺗﻌﯿﯿﻦ ﻣﻮﻗﻌﯿﺖ ﺷﻄﺮﻧﺠﯽ ﺑﺮاي ﻋﻤﻠﯿﺎت ﭘﯿﮑﺴﻠﯽ اﺳﺖ . o
) : glPixelStore{f,i}(GLenum pname,GLfloat paramﺣﺎﻟﺖ ذﺧﯿﺮه ﺳﺎزي ﭘﯿﮑﺴﻞ را ﺗﻨﻈﯿﻢ ﻣﯿﮑﻨﺪ ﭘﺎراﻣﺘﺮ o
GLenum pnameﻣﯿﺘﻮاﻧﺪ ﺷﺎﻣﻞ ﯾﮑﯽ از ﻣﻘﺎدﯾﺮ :
54
: ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﯾﺴﯿﺪ ﮐﻪ ﯾﮏ ﻣﺜﻠﺚ ﺑﺎ ﺧﻄﻮط ﺧﻄﭽﯿﻦ رﺳﻢ ﮐﻨﺪ: ﻣﺜﺎل
#include<GL/glut.h>
void init()
{
glClearColor(0.1,0.1,0.4,0);
glutInitWindowPosition(200,600);
glutInitWindowSize(800,800);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0,100,0,200);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.2,0.8);
glEnable (GL_LINE_STIPPLE);
glVertex2i(60,70);
glVertex2i(40,120);
glVertex2i(20,70);
glVertex2i(60,70);
: ﮐﻪ ﺧﺮوﺟﯽ زﯾﺮ را ﺗﻮﻟﯿﺪ ﻣﯿﮑﻨﺪ
glEnd();
glFlush();
}
int main(int argc,char**argv)
{
glutInit(&argc,argv);
glutCreateWindow("Test");
glutDisplayFunc(display);
glutInitDisplayMode(GLUT_SINGLE|GLU
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
init();
glutMainLoop();
return 0;
}
55
: رﺳﻢ ﮐﻨﺪbitmap ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﯾﺴﯿﺪ ﮐﻪ ﺷﮑﻞ زﯾﺮ را ﺑﺎ اﺳﺘﻔﺎده از ﻣﻔﻬﻮم: ﻣﺜﺎل
#include<GL/glut.h>
void init()
{
glutInitWindowPosition(100,200);
glutInitWindowSize(900,900);
glClearColor(1,1,1,0);
glMatrixMode(GL_PROJECTION );
glOrtho (0,100,0,150,0,1);
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0,0,0);
glRotatef(0,1,2,3);
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glRasterPos2i(40,80);
glBitmap(31,30,0,0,0,0,bitShape);
glutSwapBuffers ();
////////////////
56
glRasterPos2i(20,60);
glBitmap(31,30,0,0,0,0,bitShape);
////////////////
glRasterPos2i(60,60);
glBitmap(31,30,0,0,0,0,bitShape);
}
int main(int argc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE |GLUT_RGB);
glutCreateWindow("bitmap");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
57
ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﯾﺴﯿﺪ ﮐﻪ دو ﮐﺮه را رﺳﻢ ﮐﻨﺪ و اﯾﻦ ﮐﺮه ﻫﺎ ﺑﻪ ﻃﺮف ﻫﻢ ﺣﺮﮐﺖ ﮐﻨﻨﺪ و اﮔﺮ روي ﻫﻢ اﻓﺘﺎدﻧﺪ ﺗﺮﮐﯿﺐ: ﻣﺜﺎل
: رﻧﮕﺸﺎن ﻣﺸﺨﺺ ﺷﻮد
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
#include <math.h>
// Rotation amounts
static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glColor4f(0.0,0.0,1,0.50);
glPushMatrix();
glRotatef(fElect1, 0.0f, 1.0f, 0.0f);
glTranslatef(90.0f, 0.0f, 0.0f);
glutSolidSphere(10.0f, 15, 15);
glPopMatrix();
glColor4f(1,0,0,0.20);
glPushMatrix();
glRotatef(fElect1, 0.0f, 1.0f, 0.0f);
glTranslatef(0.0f - 90, 0.0f, 0.0f);
glutSolidSphere(10.0f, 15, 15);
glPopMatrix();
58
glEnable(GL_CULL_FACE); // Do not calculate inside of jet
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
return 0;
}
59
ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﯾﺴﯿﺪ ﮐﻪ ﻣﮑﻌﺒﯽ در ﺻﻔﺤﻪ اﯾﺠﺎد ﮐﻨﺪ و ﺑﺎ ﮐﻠﯿﮏ ﭼﭗ اﯾﻦ ﻣﮑﻌﺐ ﭼﺮﺧﺶ ﮐﻨﺪ و ﺑﺎ ﮐﻠﯿﮏ دﮐﻤﻪ وﺳﻂ: ﻣﺜﺎل
: ﻣﺎوس ﭼﺮﺧﺶ ﻣﺘﻮﻗﻒ ﺷﻮد
#include <GL/glut.h>
#include <stdlib.h>
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef(spin, 0.3, 0.2, 1.0);
glColor3f(1.0, 1.0, 1.0);
glutWireCube(50);
glPopMatrix();
glutSwapBuffers();
}
void spinDisplay(void)
{
spin = spin + 2.0;
if (spin > 360.0)
spin = spin - 360.0;
glutPostRedisplay();
}
60
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow ("test");
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMouseFunc(mouse);
glutMainLoop();
return 0;
}
61
: ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﯾﺴﯿﺪ ﮐﻪ ﻣﮑﻌﺒﯽ در ﺻﻔﺤﻪ اﯾﺠﺎد ﮐﻨﺪ و ﺑﺎ ﺣﺮﮐﺖ ﻣﺎوس ﻣﮑﻌﺐ ﻧﯿﺰ ﭼﺮﺧﺶ ﮐﻨﺪ: ﻣﺜﺎل
#include <gl/glut.h>
void drawBox()
{
glBegin(GL_QUADS);
bool init()
{
glClearColor(0.93f, 0.93f, 0.93f, 0.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glClearDepth(1.0f);
return true;
62
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(
0.0f, 0.0f, 3.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f);
drawBox();
glFlush();
glutSwapBuffers();
}
glViewport(0, 0, w, h);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void idle()
{
if (!mouseDown)
{
xrot += 0.3f;
yrot += 0.4f;
}
glutPostRedisplay();
}
if (fullscreen)
glutFullScreen();
else
{
glutReshapeWindow(500, 500);
63
glutPositionWindow(50, 50);
}
}
}
xdiff = x - yrot;
ydiff = -y + xrot;
}
else
mouseDown = false;
}
glutPostRedisplay();
}
}
glutInitWindowPosition(50, 50);
glutInitWindowSize(500, 500);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutSpecialFunc(specialKeyboard);
glutMouseFunc(mouse); : ﮐﻪ ﺧﺮوﺟﯽ زﯾﺮ را ﺗﻮﻟﯿﺪ ﻣﯿﮑﻨﺪ
glutMotionFunc(mouseMotion);
glutReshapeFunc(resize);
//glutIdleFunc(idle);
if (!init())
return 1;
glutMainLoop();
return 0;
}
64
ﻧﻮر دوم روﺷﻦ ﺷﻮد2 ﻧﻮر اول روﺷﻦ ﺷﻮد و ﺑﺎ زدن ﮐﻠﯿﺪ1 ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﯾﺴﯿﺪ ﮐﻪ دوﻋﺪد ﻧﻮر اﯾﺠﺎد ﮐﻨﺪ و ﺑﺎ زدن ﮐﻠﯿﺪ: ﻣﺜﺎل
: ﻫﺮ دو ﻧﻮر ﻫﻤﺰﻣﺎن روﺷﻦ ﺷﻮﻧﺪ3 و ﺑﺎ زدن ﮐﻠﯿﺪ
#include <GL/glut.h>
void init(void)
{
GLfloat ambient[]={1,1,1,1};
GLfloat diff[]={0,1,1,1};
GLfloat mat_specular[] = { 1.0, 0.0, 0.0, 1.0 };
GLfloat mat_shininess[] = { 2.0 };
GLfloat light1_position[] = { 1.0, 1.0, -.2, 0.0 };
GLfloat light0_position[] = { -1.0, -1.0, 1.0, 0.0 };
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
}
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidSphere (1.0, 200, 50);
glFlush ();
}
65
glEnable(GL_LIGHT0);
glDisable(GL_LIGHT1);
glutPostRedisplay();
y();
break;
case '3':
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glutPostRedisplay();
break;
}
}
66
ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﯾﺴﯿﺪ ﮐﻪ ﮐﺮه اي در وﺳﻂ ﺻﻔﺤﻪ رﺳﻢ ﮐﻨﺪ ﺳﭙﺲ ﻧﻮري ﺑﻪ رﻧﮓ ﺳﻔﯿﺪ از ﯾﮏ ﻃﺮف ﺗﺎﺑﯿﺪه ﺷﺪه و ﺑﺎ: ﻣﺜﺎل
: ﮔﺬﺷﺖ زﻣﺎن ﻫﻢ ﻣﮑﺎن و ﻫﻢ رﻧﮓ ﻧﻮر ﺗﻐﯿﯿﺮ ﯾﺎﺑﺪ
#include<gl/glut.h>
GLfloat A[4]={1,1,1,1};
GLfloat Pos1[4]={9,5,1,0};
GLfloat D=0;
int i=0;
int j=1;
int k=0;
int cheaker=0;
void init()
{
glClearColor(0,0,0,0);
glShadeModel(GL_SMOOTH);
glLightfv(GL_LIGHT0,GL_DIFFUSE,A);
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
}
void display()
{
glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT);
glColor3f(0,1,0);
glEnable(GL_LIGHT0);
glutSolidSphere(0.4,100,100);
glPushMatrix();
glRotatef(D,i,j,k);
glLightfv(GL_LIGHT0,GL_POSITION,Pos1);
glPopMatrix();
glutSwapBuffers();
D+=.3;
A[1]-=.001;
glLightfv(GL_LIGHT0,GL_DIFFUSE,A);
}
67
glutDisplayFunc(display);
glutIdleFunc(display);
glutMainLoop();
}
: ﮐﻪ ﺧﺮوﺟﯽ زﯾﺮ را ﺗﻮﻟﯿﺪ ﻣﯿﮑﻨﺪ
68
ﻣﻨﺎﺑﻊ
Addison Wesley OpenGL SuperBible 5 th Edition
OpenGL Programming Guide: The Official Guide to Learning OpenGL (7 th Edition)(Red Book)
www.opengl.org
www.lighthouse3d.com
www.songho.ca/opengl
www.fly.cc.fer.hr/~unreal/theredbook
www3.ntu.edu.sg/home/ehchua/programming/index.html#OpenGL
www.nurani.ir
www.s1390.mihanblog.com
www.irnt.blogfa.com
69
70