當前位置:首頁 » 編程語言 » c語言與opengl
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言與opengl

發布時間: 2022-09-17 20:59:36

⑴ directx和opengl哪個好

Opengl的穩定性要好於DirectX,但是如果你只是一般應用,不是多麼復雜的程序就不用注意什麼穩定性.Opengl要好學很多,但是它只有圖形方面的功能,而DirectX主要是為了開發游戲而做,所以DirectX除了圖形方面的功能外,還有網路,聲效,輸入等方面的功能.反正這兩個對於我來說的最主要區別就是一個容易學一個難學.

⑵ OpenGL是一門新語言嗎

它不是一門新的語言,但是你要想使用它需要學習裡面函數的用法。

它其實是一個庫,提供的是介面。
可以用visual studio 2005編輯,也可以用dev編輯,也就是說它不依賴於編程平台。

使用的時候設置好環境,引入這個庫,然後用它提供的函數(介面)就行~

雖然OpenGL是給c語言寫的,但如果希望使用在其它語言中可以使用綁定,同樣可以用於java等其它語言。
比如在java中就有被大家認可並注意的JOGL,它是Java對於OpenGl的綁定(Java Bindings for OpenGL)。理由是它得到Sun(Java的創建者)和SGI(OpenGL的創建者)的支持。

OpenGL官方網頁中列出了用於Java、Fortran 90、Perl、Pike、Python、Ada和Visual Basic的多個綁定。

⑶ C語言 和 openGL 和 direct(解決可以再追加100分)

OpenGL是OpenGraphicsLib的縮寫,是一套三維圖形處理庫,也是該領域的工業標准。計算機三維圖形是指將用數據描述的三維空間通過計算轉換成二維圖像並顯示或列印出來的技術。

OpenGL就是支持這種轉換的程序庫,它源於SGI公司為其圖形工作站開發的IRIS GL,在跨平台移植過程中發展成為OpenGL。SGI在1992年7月發布1.0版,後成為工業標准,由成立於1992年的獨立財團OpenGL Architecture Review Board (ARB)控制。SGI等ARB成員以投票方式產生標准,並製成規範文檔(Specification)公布,各軟硬體廠商據此開發自己系統上的實現。只有通過了ARB規范全部測試的實現才能稱為OpenGL。1995年12月ARB批准了1.1版本,最新版規范是1999.5通過的1.2.1。

OpenGL被設計成獨立於硬體,獨立於窗口系統的,在運行各種操作系統的各種計算機上都可用,並能在網路環境下以客戶/伺服器模式工作,是專業圖形處理、科學計算等高端應用領域的標准圖形庫。它低端應用上的主要競爭對手是MS-Direct3D,該圖形庫是以COM介面形式提供的,所以極為較復雜,穩定性差,另外微軟公司擁有該庫版權,目前只在Windows平台上可用。D3D的優勢在速度上,但現在低價顯卡都能提供很好的OpenGL硬體加速,所以做3D使用Direct3D已沒有特別的必要,在專業圖形處理特別是高端應用方面目前還沒有出現以Direct3D技術為基礎的例子,而游戲等低端應用也有轉向OpenGL的趨勢。

微軟在Windows NT對OpenGL的支持始於3.51,在Windows9x中的支持始於Win95 OEM Service Release 2。Windows下常用的OpenGL庫有兩種,MS實現的和SGI實現的,MS-OpenGL調用會自動檢測是否存在顯示卡製造商提供的ICD(Installable Client DeviceDriver)驅動程序,有則調用ICD中的常式,否則才用CPU進行計算,所以能利用顯示卡的OpenGL加速能力。對開發者來說使用方法並沒有區別,只是有ICD驅動時更快些。SGI的版本是純軟體實現不能利用硬體加速並且SGI已經在1999年宣布停止支持,但這套庫便於調試程序,仍有不少開發者使用。

SGI曾經宣布研發OpenGL++,該圖形庫最大的特點是面象對象,提供了樹形場景支持,大大減省了使用OpenGL處理復雜場景的工作量。後來(1999)SGI宣布與M$合作開發Ferihant,即Windows的下一代圖形處理體系,包括DirectX與OpenGL的低級圖形處理介面和以場景圖支持為特點的高級介面,並且就此停止對其在Windows下的OpenGL實現的支持以示決心。此舉世矚目,大家都以為Windows圖形處理快要過上幸福生活了,然而,不久,SGI宣布中止合作,並撤回派出的科學家,Ferihant基本上夭折。SGI 稱終止合作的原因是M$不肯積極合作,光想把SGI 的技術合並進DirectX,真正內幕不詳。不過以SGI在圖形處理界的老大地位來說,還是有幾分可信度的,因為M$初支持OpenGL就不積極。

