導航:首頁 > 編程語言 > opengl編程示例

opengl編程示例

發布時間:2022-09-02 07:04:46

Ⅰ 菜鳥學習OpenGL,做了下書上例子編譯通過,運行到glGenBuffers(1,&vbo)出錯;求指導

關於緩沖區的一些GL介面,是從GL1.5才開始有的,而windows自帶的GL只支持到1.1版本。但如果你的顯卡支持GL1.5以上的話,glew就很好的幫你完成了擴展工作,既然你用glew,那麼就應該在使用GL任何一個介面前首先調用glewInit來初始化這些擴展,否則那些GL介面都不能使用。在你的init方法開頭加glewInit就可以了。

Ⅱ opengl編寫游戲的可移植性 具體表現在什麼方面呢 請舉幾個例子.

OpenGL是個與硬體無關的軟體介面,可以在不同的平台如Windows 95、Windows NT、Unix、Linux、MacOS、OS/2之間進行移植。
OpenGL是圖形的底層圖形庫,不同的系統下有不同的庫,在編程時調用它的庫函數就可以了,具體庫函數是怎麼實現的編程時並不需要關心,所以一套源代碼可以在不同系統中編譯運行,我們只是在不同的系統下安裝系統適用的OpenGL庫就可以了。

而DirectX僅能用於Windows系列平台,所以不能被移植到其他的系統中。

opengl和directx並不都是游戲專用的,但因為游戲中都是有強大的圖形界面,所以都要用到opengl和directx。

Ⅲ 求vc6.0下的openGL編程實例

3D魔方游戲,OpenGL編寫,源程序
http://61.137.90.75/downloads104/sourcecode/game/655207603Dm.zip

Ⅳ vc ++6.0下 opengl系統開發環境文字

嘿嘿,我幫你湊一章出來

