OpenGL中的二維編程——從簡單的矩形開始

一、OpenGL的組成

  • 圖元函數(primitive function)指定要生成屏幕圖像的圖元。包括兩種類型:可以在二維、三維或者四維空間進行定義的幾何圖元,如多邊形;離散實體;位圖。
  • 屬性函數(attribute function)負責控制圖元的外觀。這類函數定義了顏色、線型、材質屬性、光照以及紋理。
  • 觀察函數(viewing function)指定攝像機的屬性。OpenGL提供一個虛擬攝像機,我們可相對于由圖元函數定義的對象設置該攝像機的位置和朝向。我們也可以控制攝像機的鏡頭參數,以便制造出廣角或長焦效果。
  • 查詢函數(query function)允許我們決定某一特定系統的性能以及OpenGL狀態變量的取值。
  • 控制函數(control function)允許我們啟用或禁用各種OpenGL特性,如消隱、紋理映射和光照等。
  • 輸入與窗口函數不屬于OpenGL核心庫,但是由于它們在交互式程序中的重要地位,這類函數已被包含在GLUT庫中。這些函數使我們能夠對屏幕中的窗口進行控制并使用鼠標和鍵盤。

?

二、庫組織結構

下圖是Linux平臺下實現的庫組織結構

對于Windows?或 Macintosh平臺,也有一張類似的組織結構圖。

應用程序既可以使用OpenGL、GLU以及GLX庫中的函數,也可以直接使用X庫或X工具集中的函數。

另外還有一種折衷的方法是借助GLUT庫,這樣可以使同一個程序能夠在不同的平臺下重新編譯和運行。

?

三、GLUT

void glutInit(int * argc, char ** argv);
//初始化GLUT,應在其他GLUT函數和OpenGL函數之前進行調用。
//glutInit()接收來自main函數的參數,程序可以具體實現相關的方式來使用這些參數

所有的GLUT函數都是以glut為前綴。

函數glutCreateWindow()將一個窗口以默認尺寸(300*300像素)顯示在屏幕的默認位置上(屏幕左上角)。該函數的參數使我們可為窗口創建一個標題。

int glutCreatewindow(char * title)
//在屏幕上創建一個窗口,該窗口的標題由參數title給出。
//在多窗口情況下,該函數返回一個標識所創建窗口的整數。

下圖是帶有GLUT的庫組織結構:

?

四、事件循環和回調函數

void glutDisplayFunc(void (*func)(void))
//函數func()在每次需要對窗口重繪時被調用。
void glutMainLoop()
//使程序進入無限事件處理循環。該函數的調用應作為main函數最后一條語句出現

提示:GLUT回調函數的形式是固定的。所以,若要在不同的函數之間進行值傳播,可能需要借助全局變量。

?

五、矩形的繪制

void glVertex<234><sifd>(type xcoordinate,type ycoordiante,...)
void glVertex<234><sifd>(type * coordinates)
//指定頂點在二維、三維或思維空間中的位置坐標,坐標值的類型可以是short(s)、int(i)、float(f)或double(d)。
//如果函數名的末尾出現了v,則type為一個指向指定類型的坐標數組的指針。
void glBegin(GLenum mode)
//指定mode類型對象的起始點。mode可取GL_POINTS、GL_LINES或GL_POLYGON
void glEnd()
//指定頂點列表的終止點

提示:在頂點列表的末尾不要忘記包含glEnd()。

void glClear(GLbitfield mask)
//清空mask指示的所有緩存的位。
//其中mask可由定義在gl.h中的常量通過邏輯或運算構成。GL_COLOR_BUFFER_BIT指顏色緩存
void glFlush()
//強制執行之前緩存的所有OpenGL命令

?

六、示例程序

Github地址

 1 #include <GL/glut.h>
 2 void display()  //定義了所要繪制的圖形實體
 3 {
 4     glClear(GL_COLOR_BUFFER_BIT);
 5     glBegin(GL_POLYGON);
 6         glVertex2f(-0.5, -0.5);
 7         glVertex2f(-0.5, 0.5);
 8         glVertex2f(0.5, 0.5);
 9         glVertex2f(0.5, -0.5);
10     glEnd();
11     glFlush();
12 }
13 
14 int main(int argc, char ** argv)  //OpenGL的初始化
15 {
16     glutInit(&argc, argv);
17     glutCreateWindow("simple");
18     glutDisplayFunc(display);
19     glutMainLoop();
20 }