雖然早在WinNT3.51 時代M$就已經實現了它的OpenGL 版本,但不肯隨其Windows95 時提供,稱該API 適合高端應用,而Win95面向一般消費者的用不到,並且在其win3.x下開發的wing 圖表庫的基礎上搞出了GameSDK,即後來的DirectX 庫,稱這套庫是專門為高性能游戲開發設計的,在當時的硬體條件下,這無疑是非常有道理的,並且很快成為Windows環境下游戲開發的標准API 。該庫實質上是提供了繞過Windows 直接訪問顯存的途徑,從而很好的解決了GDI 體系性能方面的不足,但由於是以COM介面形式提供的,所以相當復雜,而穩定性也不是很好,所以有人稱Direct3D 是為追求速度而不擇手段的公司才用的。然而也就在這個時期,三維圖形加速卡開始走向商用和家用,也就是在這時期S3公司以其性價比極高的帶三維圖形加速的顯示晶元、板卡向當時Trident 公司的霸主地位發起了挑戰。另外這時實時三維游戲開始流行,以Dos 下的第一人稱射擊游戲——暗殺希特勒(3d worlf) 大獲成功、紅極一時ID Software 的開始鑄輝煌,推出了Doom 、Quake1 ,相信這兩個名字在今天(2000.4) 的游戲圈子裡應該是無人不知無不曉吧?1996.12.ID Software 的高手John Carmack 在開發下一代三維圖形引擎時在其.plan 中寫上了以下字句:
Direct-3D IM is a horribly broken API. It inflicts great pain and suffering on the programmers using it, without returning any significant advantages. I don』t think there is ANY market segment that D3D is apropriate for, OpenGL seems to work just fine for everything from quake to softimage. There is no good technical reason for the existance of D3D.

I』m sure D3D will suck less with each forthcoming version, but this is an oportunity to just bypass dragging the entire development community through the messy evolution of an ill-birthed API.

此後以他為代表的一大批游戲開發人員開始多方呼籲MS積極支持OpenGL。M$終於在Win95的OSR2版本里集成了OpenGL,並為以前版本的Win95免費提供單獨的OpenGL實現。(或許您還不了解這些人的影響力,不知道您聽說過以生產Voodoo系統圖形加速卡而著稱於世的3dfx公司嗎?當年Quake的開發者不肯用Voodoo的glide API對voodoo做優化版本,差點沒把3dfx嚇蒙,於是趕緊搞了一個針對游戲的OpenGL子集:MiniGL,讓ID Software的人只要在製作OpenGL時只使用MiniGL API做過優化就成,這樣Quake總算可以用上voodoo的硬體加速能力了。這樣也造就了一個新名詞:MCD--MiniGL Client Driver,用於Windows的MiniGL驅動程序,而標準的OpenGL則依靠ICD驅動)。

⑷ glsl語言和c語言的區別·也就是不同的地方有哪些,明確點。謝謝嘍

變數

GLSL的變數命名方式與C語言類似。變數的名稱可以使用字母,數字以及下劃線,但變數名不能以數字開頭,還有變數名不能以gl_作為前綴,這個是GLSL保留的前綴,用於GLSL的內部變數。當然還有一些GLSL保留的名稱是不能夠作為變數的名稱的。

基本類型

除了布爾型,整型,浮點型基本類型外,GLSL還引入了一些在著色器中經常用到的類型作為基本類型。這些基本類型都可以作為結構體內部的類型。如下表:

類型 描述
void 跟C語言的void類似,表示空類型。作為函數的返回類型,表示這個函數不返回值。
bool 布爾類型,可以是true 和false,以及可以產生布爾型的表達式。
int 整型 代表至少包含16位的有符號的整數。可以是十進制的,十六進制的,八進制的。
float 浮點型
bvec2 包含2個布爾成分的向量
bvec3 包含3個布爾成分的向量
bvec4 包含4個布爾成分的向量
ivec2 包含2個整型成分的向量
ivec3 包含3個整型成分的向量
ivec4 包含4個整型成分的向量
mat2 或者 mat2x2 2×2的浮點數矩陣類型
mat3或者mat3x3 3×3的浮點數矩陣類型
mat4x4 4×4的浮點矩陣
mat2x3 2列3行的浮點矩陣(OpenGL的矩陣是列主順序的)
mat2x4 2列4行的浮點矩陣
mat3x2 3列2行的浮點矩陣
mat3x4 3列4行的浮點矩陣
mat4x2 4列2行的浮點矩陣
mat4x3 4列3行的浮點矩陣
sampler1D 用於內建的紋理函數中引用指定的1D紋理的句柄。只可以作為一致變數或者函數參數使用
sampler2D 二維紋理句柄
sampler3D 三維紋理句柄
samplerCube cube map紋理句柄
sampler1DShadow 一維深度紋理句柄
sampler2DShadow 二維深度紋理句柄