第三章 開發環境及相關技術的介紹
3.1 C語言特點
1. C是中級語言。它把高級語言的基本結構和語句與低級語言的實用性結合起來。C 語言可以像匯編語言一樣對位、位元組和地址進行操作, 而這三者是計算機最基本的工作單元。
2.C是結構式語言。結構式語言的顯著特點是代碼及數據的分隔化,即程序的各個部分除了必要的信息交流外彼此獨立。這種結構化方式可使程序層次清晰,便於使用、維護以及調試。C 語言是以函數形式提供給用戶的,這些函數可方便的調用,並具有多種循環、條件語句控製程序流向,從而使程序完全結構化。
3.C語言功能齊全。具有各種各樣的數據類型,並引入了指針概念,可使程序效率更高。另外C語言也具有強大的圖形功能,支持多種顯示器和驅動器。而且計算功能、邏輯判斷功能也比較強大,可以實現決策目的的游戲。
4. C語言適用范圍大。適合於多種操作系統,如Windows、DOS、UNIX等等;也適用於多種機型。
C語言對編寫需要硬體進行操作的場合,明顯優於其它解釋型高級語言,有一些大型應用軟體也是用C語言編寫的。
C語言具有繪圖能力強,可移植性,並具備很強的數據處理能力,因此適於編寫系統軟體,三維,二維圖形和動畫。它是數值計算的高級語言。
5.C語言文件由數據序列組成,可以構成二進制文件或文本文件
3.2 C++語言特點
C++是一種靜態數據類型檢查的,支持多重編程範式的通用程序設計語言。它是由貝爾實驗室的Bjarne Stroustrup設計和實現的。簡單性是C++的一個重要設計准則:如果在某個地方有一個選擇,簡化語言的定義或者簡化編譯器,那麼我們一定選前者。當然,還有一個最重要的考慮是保持與C的高度兼容性,這也就排除了對C語法的清理。C++語言的特性體現在以下方面:
C++沒有內部的高級數據類型,也沒有高級的基本操作。舉例來說,它既沒有提供帶有求逆運算的矩陣類型,也沒有帶拼接運算的字元串類型。如果某個用戶需要一個類型,那麼可以在語言本身之中定義它。事實上,定義新的通用或者專用類型就是在C++里最基本的程序設計活動。一個設計良好的用戶定義類型與一個內部類型之間的差異僅僅在於其定義的方式,而不在其使用方式。
在C++的設計中,極力避免了那些即使不用也會帶來運行時間或者空間額外開銷的特徵。
C++被設計為能使用傳統的編譯和運行時的環境,也就是那種在UNIX上的C程序設計環境。幸運的是,C++從來沒有被束縛於UNIX,它只是簡單地採用UNIX和C作為一種語言、庫、編譯器、連接器、執行環境等之間關系的模型。這種最小化的模型幫助C++在幾乎每個計算平台上取得了成功。然而,在那些提供了更多有意義的支持的環境里,使用C++當然就更好了,像動態載入、增量編譯、類型定義資料庫等都能得到很好的收效,又不會影響語言本身。
C++的類型檢查和數據隱藏特徵依賴於編譯時對程序的分析,以防止因為意外而破壞數據的情況。它們並不提供系統安全性或防止某些人有意地打破這些規則。它們當然可以隨意使用而不會帶來運行時額外的時間或空間開銷。這種想法是很有用的,一種語言特徵必須不僅是優美的,還是在真實程序的環境中能夠負擔起的東西。
C++中特別強主見程序的結構。因此,良好的程序設計習慣及面向對象的編程思想在C++程序設計中是相當重要的。[6]
3.3 Windows SDK簡介
微軟每推出一個重要的Windows版本,一般都會同時推出一個SDK(Software Development Kit)。SDK包含了開發該Windows版本所需的Windows函數和常數定義、API函數說明文檔、相關工具和示例。SDK一般使用C語言,但不包括編譯器。SDK是Software Development Kit的縮寫,中文意思是「軟體開發工具包」。這是一個覆蓋面相當廣泛的名詞,可以這么說:輔助開發某一類軟體的相關文檔、範例和工具的集合都可以叫做「SDK」。 開發 Windows 平台下的應用程序所使用的 SDK只是廣義 SDK 的一個子集。首先要接觸的是「API」,也就是 Application Programming Interface,其實就是操作系統留給應用程序的一個調用介面,應用程序通過調用操作系統的 API 而使操作系統去執行應用程序的命令(動作)。早在 DOS 時代就有 API 的概念,只不過那個時候的 API 是以中斷調用的形式(INT 21h)提供的,在 DOS 下跑的應用程序都直接或間接的通過中斷調用來使用操作系統功能,比如將 AH 置為 30h 後調用 INT 21h 就可以得到 DOS 操作系統的版本號。而在 Windows 中,系統 API 是以函數調用的方式提供的。同樣是取得操作系統的版本號,在 Windows 中你所要做的就是調用 GetVersionEx() 函數。可以這么說,DOS API 是「Thinking in 匯編語言」的,而 Windows API 則是「Thinking in 高級語言」的。DOS API 是系統程序的一部分,他們與系統一同被載入內存並且可以通過中斷矢量表找到他們的入口。DLL即 Dynamic Link Library(動態鏈接庫)。我們經常會看到一些 .dll 格式的文件,這些文件就是動態鏈接庫文件,其實也是一種可執行文件格式。跟 .exe 文件不同的是,.dll 文件不能直接執行,他們通常由 .exe 在執行時裝入,內含有一些資源以及可執行代碼等。其實 Windows 的三大模塊就是以 DLL 的形式提供的(Kernel32.dll,User32.dll,GDI32.dll),裡面就含有了 API 函數的執行代碼。為了使用 DLL 中的 API 函數,我們必須要有 API 函數的聲明(.H)和導入庫(.LIB)。導入庫可以理解為是為了在 DLL 中找到 API 的入口點而使用的。