?

轉載于:https://www.cnblogs.com/OctoptusLian/p/6343194.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394029.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394029.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394029.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

圓與平面的接觸面積_如果一個絕對的圓放在絕對的平面上,接觸面是不是無限小?...

這種問題其實并不難解答&#xff1a;如果你真的能找到一個絕對的圓還有一個絕對平的平面上&#xff0c;并且保證放上去之后圓和平面不會有任何變化&#xff0c;那么接觸面就可以是無限小&#xff01;如果不能&#xff0c;很抱歉&#xff0c;接觸面很顯然就不會是無限小&#xf…

leetocde1129. 顏色交替的最短路徑(bfs)

在一個有向圖中&#xff0c;節點分別標記為 0, 1, …, n-1。這個圖中的每條邊不是紅色就是藍色&#xff0c;且存在自環或平行邊。 red_edges 中的每一個 [i, j] 對表示從節點 i 到節點 j 的紅色有向邊。類似地&#xff0c;blue_edges 中的每一個 [i, j] 對表示從節點 i 到節點…

第38天:運算符、字符串對象常用方法

一、運算符 一元操作符 &#xff0c; --&#xff0c; &#xff0c; - 5 -6 邏輯操作符 !&#xff0c; &&&#xff0c; || 基本運算符 , -, *, /, % 關系操作符 >, <, >, <, , , !, ! 賦值 判斷 全等 條件操作符 &#xff08;三…

Redux Todos Example

此項目模板是使用Create React App構建的&#xff0c;它提供了一種簡單的方法來啟動React項目而無需構建配置。 使用Create-React-App構建的項目包括對ES6語法的支持&#xff0c;以及幾種非官方/尚未最終形式的Javascript語法 先看效果 這個例子可以幫助你深入理解在 Redux 中 …

有效電子郵件地址大全_如何優雅有效地處理介紹電子郵件

有效電子郵件地址大全by DJ Chung由DJ Chung 如何優雅有效地處理介紹電子郵件 (How to handle intro emails gracefully and effectively) 您想幫個忙時不想忘恩負義... (You don’t want to sound ungrateful when asking for a favor…) Let me tell you the story that ins…

notability錄音定位_Notability的一些使用技巧?

作為使用了一年Notability的考研狗 今天也來回答回答這個問題&#xff0c;希望可以給考研的同學一點點幫助。這個軟件的優點估計大家都知道&#xff0c;我在這里就不多說了。好吧&#xff0c;還有一個原因是我比較懶&#xff01;好了不多說廢話了&#xff0c;等會你們要打我了本…

python實現軟件的注冊功能(機器碼+注冊碼機制)

sklearn實戰-乳腺癌細胞數據挖掘 https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare 一、前言&#xff1a;目的&#xff1a;完成已有python圖像處理工具的注冊功能功能&am…

leetcode1306. 跳躍游戲 III(bfs)

這里有一個非負整數數組 arr&#xff0c;你最開始位于該數組的起始下標 start 處。當你位于下標 i 處時&#xff0c;你可以跳到 i arr[i] 或者 i - arr[i]。 請你判斷自己是否能夠跳到對應元素值為 0 的 任一 下標處。 注意&#xff0c;不管是什么情況下&#xff0c;你都無法…

Win10 UWP開發系列:使用VS2015 Update2+ionic開發第一個Cordova App

原文:Win10 UWP開發系列&#xff1a;使用VS2015 Update2ionic開發第一個Cordova App安裝VS2015 Update2的過程是非常曲折的。還好經過不懈的努力&#xff0c;終于折騰成功了。 如果開發Cordova項目的話&#xff0c;推薦大家用一下ionic這個框架&#xff0c;效果還不錯。對于Cor…

vavr_使用Vavr在Java 8流中更好的異常處理