結構體

結構體

結構體可以組合基本類型和數組來形成用戶自定義的類型。在定義一個結構體的同時,你可以定義一個結構體實例。或者後面再定義。
struct surface {float indexOfRefraction;

vec3 color;float turbulence;

} mySurface;

surface secondeSurface;

你可以通過=為結構體賦值,或者使用 ==,!=來判斷兩個結構體是否相等。

mySurface = secondSurface;

mySurface == secondSurface;

只有結構體中的每個成分都相等,那麼這兩個結構體才是相等的。訪問結構體的內部成員使用. 來訪問。

vec3 color = mySurface.color + secondSurface.color;

結構體至少包含一個成員。固定大小的數組也可以被包含在結構體中。GLSL的結構體不支持嵌套定義。只有預先聲明的結構體可以嵌套其中。
struct myStruct {

vec3 points[3]; //固定大小的數組是合法的

surface surf; //可以,之前已經定義了

struct velocity { //不合法float speed;

vec3 direction;

} velo;

subSurface sub; //不合法,沒有預先聲明;};struct subSurface { int id;
};

數組

GLSL中只可以使用一維的數組。數組的類型可以是一切基本類型或者結構體。下面的幾種數組聲明是合法的:
surface mySurfaces[];
vec4 lightPositions[8];
vec4 lightPos[] = light www.hnne.com Positions;const int numSurfaces = 5;
surface myFiveSurfaces[numSurfaces];float[5] values;

指定顯示大小的數組可以作為函數的參數或者使返回值,也可以作為結構體的成員.數組類型內建了一個length()函數,可以返回數組的長度。

lightPositions.length() //返回數組的大小 8

最後,你不能定義數組的數組。

修飾符

變數的聲明可以使用如下的修飾符。

修飾符 描述
const 常量值必須在聲明是初始化。它是只讀的不可修改的。
attribute 表示只讀的頂點數據,只用在頂點著色器中。數據來自當前的頂點狀態或者頂點數組。它必須是全局范圍聲明的,不能再函數內部。一個attribute可以是浮點數類型的標量,向量,或者矩陣。不可以是數組或則結構體
uniform 一致變數。在著色器執行期間一致變數的值是不變的。與const常量不同的是,這個值在編譯時期是未知的是由著色器外部初始化的。一致變數在頂點著色器和片段著色器之間是共享的。它也只能在全局范圍進行聲明。
varying 頂點著色器的輸出。例如顏色或者紋理坐標,(插值後的數據)作為片段著色器的只讀輸入數據。必須是全局范圍聲明的全局變數。可以是浮點數類型的標量,向量,矩陣。不能是數組或者結構體。
centorid varying 在沒有多重采樣的情況下,與varying是一樣的意思。在多重采樣時,centorid varying在光柵化的圖形內部進行求值而不是在片段中心的固定位置求值。
invariant (不變數)用於表示頂點著色器的輸出和任何匹配片段著色器的輸入,在不同的著色器中計算產生的值必須是一致的。所有的數據流和控制流,寫入一個invariant變數的是一致的。編譯器為了保證結果是完全一致的,需要放棄那些可能會導致不一致值的潛在的優化。除非必要,不要使用這個修飾符。在多通道渲染中避免z-fighting可能會使用到。
in 用在函數的參數中,表示這個參數是輸入的,在函數中改變這個值,並不會影響對調用的函數產生副作用。(相當於C語言的傳值),這個是函數參數默認的修飾符
out 用在函數的參數中,表示該參數是輸出參數,值是會改變的。
inout 用在函數的參數,表示這個參數即是輸入參數也是輸出參數。

內置變數

內置變數可以與固定函數功能進行交互。在使用前不需要聲明。頂點著色器可用的內置變數如下表:

名稱 類型 描述
gl_Color vec4 輸入屬性-表示頂點的主顏色
gl_SecondaryColor vec4 輸入屬性-表示頂點的輔助顏色
gl_Normal vec3 輸入屬性-表示頂點的法線值
gl_Vertex vec4 輸入屬性-表示物體空間的頂點位置
gl_MultiTexCoordn vec4 輸入屬性-表示頂點的第n個紋理的坐標
gl_FogCoord float 輸入屬性-表示頂點的霧坐標
gl_Position vec4 輸出屬性-變換後的頂點的位置,用於後面的固定的裁剪等操作。所有的頂點著色器都必須寫這個值。
gl_ClipVertex vec4 輸出坐標,用於用戶裁剪平面的裁剪
gl_PointSize float 點的大小
gl_FrontColor vec4 正面的主顏色的varying輸出
gl_BackColor vec4 背面主顏色的varying輸出
gl_FrontSecondaryColor vec4 正面的輔助顏色的varying輸出
gl_BackSecondaryColor vec4 背面的輔助顏色的varying輸出
gl_TexCoord[] vec4 紋理坐標的數組varying輸出
gl_FogFragCoord float 霧坐標的varying輸出