3.4開發環境的搭建
1.下載並安裝Visual C++ 6.0
Visual C++是微軟公司推出的基於Windows環境的一種面向對象的可視化編程環境,被公認為微軟第一計算機語言。藉助於微軟公司的MFC類庫和應用程序框架能夠輕易開發出Windows標准界面的應用程序⋯。盡管Visual C++是可視化編程中的佼佼者,但它並不是圖形圖像編程的最好選擇。OpenGL是一個與圖形硬體無關的應用程序開發介面(API),是一個完全可移植、速度很快的3D圖形和建模庫,具有圖形質量高、可靠性高、可移植性好等眾多優點,可以運行在Window平台和UNIX平台上。為了利用Visual C++6.0的強大功能來實現對OpenGL三維圖形的繪制,微軟將OpenGL集成到了Windows中,Windows提供了OpenGL32.DLL和GLU32.DLL動態鏈接庫,Visual C++6.0包含了GL庫(opengl32.Lib)、輔助庫(glaux.1ib)和實用庫(glu32.1ib)舊。,這使OpenGL成為最優秀的可視化編程介面之一。開發者可以方便地利用這個圖形庫,使編程簡單、快速,OpenGL中的RGBA顏色模式,結合反走樣和顏色融合,使圖形圖像更加逼真。所以,Visual C++結合OpenGL編程是一種比較合理的選擇。

Ⅳ OpenGL編程指南第八版VS2015怎麼配置

一、環境搭建指南

書中的地址

http://www.opengl-redbook.com/

去這里打包下載OpenGL紅寶書的示例代碼,解壓後是這樣

雖然沒有第一章的代碼但第一章的內容好歹算一個完整的例子,網上各種環境搭建教程也都以第一章的代碼為例,我們就拿過來直接用一下。

1、打開VS2015創建一個空的控制台項目,然後新建一個cpp文件,粘貼紅寶書第一章的示例代碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80

///////////////////////////////////////////////////////////////////////
//
// triangles.cpp
//
///////////////////////////////////////////////////////////////////////
#include <iostream>
using namespace std;
#include "vgl.h"
#include "LoadShaders.h"
enum VAO_IDs { Triangles, NumVAOs };
enum Buffer_IDs { ArrayBuffer, NumBuffers };
enum Attrib_IDs { vPosition = 0 };
GLuint VAOs[NumVAOs];
GLuint Buffers[NumBuffers];
const GLuint NumVertices = 6;
//---------------------------------------------------------------------
//
// init
//
void init(void)
{
glGenVertexArrays(NumVAOs, VAOs);
glBindVertexArray(VAOs[Triangles]);
GLfloat vertices[NumVertices][2] = {
{ -0.90, -0.90 }, // Triangle 1
{ 0.85, -0.90 },
{ -0.90, 0.85 },
{ 0.90, -0.85 }, // Triangle 2
{ 0.90, 0.90 },
{ -0.85, 0.90 }
};
glGenBuffers(NumBuffers, Buffers);
glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices),
vertices, GL_STATIC_DRAW);
ShaderInfo shaders[] = {
{ GL_VERTEX_SHADER, "triangles.vert" },
{ GL_FRAGMENT_SHADER, "triangles.frag" },
{ GL_NONE, NULL }
};
GLuint program = LoadShaders(shaders);
glUseProgram(program);
glVertexAttribPointer(vPosition, 2, GL_FLOAT,
GL_FALSE, 0, BUFFER_OFFSET(0));
glEnableVertexAttribArray(vPosition);
}
//---------------------------------------------------------------------
//
// display
//
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(VAOs[Triangles]);
glDrawArrays(GL_TRIANGLES, 0, NumVertices);
glFlush();
}

//---------------------------------------------------------------------
//
// main
//
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA);
glutInitWindowSize(512, 512);
glutInitContextVersion(4, 3);
glutInitContextProfile(GLUT_CORE_PROFILE);
glutCreateWindow(argv[0]);

