c語言opengl
⑴ c語言如何用OpenGL
OpenGL就是基於C語言的,只需要下載OpenGL的SDK庫安裝即可,在編寫源碼時:
1、添加頭文件glut.h。
注意glut.h文件中已經包含gl.h,glu.h在實際編譯中可以只加入頭文件glut.h,很多相關的例子都是這樣的,但是在mingwstudio上編譯發現,在glut.h前還是需要加入glu.h, gl.h.如:
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
2、在工程中添加OpenGL的庫,有關命令行加入,glu32 opengl32 glut32庫就可以編譯了。
⑵ OpenGL ES基礎理論 (一) —— 緩存、幀緩存、上下文與坐標系等
程序會將3D場景數據保存到硬體RAM中,嵌入式系統的中央處理單元有專門為其分配的RAM,在圖形處理的過程中,GPU也有專門為其分配的RAM,使用現代硬體渲染3D圖形的速度幾乎彎完全取決於不用的內存區塊被訪問的方式。
先看一下下圖。
OpenGL ES 是 一 種 軟 件 技 術。OpenGL ES 部分運行在 CPU 上,部分運行在 GPU 上。 OpenGL ES 橫跨在兩個處理器之間,協調兩個內存區域之間的數據交換。上圖中箭頭代表了與3D渲染相關硬體組件之間的數據交換,每個箭頭也代表著一個渲染性能的瓶頸。
從一個內存區域復制數據到另一個內存區域速度是相對較慢的。更糟糕的是,除非非常小心,在內存復制發生的時候 GPU 和 CPU 都不能把內存另作它用。因此內存區域之間的數據交換需要盡量避免。
最新的 OpenGL ES 為了支持新改進的方法拋棄了對於舊式的低效的內存復制操作的支持。
OpenGL ES 為兩個內存區域間的數據交換定義了 緩存(buffers) 的概念。緩存是指圖形處理器能夠控制和管理的連續 RAM。程序從 CPU 的內存復制數據到 OpenGL ES 的緩存。在 GPU 取得一個緩存的所有權以後,運行在 CPU 中的程序理想情況下將不 再接觸這個緩存。通過控制獨占的緩存,GPU 就能夠盡可能以最有效的方式讀寫內存。 圖形處理器把它處理大量數據的能力非同步同時地應用到緩存上,這意味著在 GPU 使用 緩存中的數據工作的同時,運行在 CPU 中的程序可以繼續執行。
幾乎所有的程序提供給GPU的數據都應該放入緩存中,為緩存提供數據,需要如下7個步驟:
理想情況下,每個生成的緩存都可以使用一個相當長的時間。下面看一下上面幾個步驟的OpenGL ES的C語言函數的實現。
GPU 需要知道應該在內存中的哪個位置存儲渲染出來的 2D 圖像像素數據。就像 為 GPU 提供數據的緩存一樣,接收渲染結果的緩沖區叫做幀緩存 (frame buffer) 。程 序會像任何其他種類的緩存一樣生成、綁定、刪除幀緩存。但是幀緩存不需要初始 化,因為渲染指令會在適當的時候替換緩存的內容。幀緩存會在被綁定的時候隱式開 啟,同時 OpenGL ES 會自動地根據特定平台的硬體配置和功能來設置數據的類型和偏移。
可以同時存在很多幀緩存,並且可以通過 OpenGL ES 讓 GPU 把渲染結果存儲到 任意數量的幀緩存中。但是,屏幕顯示像素要受到保存在前幀緩存 (front frame buffer) 的特定幀緩存中的像素顏色元素的控制。程序和操作系統很少會直接渲染到前幀緩存中,因為那樣會讓用戶看到正在渲染中的還沒渲染完成的圖像。相反,程序和操作系統 會把渲染結果保存到包括後幀緩存 (back frame buffer) 在內的其他幀緩存中。當渲染後的後幀緩存包含一個完成的圖像時,前幀緩存與後幀緩存幾乎會瞬間切換。後幀緩存會變成新的前幀緩存,同時舊的前幀緩存會變成後幀緩存。
用於配置 OpenGL ES 的保存在特定平台的軟體數據結構中的信息會被封裝到一個 OpenGL ES 上下文(context)中。上下文中的 信息可能會被保存在 CPU 所控制的內存中,也可能會被保存在 GPU 所控制的內存中。 OpenGL ES 會按需在兩個內存區域之間復制信息,知道何時發生復制有助於程序的優化。
OpenGL ES 總是開始於一個矩 形的笛卡兒坐標系,如下圖所示。
OpenGL ES 坐標是以浮點數來存儲的。現代 GPU 對浮點運算做了專門的優化,即 使是使用其他數據類型的頂點也會被轉換成浮點值。
⑶ C語言我用OpenGL畫了個圓,如何定義圓心坐標
opengl應該有自帶的畫圓或橢圓函數,為什麼要自己描點?
你把x和y的值都加上一個數字,或者x或y乘除一個數字試試
⑷ OpenGL 跟java C# 或是其他的C 語言有什麼本質上的不同嗎
OpenGL不是編程語言,和微軟的DirectX是兩大主流的三維圖形渲染介面。由一系列.dll,.lib和.h文件組成。編程的時候,用到.h裡面的函數。那裡面有很多繪制函數和狀體控制函數。
它是由C編寫的,完全可以融合到C++程序中。
java,C#,C是語言,就像中文、英文和法語,Opengl就像用中文寫的孫子兵法。
⑸ OpenGL簡介
上一節已經搭建好了開發環境,在正式學習如何用OpenGL前,我們先了解一下OpenGL的基礎知識。
一、OpenGL是什麼
一般它被認為是一個API,包含了一系列的函數,用來操作各種圖形圖像。事實上並不是,OpenGL僅僅是一個由一個名為Khronos組織制定並維護的規范。但是,我寧願把它當成是API來理解,因為規范嚴格規定了OpenGL各函數的輸入和輸出,內部細節都是開發者自行決定。那麼以API來理解,我認為是很合理的。(其實OpenGL函數大多是各顯卡廠商開發的,所以如果你在用OpenGL開發過程中如果遇到問題,可以嘗試更新顯卡驅動的方式來解決,當然,前提是你還要確定一下顯卡廠商)
如果你想了解OpenGL規范細節,可以訪問https://www.opengl.org/registry/doc/glspec33.core.20100311.withchanges.pdf。
二、狀態機
OpenGL是一個狀態機,無論是官方信息還是網路上的信息,都解釋的比較繁瑣和復雜。
我認為,可以這么理解,當我們用OpenGL去繪制一個三角形時,要把OpenGL當前狀態設置成可以繪制三角形的狀態,比如顏色、線條啥的,渲染就出來三角形了。如果又想繪制線段了,就把OpenGL當前狀態再設置成線段的狀態,就可以渲染出線段了。
說白了,就是想繪制啥,就把狀態設置先設置成啥,這就是狀態機。(這是我自己理解的,哈哈)
三、核心模式與立即渲染模式
OpenGL3.2之前,它都是立即渲染模式,3.2之後,它使用了核心模式,拋棄了立即渲染模式。
那麼什麼是立即渲染模式,什麼是核心模式呢?
我查了網上很多資料,都沒有把這個事情說清楚,我通過各種文章,是這么理解的:
立即渲染模式是類似這樣:
glBegin( GL_TRIANGLES );
glVertex3f(-1.0f, -0.5f, -4.0f);
glVertex3f( 1.0f, -0.5f, -4.0f);
glVertex3f( 0.0f, 0.5f, -4.0f);
glEnd();
上面是繪制三角形的,具體可以不用追究。只要明白,設置好點,放在glBegin和glEnd之間,就能渲染出來三角形了。這就是立即渲染模式。
而核心模式就要關注細節了,它是如何用點和顏色渲染圖形的,都需要開發者參與設計。
暫時我就理解到這個程度,後續邊學邊理解吧。
四、對象
OpenGL庫是用C語言寫的,我們知道C語言是面向過程的,之前的OpenGL也是面向過程的,比如,繪制一個圖形,就要設置好頂點和顏色,如果再繪制一個,就要再設置一次。而OpenGL引入「對象(Object)」後,就方便多了。比如:
// 創建對象
unsigned int objectId = 0;
glGenObject(1, &objectId);
// 綁定對象至上下文
glBindObject(GL_WINDOW_TARGET, objectId);
// 設置當前綁定到 GL_WINDOW_TARGET 的對象的一些選項
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// 將上下文對象設回默認
glBindObject(GL_WINDOW_TARGET, 0);
上面這段是在網上抄過來的,不過,說明很詳細,我們首先創建一個對象,然後用一個id保存它的引用(實際數據被儲存在後台)。然後我們將對象綁定至上下文(就是設置內容,比如顏色、大小等等)的目標位置(例子中窗口對象目標的位置被定義成GL_WINDOW_TARGET)。接下來我們設置窗口的選項。最後我們將目標位置的對象id設回0,解綁這個對象。設置的選項將被保存在objectId所引用的對象中,一旦我們重新綁定這個對象到GL_WINDOW_TARGET位置,這些選項就會重新生效。
說白了,就是,創建一個對象,先用一個ID保存起來,並設置好內容,想用了,將這個ID跟設置目標(比如GL_WINDOW_TARGET)綁定,就可以用了,不用每次都重新設置。
好了,這次了解了一些OpenGL的基礎,下一次就可以開心正式學習OpenGL了。
⑹ 求一個C語言Opengl代碼
// Bounce.c
// Demonstrates a simple animated rectangle program with GLUT
// OpenGL SuperBible, 2nd Edition
// Richard S. Wright Jr.
#include"stdafx.h"
#include <windows.h>
#include <gl/glut.h>
// Initial square position and size
GLfloat x1 = 100.0f;
GLfloat y1 = 150.0f;
GLsizei rsize = 50;
// Step size in x and y directions
// (number of pixels to move each time)
GLfloat xstep = 1.0f;
GLfloat ystep = 1.0f;
// Keep track of windows changing width and height
GLfloat windowWidth;
GLfloat windowHeight;
// Called to draw scene
void RenderScene(void)
{
// Clear the window with current clearing color
glClear(GL_COLOR_BUFFER_BIT);
// Set current drawing color to red
// R G B
glColor3f(1.0f, 0.0f, 0.0f);
// Draw a filled rectangle with current color
glRectf(x1, y1, x1+rsize, y1+rsize);
// Flush drawing commands
glutSwapBuffers();
}
// Called by GLUT library when idle (window not being
// resized or moved)
void TimerFunction(int value)
{
// Reverse direction when you reach left or right edge
if(x1 > windowWidth-rsize || x1 < 0)
xstep = -xstep;
// Reverse direction when you reach top or bottom edge
if(y1 > windowHeight-rsize || y1 < 0)
ystep = -ystep;
// Check bounds. This is incase the window is made
// smaller and the rectangle is outside the new
// clipping volume
if(x1 > windowWidth-rsize)
x1 = windowWidth-rsize-1;
if(y1 > windowHeight-rsize)
y1 = windowHeight-rsize-1;
// Actually move the square
x1 += xstep;
y1 += ystep;
// Redraw the scene with new coordinates
glutPostRedisplay();
glutTimerFunc(33,TimerFunction, 1);
}
// Setup the rendering state
void SetupRC(void)
{
// Set clear color to blue
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}
// Called by GLUT library when the window has chanaged size
void ChangeSize(GLsizei w, GLsizei h)
{
// Prevent a divide by zero
if(h == 0)
h = 1;
// Set Viewport to window dimensions
glViewport(0, 0, w, h);
// Reset coordinate system
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Keep the square square, this time, save calculated
// width and height for later use
if (w <= h)
{
windowHeight = 250.0f*h/w;
windowWidth = 250.0f;
}
else
{
windowWidth = 250.0f*w/h;
windowHeight = 250.0f;
}
// Set the clipping volume
glOrtho(0.0f, windowWidth, 0.0f, windowHeight, 1.0f, -1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
// Main program entry point
void main(void)
{
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutCreateWindow("Bounce");
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
glutTimerFunc(33, TimerFunction, 1);
SetupRC();
glutMainLoop();
}
//是正方形的,你改一下吧~
程序還是自己試著編,這樣才會進步,加油哈!
⑺ 用Opengl(c語言)編程
當年我也做過這個程序,只是代碼不在了。
⑻ 求助C語言高手,關於openGL的
應該是系統文件放的地方不對,
你試一下這樣:
把GL頭文件(.h文件)放在vc++6.0(安放的地方)的include文件夾中,
GL的lib文件放vc++6.0(安放的地方)的lib文件夾中,
dll文件放windows/system32里。這三個文件我有,你不行再問我~
⑼ C語言windows,OpenGL編程
查找 MSDN 可以得知,MSG 裡面的 pt 坐標是相對於窗口的左上角的;
2. 至於聲音控制和播放,可以使用 Windows 自帶的 MCI API,或者使用 DirectSound 來播放,我推薦你使用 un4seen 的 BASS,簡單實用強大,一兩個函數就可以播放音效了;
3. 你要使用 alpha blend 與桌面進行鏤空運算,就必須首先獲得桌面的窗體句柄,OpenGL 的 alppha 運算我不是很懂,不過 Direct3D 的話就簡單多了;
4. 屏幕常亮,其實就是阻止系統進入休眠狀態,每當系統要進入休眠狀態之前,都會向系統的所有窗口發送一條消息,你攔截這條消息,進行特別的處理就可以防止系統進入休眠了,至於是什麼消息,請查看 MSDN,我也好久沒用過這條消息了;
5.bmp 文件可以保存 alpha 通道,使用 32bit 色深的 bmp 文件就可以了,RGB 分別 8bit,alpha 通道 8bit,不過說到 alpha 通道,tga 或者 png 圖片更加合適,因為他們可以進行無損壓縮;
6.用GetPocAddress導出函數,只能用類型強制轉換,這個是 windows 的原則,我們只能去迎合它了 ...
7. 執行 NULL 指針的話,不同的系統會有不同的反應,XP 是直接程序崩潰,Vista 或者以上的系統,就會提示無響應
8. 如果你建立的工程是 Win32 窗口程序,那麼就不會有 DOS 窗口,如果你建立的是 Win32 控制台程序,那麼就會有 DOS 窗口;如果你使用 OpenGL 實用庫來創建 OpenGL 程序,那個 DOS 窗口是無法消除的,它可以幫助你進行錯誤排查
9. 不要用 Dev C++ 了,用 VS2010 吧,這是行業規范
最後,祝樓主學習愉快
⑽ opengl 用在C語言中時 程序裡面使用的哪種基本數據類型
openGL自己有自己定義的類型和c語言的基礎類型對應。
當然openGL沒有規定必須要用他自己定義的類型。所以你完全可以用c語言裡面的基本類型。
反正用來用去都是一樣。
就是你如果用C的類型可能到不同的編譯器或系統所佔的內存有所不一樣可能同樣的程序在不同的編譯器或系統中效果不一樣。
而openGL庫自己的類型則可以稍微避過這一點,達到一個「跨平台適配」的效果。