片段著色器的內置變數如下表:

名稱 類型 描述
gl_Color vec4 包含主顏色的插值只讀輸入
gl_SecondaryColor vec4 包含輔助顏色的插值只讀輸入
gl_TexCoord[] vec4 包含紋理坐標數組的插值只讀輸入
gl_FogFragCoord float 包含霧坐標的插值只讀輸入
gl_FragCoord vec4 只讀輸入,窗口的x,y,z和1/w
gl_FrontFacing bool 只讀輸入,如果是窗口正面圖元的一部分,則這個值為true
gl_PointCoord vec2 點精靈的二維空間坐標范圍在(0.0, 0.0)到(1.0, 1.0)之間,僅用於點圖元和點精靈開啟的情況下。
gl_FragData[] vec4 使用glDrawBuffers輸出的數據數組。不能與gl_FragColor結合使用。
gl_FragColor vec4 輸出的顏色用於隨後的像素操作
gl_FragDepth float 輸出的深度用於隨後的像素操作,如果這個值沒有被寫,則使用固定功能管線的深度值代替

表達式

操作符

GLSL語言的操作符與C語言相似。如下表(操作符的優先順序從高到低排列)

操作符 描述
() 用於表達式組合,函數調用,構造
[] 數組下標,向量或矩陣的選擇器
. 結構體和向量的成員選擇
++ – 前綴或後綴的自增自減操作符
+ – ! 一元操作符,表示正 負 邏輯非
* / 乘 除操作符
+ - 二元操作符 表示加 減操作
<> <= >= == != 小於,大於,小於等於, 大於等於,等於,不等於 判斷符
&& || ^^ 邏輯與 ,或, 異或
?: 條件判斷符
= += –= *= /= 賦值操作符
, 表示序列

像 求地址的& 和 解引用的 * 操作符不再GLSL中出現,因為GLSL不能直接操作地址。類型轉換操作也是不允許的。 位操作符(&,|,^,~, <<, >> ,&=, |=, ^=, <<=, >>=)是GLSL保留的操作符,將來可能會被使用。還有求模操作(%,%=)也是保留的。

數組訪問

數組的下標從0開始。合理的范圍是[0, size - 1]。跟C語言一樣。如果數組訪問越界了,那行為是未定義的。如果著色器的編譯器在編譯時知道數組訪問越界了,就會提示編譯失敗。

vec4 myColor, ambient, diffuse[6], specular[6];

myColor = ambient + diffuse[4] + specular[4];

構造函數

構造函數可以用於初始化包含多個成員的變數,包括數組和結構體。構造函數也可以用在表達式中。調用方式如下:

vec3 myNormal = vec3(1.0, 1.0, 1.0);

greenTint = myColor + vec3(0.0, 1.0, 0.0);

ivec4 myColor = ivec4(255);

還可以使用混合標量和向量的方式來構造,只要你的元素足以填滿該向量。

vec4 color = vec4(1.0, vec2(0.0, 1.0), 1.0);

vec3 v = vec3(1.0, 10.0, 1.0);

vec3 v1 = vec3(v);

⑸ opengl是系統自帶的嗎是不是裝上C語言,然後打進opengl程序,就可以出畫面了

你對計算機基礎一竅不通,不明白你的前幾年是怎麼上的。。。
OpenGL是一種3D程序介面,你寫的那個程序是個C程序,在VC中編譯執行才能看到結果
不知道您的「無法打開window.h「是在哪裡提示的,如果是在VC中,請考慮修改選項中的include path。
如果不是在VC中,請您賜教,您用的什麼編譯軟體阿?

⑹ codeblocks 中怎麼用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庫就可以編譯了。

⑺ 求一個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();
}

//是正方形的,你改一下吧~
程序還是自己試著編,這樣才會進步,加油哈!

⑻ 我想在C#中用opengl 畫圖,但從未學過opengl,哪位好人可以幫我推薦一本書,謝謝啦!!!

OpenGL是一個動態鏈接庫,這個必須要系統的學習才可以,C#可以調用這個庫,但前提是你必須在你的電腦上配置好才可以,有個文件是glut,這個是OpenGL的一個壓縮包,你可以查一下,還有就是可以從網上下到OpenGL電子版的教程,不過都是C語言結合OpenGL的。