glewExperimental = GL_TRUE;
if (glewInit()) {
cerr << "Unable to initialize GLEW ... exiting" << endl;
exit(EXIT_FAILURE);
}
init();
glutDisplayFunc(display);
glutMainLoop();
}

2、打開項目屬性,在「VC++ Directories」選項卡中,將前面下載回來的紅寶書示例代碼中的include目錄加入「Include Directories」,將lib目錄加入「Library Directories」

3、打開項目屬性,在「General」選項卡中,將「Platform Toolset」設置為VS2013

4、在項目管理器中右擊Source Files的Filter,添加現有項,然後找到紅寶書源碼目錄中的lib目錄,添加LoadShaders.cpp文件

5、打開項目屬性,在「Linker/Input」選項卡中,在「Ignore Specific Default Libraries」中添加libcmtd.lib

6、在項目目錄中新建兩個文本分別命名為triangles.vert和triangles.frag,也就是我們的頂點著色器和片段著色器啦

triangles.vert

1
2
3
4
5
6
7

#version 430 core
layout(location = 0) in vec4 vPosition;
void
main()
{
gl_Position = vPosition;
}

triangles.frag

1
2
3
4
5
6
7

#version 430 core
out vec4 fColor;
void
main()
{
fColor = vec4(0.0, 0.0, 1.0, 1.0);
}

7、編譯,運行,搞定

二、所以然

1、關於第一步

這里的示例代碼其實比書中的多了一句

glewExperimental = GL_TRUE;

書里的代碼用到了GLEW庫,GLEW可以跨平台支持OpenGL高級擴展特性,沒有GLEW的話在Win平台是無法使用4.3的那些功能的。這句
代碼是GLEW所有擴展的一個開關,需要在glewInit()之前執行。如果沒有這一句,編譯是可以通過的,但在運行時會崩潰。

2、關於第二步

主要目的是將示例代碼中用到的GLUT和GLEW庫的頭文件和庫文件引入項目目錄。這一步沒設置好的話編譯無法通過,現象一般是無法打開freeglut相關庫文件或者某些函數沒有聲明。

網上有些教程讓你自己去下載並編譯freeglut和glew,然後拷貝到各種系統目錄和VS的目錄,其實沒用。所有用到的頭文件和庫文件在第八版示例代碼include和lib目錄中都有了,你只要正確引入項目中就不會有問題。

3、關於第三步

只有VS2015需要這一步

VS2015更改了很多標准庫的鏈接方式和宏定義,而紅寶書第八版中用到的freeglut庫中用到了這些標准庫和宏。所以如果報_sscanf或者__iob_func是無法解析的外部符號之類的錯誤,只需要把平台工具集改成舊的就行了。

4、關於第四步

沒有這一項,LoadShaders中定義的函數會報無法解析的外部符號錯誤。

5、關於第五步

如果不忽略這個默認庫,會報庫沖突或者無法打開庫文件的錯誤。

6、關於第六步

沒著色器畫個卵,運行漆黑一片。

7、雙顯卡電腦又躺槍了

我折騰了半天運行CMD顯示Unable to create OpenGL 4.3 context,尼瑪雙顯卡電腦默認用核心顯卡啟動應用。打開NVidia控制面板-管理3D設置-全局設置-首選圖形處理器,把獨顯設為默認就OK了。
http://www.cnblogs.com/gagugagu/p/5211452.html

Ⅵ win7旗艦版 visual studio 2010 旗艦版 opengl超級寶典 隨書代碼 使用

額. 這類最好先確認下 隨機例子的VC版本,
MS的 嗷嗷多的版 真的很煩人.

Ⅶ 如何使用openGL模式

NBa我不太清楚,,war3可以按照如下方法

右鍵單擊游戲的快捷方式,點擊屬性

給目標那一欄的路徑前後打上引號"

注意沒有正反引號之分

然後在後引號後面空一格加上-openGL

就會自動開啟openGL模式

Ⅷ VS中OpenGL編程,老師示例代碼放入VS中編譯出錯 ,求教

