Cg程式設計入門編(OpenGL)

2021-04-13 00:06:53 字數 2802 閱讀 4788

原註:b alex d'angelo ([email protected])

譯:  川流不息 ([email protected])未經本人同意,不能用於商業用途。

一、概述

本文的程式中,結合opengl和glut在屏冪中畫了乙個立方體,程式中加入了cg著色程式**。listing1中包含了完整的原程式**,其中cg部分用粗體字標識出來,本程式貫穿全文。listing2是乙個cg頂點著色的**。

from: c:/program files/nvidia corporation/cg/include

to:   c:/program files/microsoft visual studio/vc98/include

第二種方法就是在vc編譯器中增加乙個搜尋路徑:tools ->options -> projects ->"directiress"

我們的程式中雖要連線「cg.lib」「cggl.lib」這兩個庫檔案,你可以把它寫到連線路徑中去:「properties ->linker -> input」,式者在程式開頭加入以下**:

#ifdef _msc_ver

#pragma comment( lib, "cg.lib" )

#pragma comment( lib, "cggl.lib" )

#endif

三、cg程式設計細節

為了使用cg著色器,我們必須在程式中建立乙個著色上下文(cgcontext),乙個程式,只需乙個著色上下文就可以了。

要為每個著色器建立乙個cgprogram,而每個著色器你都可以為它指定乙個單獨的顯示卡適配參(cgprofile),cgprofile是用來告訴cg如何選擇最適合你顯示卡的方式來對頂點或片段著色。

著色器可以在任何你雖要用到的地方被載入,載入的時候只需要給程式傳遞乙個著色器函式入口名,或是著色器檔名。本文例子中,著色器在繪圖迴圈前被載入,並且,為了適應各種顯示卡的在求,我們為著色器指定了乙個基礎profile

1、設定著色器要用到的變數。

首先,把cg標頭檔案包含到你的程式中:

#include

#include

接著,增加一些用來儲存著色器入口位址的變數:

static cgcontext context = null;

static cgprogram vertexprogram = null;

以及一些著色引數的位址變數,在初始化著色器之後,這些位址變數將通過使用「cgparameters」與具體引數繫結在一起。

static cgparameter kdparam = null;

static cgparameter modelviewprojparam = null;

static cgparameter vertexcolorparam = null;

最後指定頂點著色用到的profile:

static cgprofile vertexprofile = cg_profile_vp20;

2、初始化cg

程式中,初始化opengl這後,接著要對cg進行初始化。

首先,要建立乙個著色上下文,乙個程式中有乙個著色上下文(context)就可以了,所有要用到的著色器都將會共享這乙個上下文。

context = cgcreatecontext();

其次,通過給上下文指定著色器檔名以及著色器型別(這裡是頂點著色),把乙個頂點著色器加到著色上下文中去。

vertexprogram = cgcreateprogramfromfile(context,

cg_source, "vertexshader.cg",

vertexprofile,

null, null);

只有在頂點著色器被成功建立之後,著色器的**才被真正地載入到程式中來,與此同時,各種著色引數位址也最終與著色器中的引數繫結在一起。在這之後的程式中,你便可以自由地使用和改變這些引數的內容了。如例子中所示的:反射光顏色(kdparam),頂點顏色(vertexcolorparam)和模型透視矩陣(modelviewproj),些變數都是可以改變的。

在繪圖主迴圈結束之後,所有著色器占用的資源都要及時釋放,在cg中,提供了兩個函式:cgdestroyprogram();和cgdestroycontext(); 讓我們完成這一工作變得更簡單。

3、繪圖迴圈

進入繪圖迴圈之後,著色器必雖在實際繪圖這前呼叫,繪圖結束這後就應該被禁用。這個概念和glbegin(); 及 glend(); 的意思是相似的,實際上cg是不能在 glbegin(); 和 glend(); 之間被呼叫的。

在所有繪圖工作開媽之前,我們通過呼叫函式 cgglbindprogram(); 把著色**與opengl繪圖**關聯起來,緊接著呼叫cgglenableprofile(); 函式來指定cg程式到底是進行頂點著色,還是片段著色。之後我們就可以利用cgglsetparamter*();函式來傳遞或使用著色器中的引數了。

在所有繪圖工作完成之後,我們應該馬上呼叫cggldisableprofile(); 來停止著色器的使用。

著色器的引數是可以隨時改變的,例如:立方體的頂點顏色可以通過函式cgglsetparameter3f(vertexcolorparam,0.0,1.0,0.00);來設定。

既然我們知道了如何在繪圖迴圈中使用乙個著色器,那麼擴充套件到在乙個繪圖迴圈中使用多個著色器的情況,那也是很容易實現的,簡單地把著色繫結包在繪圖**的外層就可以了。

例如:void draw()

四、結論

現在我們已經學會了如何把著色**加入到我們現有的程式中。在

和別的一些相關**中,有許多著色**提供給我們使用,同時也可我和他們一起分享你的經驗。 

Cg程式設計入門編(OpenGL)

cg 你好!cg程式設計入門編 opengl 原註 b alex d angelo alexz fusionindustries.com 譯 川流不息 huawenguang hotmail.com 未經本人同意,不能用於商業用途。一 概述 本文的程式中,結合opengl和glut在屏冪中畫了乙個立...

OpenGL程式設計入門

程式設計入門 this is an os specific header file 判別作業系統的基本標頭檔案 include disable data conversion warnings pragma warning disable 4244 mips pragma warning disab...

CG原畫如何入門

先從基礎開始學。1.平面構成 從裝飾畫開始研習。畫面分割,點線面構成,視覺平衡,畫面元素排布的節奏感。顏色搭配,顏色從裝飾畫開始研習。畫面分割,點線面構成,視覺平衡,畫面元素排布的節奏感。顏色搭配,顏色 2.立體構成 物體在三維空間內的美感表達,通過點線面體的造型來規劃節奏感。從素描繪畫開始學習。先...