vavrby Rajasekar Elango由Rajasekar Elango In this post, I will provide tips for better exception handling in Java 8 streams using the Functional Java library Vavr.在這篇文章中&#xff0c;我將提供使用Functional Java庫Vavr在Java 8流中更好地處理異常的技巧。 …

Python-strace命令追蹤ssh操作

Python-strace命令追蹤ssh操作 通過strace 命令追蹤ssh的進程ID&#xff0c;記錄操作的命令[實際上是內核里面記錄的東西]&#xff0c;進行操作日志的Py解析達到效果 追蹤進程并寫入ssh操作到文件中 Ps: 此時機器A已經ssh登錄了機器B&#xff0c;取得它的ssh進程PID 機器A登錄后…

java h2 derby_嵌入式H2數據庫的Spring配置以進行測試

小編典典由于我不知道是否有任何工具可以檢查數據庫&#xff0c;我認為一個簡單的解決方案是使用支持HSQL&#xff0c;H2和Derby 的Spring嵌入式數據庫(3.1.x docs&#xff0c;current docs)。 。使用H2&#xff0c;你的xml配置如下所示&#xff1a;如果你更喜歡基于Java的配置…

基礎的python程序_Python程序入門

Python語法元素入門Python語法元素分析注釋注釋&#xff1a;程序員在代碼中加入的說明信息&#xff0c;不被計算機執行注釋的兩種方法&#xff1a;單行注釋以#開頭多行注釋以開頭和結尾# Here are the commentsThis is a multiline commerntused in Python縮進1個縮進 &#xf…

解決阿里云服務器磁盤報警

一般磁盤報警涉及到實際磁盤和inode文件索引節點 1.df -h檢查磁盤占用不高 2.df -i檢查inode文件索引節點有一個掛載目錄達到89%,里面有一個目錄產生大量的4k大的緩存文件,刪除該目錄下的文件解決: 刪除該目錄下小于4kb的文件 find /data/tmp -type f -size -4 -exec rm -rf {}…

leetcode310. 最小高度樹(bfs)

對于一個具有樹特征的無向圖&#xff0c;我們可選擇任何一個節點作為根。圖因此可以成為樹&#xff0c;在所有可能的樹中&#xff0c;具有最小高度的樹被稱為最小高度樹。給出這樣的一個圖&#xff0c;寫出一個函數找到所有的最小高度樹并返回他們的根節點。格式該圖包含 n 個節…

如何構建自己的免費無服務器評論框

by Shaun Persad通過Shaun Persad 如何構建自己的免費無服務器評論框 (How you can build your own free, serverless comment box) Contentful’s flexible content modeling goes far beyond blog posts. Here’s how you can leverage Contentful and Netlify to create a …

[Swift]LeetCode1035.不相交的線 | Uncrossed Lines

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★?微信公眾號&#xff1a;山青詠芝&#xff08;shanqingyongzhi&#xff09;?博客園地址&#xff1a;山青詠芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;?GitHub地址&a…

BZOJ1054(搜索)

大力搜&#xff0c;狀態用一個16位的數字表示。 1 #include <bits/stdc.h>2 3 using namespace std;4 5 #define rep(i,a,b) for(int i(a); i < (b); i)6 7 const int A 30 1;8 9 struct node{int x, y; } op[A]; 10 struct Nod…

php sql語句過濾,php如何做sql過濾

php如何做sql過濾SQL注入攻擊指的是通過構建特殊的輸入作為參數傳入Web應用程序&#xff0c;而這些輸入大都是SQL語法里的一些組合&#xff0c;通過執行SQL語句進而執行攻擊者所要的操作&#xff0c;其主要原因是程序沒有細致地過濾用戶輸入的數據&#xff0c;致使非法數據侵入…

ajaxfileupload 返回值_ajaxFileUpload上傳文件返回json無法解析

最近做一個文件上傳的功能&#xff0c;還要綁定數據傳輸到后臺&#xff0c;為了不影響前端的體驗&#xff0c;采用ajax發送請求。找了一些資料&#xff0c;網上的用ajaxupload這個插件。但是無論成功還是失敗都是執行的error的回調函數。后臺我采用springmvc返回的json&#xf…