C++中自帶保留字true,false,請不要使用這兩個關鍵字來定義變數,函數等

Ⅸ Dev C++下的一個簡單的OpenGL程序

在devc++的include目錄中的gl目錄下有三個opengl頭文件,分別是gl.h,glu.h,glext.h沒有你包含的glut.h所以會提示找不到頭文件,改正後連接錯誤如圖:

可以看出來並沒有定義你的main函數里的各種init函數,我在上述三個頭文件里也沒有找到這些函數,沒有這些函數說明沒有這些函數的庫文件,當然就鏈接不到了。

devc++是一個輕量級的IDE,缺少很多進行某項專門開發所需的api函數,要進行opengl開發建議你還是找下openglsdk一類專門的開發工具,它們提供完整的這些api函數

如果已經添加了頭文件,但是還是出現以上的錯誤,那你你應該檢查是不是添加了所需的擴展庫文件(*.a)了,上面的linkerror是因為雖然頭文件有聲明但鏈接不到庫文件的原因。glut庫解壓後包含一個.h,一個.def,一個.lib和一個.dll文件。將.h拷貝到include目錄下,.dll拷貝到windows的系統目錄下(windowssystem32),貌似你只將dll放在系統目錄下而沒有配置擴展庫文件,對於庫文件可以使用reimp工具將.lib文件轉換成.a文件。命令如下:

reimpglut32.lib

這樣,就會在同一目錄下生成一個glut32.def和一個libglut32.a文件,將libglut32.a拷貝到lib目錄下。同時記得要刪除原來的glut庫(如果有的話),否則link時可能會出錯。

上面所說的mingw-utils可在下面的地方下載到,解壓後在bin里有reimp

mingw-utils-0.3:

http://sourceforge.net/project/downloading.php?groupname=mingw&filename=mingw-utils-0.3.tar.gz&use_mirror=jaist

Ⅹ OpenGL的控制機理:OpenGL是怎麼實現動畫的控制的

openGL通過模型視圖矩陣(GL_MODELVIEW)控制繪制的物體的位置,你繪制的環境肯定是有個坐標,你畫小車的時候相對這個坐標設定小車的坐標,小車就能畫上去了。然後控制,比如glTranslatef(x,y,z)是沿著X,Y,Z軸平移,如果想用鍵盤控制,比如D鍵控制沿X平移,可以在keyboard()函數里寫上
switch(key){ case 'D': x=x+1; break; },
這樣你按下D小車就沿X軸移動1單位的距離,感覺就在移動。所以說原理就是通過鍵盤和程序交互改變模型視圖矩陣的值來控制小車的坐標位置。當然要實現這個功能還需要許多openGL函數和命令的配合。還有必須使用雙緩沖才能實現比較好的動畫效果。
強烈建議你好好看看《openGL編程指南(第七版)》(紅寶書)

閱讀全文

與opengl編程示例相關的資料

熱點內容
12306哪個app 瀏覽:679
免費網站電視劇電影全免費在線觀看 瀏覽:737
如何快速清除app廣告 瀏覽:716
單片機按鍵外部中斷 瀏覽:560
單片機的usb供電 瀏覽:256
更改android解析度 瀏覽:186
phpstaticfinal 瀏覽:695
成人倫理風月片電影 瀏覽:294
禁播愛情片 瀏覽:21
動漫電影免費版大全 瀏覽:14
java什麼是this 瀏覽:811
拍攝指南by小說製造機txt下載 瀏覽:738
豆瓣pdf 瀏覽:723
春宮妖姬演員表 瀏覽:112
韓國情愛電影在線 瀏覽:812
程序員那麼可愛顧墨吃醋 瀏覽:201
伺服器未測速怎麼辦 瀏覽:15
男主角林晨的都市小說 瀏覽:899
百度文庫系統源碼nodejs 瀏覽:997
電影院正在上映的電影怎麼在家看 瀏覽:61