青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

  C++博客 :: 首頁 :: 聯系 ::  :: 管理
  163 Posts :: 4 Stories :: 350 Comments :: 0 Trackbacks

常用鏈接

留言簿(48)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 402386
  • 排名 - 59

最新評論

閱讀排行榜

評論排行榜

使用頂點和片斷腳本去做渲染工作可以得到額外的好處,最大的好處就是把CPU的一些工作交給了GPU,Cg提供了書寫這些強大的腳本的一種手段。
這篇教程有許多目的,第一向你展現了一個非常簡單的頂點腳本,第二向你說明如何在OpenGL中使用Cg編寫的腳本。

這個教程是基于最新的NeHeGL的基本代碼,為了獲得更多的信息,你可以訪問nVidia的官方網站(developer.nvidia.com),它會給你一個完整的答案。

注意:這個教程不是叫你如何去寫一個完整的Cg腳本,而是教你在OpenGL中載入并運行腳本。

開始:
第一步,從nVidia的網站上下載Cg Compiler庫,最好去下載1.1版本的,因為nvidia各個版本的變化很大,為了讓程序不出現任何問題,最好這樣做,因為我們用的是1.1版本的。

下一步,包含編譯需要的頭文件和庫文件。

 
 
  
  
 我已經幫你把它們拷貝到了工程的文件夾里了。

Cg介紹
你必須有以下幾個概念:
1、頂點腳本會作用于你輸入的每一個頂點,如果你想要作用于一些頂點,那么你必須在作用前加載頂點腳本,并于作用后釋放頂點腳本。
2、頂點腳本輸出的結果被送入到片斷處理器中,你不用管這其中是如何實現的。
最后,記住頂點腳本在圖元裝配前被執行,片斷腳本在光柵化后被執行。

好了,現在我們創建一個空白的文件吧(保存為wave.cg),接著我們創建一個數據結構,它被我們得腳本使用。下面的代碼被加入到wave.cg文件中。
 
  

struct appdata {    float4 position : POSITION;    float4 color    : COLOR0;    float3 wave    : COLOR1;};

  
 上面的結果說明,我們輸入的頂點包含一個位置坐標,一個顏色和我們自定義的波的顏色
下面的代碼定義一個輸出頂點的數據,包括一個頂點和顏色
 
  

struct vfconn{    float4 HPos    : POSITION;    float4 Col0    : COLOR0;};
  
 下面的代碼是Cg的主函數,每個頂點都會被以下函數執行:
 
 
  

vfconn main(appdata IN, uniform float4x4 ModelViewProj)
{
vfconn OUT; // 保存我們輸出頂點的數據

// 計算頂點y的坐標
IN.position.y = ( sin(IN.wave.x + (IN.position.x / 5.0) ) + sin(IN.wave.x + (IN.position.z / 4.0) ) ) * 2.5f;

// 保存到輸出數據中
OUT.HPos = mul(ModelViewProj, IN.position);

// 不改變輸入的顏色
OUT.Col0.xyz = IN.color.xyz;

return OUT;
}

  
 完成了上面的代碼,記得保存一下.

下面我們到了程序中,首先包含使用cg需要的頭文件,和庫文件
 
  

#include <cg\cg.h>                                    #include <cg\cggl.h>                                   
#pragma comment( lib, "cg.lib" )                            #pragma comment( lib, "cggl.lib" )                           

  
 下面我們定義一些全局變量,用來計算我們得網格和控制cg程序的開關 
  

#define        SIZE    64                                // 定義網格的大小bool        cg_enable = TRUE, sp;                            // 開關Cg程序GLfloat        mesh[SIZE][SIZE][3];                            // 保存我們的網格GLfloat        wave_movement = 0.0f;                            // 記錄波動的移動
  
 下面我們來定義一些cg相關的全局變量
 
  

    CGcontext    cgContext;                                // 用來保存cg腳本

  
 我們需要的第一個變量是CGcontext,這個變量是多個Cg腳本的容器,一般來說,你獲得你可以用函數從這個容器中獲得你想要的腳本
接下來我們定義一個CGprogram變量,它用來保存我們得頂點腳本
 
  

CGprogram    cgProgram;                                // 我們得頂點腳本
  
 接下來我們需要一個變量來設置如何編譯這個頂點腳本 
  

CGprofile    cgVertexProfile;                            // 被頂點腳本使用

  
 下面我們需要一些參數用來把Cg腳本使用的數據從程序中傳送過去。 
  

CGparameter    position, color, modelViewMatrix, wave;                    // 腳本中需要的參數

  
 在初始化階段我們先要創建我們網格數據 
  

    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);                   
for (int x = 0; x < SIZE; x++)
{
for (int z = 0; z < SIZE; z++)
{
mesh[x][z][0] = (float) (SIZE / 2) - x;
mesh[x][z][1] = 0.0f;
mesh[x][z][2] = (float) (SIZE / 2) - z;
}
}


  
 我們設置多邊形的現實模式為線框圖,接著遍歷沒有頂點,設置其高度。
接下來,我們初始化Cg程序

 
 
  

// 設置Cg    cgContext = cgCreateContext();                            // 創建一個Cg容器
// 測試是否創建成功
if (cgContext == NULL)
{
MessageBox(NULL, "Failed To Create Cg Context", "Error", MB_OK);
return FALSE;
}


  
 我們創建一個Cg程序的容器,并檢查它是否創建成功 
  

cgVertexProfile = cgGLGetLatestProfile(CG_GL_VERTEX);                // 配置在OpenGL中使用頂點緩存
// 檢測Cg程序的是否創建成功
if (cgVertexProfile == CG_PROFILE_UNKNOWN)
{
MessageBox(NULL, "Invalid profile type", "Error", MB_OK);
return FALSE;
}

cgGLSetOptimalOptions(cgVertexProfile); // 啟用配置文件

  
 如果你想使用片斷腳本,使用CG_GL_FRAGMENT變量。如果返回的變量為CG_PROFILE_UNKNOW表示沒有可用的配置文件,則不能編譯你需要的Cg程序。 
  

// 從文件中載入Cg程序    cgProgram = cgCreateProgramFromFile(cgContext, CG_SOURCE, "CG/Wave.cg", cgVertexProfile, "main", 0);
// 檢測是否成功
if (cgProgram == NULL)
{
CGerror Error = cgGetError();
MessageBox(NULL, cgGetErrorString(Error), "Error", MB_OK);
return FALSE;
}


  
 我們嘗試從源文件中創建一個Cg程序,并返回編譯后的結果。  
  

// 載入腳本    cgGLLoadProgram(cgProgram);
  
 下面我們把頂點腳本載入到顯存,并準備幫定給GPU。所有的腳本在使用前必須加載。 
  

    // 把數據變量地址發送給Cg程序    position    = cgGetNamedParameter(cgProgram, "IN.position");    color        = cgGetNamedParameter(cgProgram, "IN.color");    wave        = cgGetNamedParameter(cgProgram, "IN.wave");    modelViewMatrix    = cgGetNamedParameter(cgProgram, "ModelViewProj");
return TRUE;


  
 在初始化的最后,我們必須告訴Cg腳本在那里去獲得輸入的數據,我們需要把變量的指針傳遞過去,下面的函數完成了這個功能。
程序結束時,記得釋放我們創建的內容。
 
  

cgDestroyContext(cgContext);                           
  
 下面的代碼使用空格切換是否使用Cg程序 
  

if (g_keys->keyDown [' '] && !sp)    {        sp=TRUE;        cg_enable=!cg_enable;    }
if (!g_keys->keyDown [' '])        sp=FALSE;
  
 現在我們已經完成了所有的準備工作了,到了我們實際繪制網格的地方了,按照慣例我們還是先設置我們得視口。
 
 
  

    gluLookAt(0.0f, 25.0f, -45.0f, 0.0f, 0.0f, 0.0f, 0, 1, 0);
// 把當前Cg程序的模型變化矩陣告訴當前程序    cgGLSetStateMatrixParameter(modelViewMatrix, CG_GL_MODELVIEW_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY);
  
 上面我們要做的事就是把當前Cg程序的模型變化矩陣告訴當前程序。

結下來如果使用cg程序,則把頂點的顏色設置為綠色
 
  

    // 如果使用Cg程序    if (cg_enable)    {        // 使用頂點腳本配置文件        cgGLEnableProfile(cgVertexProfile);                                        // 幫定到當前的頂點腳本        cgGLBindProgram(cgProgram);        // 設置繪制顏色        cgGLSetParameter4f(color, 0.5f, 1.0f, 0.5f, 1.0f);    }
  
 下面我們來繪制我們的網格。  
  

    // 開始繪制我們的網格    for (int x = 0; x < SIZE - 1; x++)    {        glBegin(GL_TRIANGLE_STRIP);        for (int z = 0; z < SIZE - 1; z++)        {            // 設置Wave參數            cgGLSetParameter3f(wave, wave_movement, 1.0f, 1.0f);            //設置輸入的頂點            glVertex3f(mesh[x][z][0], mesh[x][z][1], mesh[x][z][2]);                    glVertex3f(mesh[x+1][z][0], mesh[x+1][z][1], mesh[x+1][z][2]);                wave_movement += 0.00001f;                                                if (wave_movement > TWO_PI)                                                    wave_movement = 0.0f;        }        //經過Cg程序處理,進行繪制        glEnd();    }
  
 上面的代碼完成具體的繪制操作,對于每一個頂點,我們動態的傳入波動系數和輸入原始的頂點數據。在繪制開始前,頂點腳本接受所有的頂點數據并處理,接著進行光柵華操作。
別忘了在繪制完成后,關閉我們啟用的頂點腳本,否則在繪制其它的模型時會讓你得到不想要的結果。
 
  

if (cg_enable)        cgGLDisableProfile(cgVertexProfile);                    // 禁用頂點腳本配置文件
  
 好了上面就是所有的內容了,簡單吧.Cg就是這么簡單

 
 
posted on 2008-01-07 16:24 sdfasdf 閱讀(1395) 評論(0)  編輯 收藏 引用 所屬分類: OPENGL
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久一区免费| 亚洲欧洲视频在线| 蜜桃av一区| 久久精品天堂| 欧美一区二区三区的| 欧美一区二区三区久久精品| 亚洲在线成人精品| 欧美一区二区三区免费大片| 久久久久国产精品厨房| 久久婷婷亚洲| 欧美理论视频| 国产精品一区二区a| 激情久久综艺| 一区二区三区高清| 久久久精品一区| 欧美成人69| 日韩亚洲综合在线| 欧美一区二区高清| 欧美福利视频网站| 国产精品久久国产愉拍| 精品动漫3d一区二区三区| 亚洲最新在线| 久久人体大胆视频| 亚洲靠逼com| 久久精品国产99国产精品澳门| 免费中文字幕日韩欧美| 国产精品午夜av在线| 亚洲国产精品成人| 欧美一区二区在线视频| 久久黄色小说| 欧美在线视频全部完| 久久国产精品99国产精| 美女精品一区| 国产精品亚洲产品| 亚洲欧洲在线播放| 久久精品国产精品亚洲综合| 亚洲激情女人| 久久久久国产精品午夜一区| 欧美日韩精品二区| 一区二区三区在线看| 午夜久久99| 一本不卡影院| 欧美女同在线视频| 亚洲人精品午夜| 久久久蜜臀国产一区二区| 亚洲天堂男人| 欧美大片在线观看一区二区| 一区二区三区在线高清| 久久天天狠狠| 久久xxxx精品视频| 国产欧美日韩另类一区| 亚洲一级在线| 一本不卡影院| 国产精品久久久久久妇女6080 | 在线观看欧美一区| 久久激情婷婷| 欧美一级片一区| 国产精品中文字幕欧美| 亚洲制服av| 亚洲视频在线二区| 国产精品久久久一区二区三区| 国产精品99久久久久久有的能看| 欧美不卡视频一区发布| 久久久噜噜噜久久人人看| 韩国一区二区三区在线观看| 久久精品道一区二区三区| 亚洲欧美制服另类日韩| 国产日韩欧美在线一区| 久久免费视频在线| 久久在线免费观看| 亚洲人成网站999久久久综合| 欧美国产一区二区| 欧美黑人在线播放| 中国亚洲黄色| 亚洲欧美一区二区三区久久| 国产一区二区三区四区老人| 免费日韩视频| 欧美日韩岛国| 欧美一区二区三区四区在线观看地址| 亚洲欧美影音先锋| 一区在线视频观看| 亚洲国产高清aⅴ视频| 欧美三级电影大全| 午夜天堂精品久久久久| 久久精品官网| 亚洲一区在线观看免费观看电影高清| 99re热这里只有精品视频| 亚洲精品国产精品国自产在线| 欧美精品91| 羞羞漫画18久久大片| 久久久久国产精品www| 亚洲人线精品午夜| 一本一本久久a久久精品综合麻豆| 欧美三级午夜理伦三级中视频| 性18欧美另类| 欧美成人tv| 欧美一区二区三区喷汁尤物| 麻豆国产va免费精品高清在线| 一片黄亚洲嫩模| 欧美一区二视频在线免费观看| 亚洲国产精品成人综合| 亚洲图片在线| 亚洲精品国产精品国自产观看浪潮| 夜夜夜精品看看| 在线日韩日本国产亚洲| 中文网丁香综合网| 亚洲日本va在线观看| 亚洲中字黄色| 日韩视频一区| 久久夜色精品国产噜噜av| 亚洲一区二区三区四区五区黄| 久久婷婷国产综合精品青草| 午夜精品久久久久99热蜜桃导演| 玖玖视频精品| 久久精品中文| 国产精品无码永久免费888| 91久久精品美女| 在线观看日韩av电影| 午夜欧美精品| 欧美在线免费播放| 国产精品xvideos88| 亚洲精品久久久久| 亚洲激情一区二区| 久久综合色88| 男人的天堂成人在线| 激情视频一区二区三区| 性色av一区二区三区在线观看| 亚洲免费综合| 国产精品日韩欧美一区| 亚洲一品av免费观看| 亚洲一区在线直播| 欧美日韩精品在线观看| 亚洲国产精品传媒在线观看 | 亚洲黄色天堂| 老妇喷水一区二区三区| 米奇777在线欧美播放| 精品成人一区二区三区| 久久久青草婷婷精品综合日韩| 久久久久国色av免费观看性色| 国产一区香蕉久久| 久久精品综合| 奶水喷射视频一区| 在线日韩av片| 欧美搞黄网站| 日韩一区二区精品葵司在线| 亚洲一区二区三区在线播放| 国产精品久久久对白| 欧美一区二区三区视频在线| 欧美特黄视频| 亚洲欧美制服中文字幕| 久久久久久久999| 国内综合精品午夜久久资源| 久久一区二区三区av| 亚洲电影有码| 亚洲专区国产精品| 国产一区二区三区免费观看| 久热精品视频在线观看一区| 亚洲国产精品999| 亚洲午夜伦理| 国产亚洲欧美日韩精品| 老司机精品视频一区二区三区| 亚洲黑丝在线| 欧美一区二区三区播放老司机| 合欧美一区二区三区| 欧美精品三区| 欧美一区午夜视频在线观看| 亚洲大片精品永久免费| 亚洲欧美另类综合偷拍| 好看的日韩视频| 欧美日韩国产黄| 欧美一区二区在线免费播放| 亚洲人体大胆视频| 久久久久久久一区二区三区| 99在线热播精品免费| 国产日韩亚洲欧美综合| 欧美成人一区二区三区在线观看| 亚洲午夜一区二区三区| 欧美激情第10页| 欧美一级专区免费大片| 亚洲精品一区二区在线| 国产婷婷色一区二区三区四区 | 午夜宅男欧美| 亚洲人永久免费| 久久在线精品| 欧美一区二粉嫩精品国产一线天| 亚洲精品欧洲| 樱桃成人精品视频在线播放| 国产精品有限公司| 欧美日本不卡高清| 六月婷婷一区| 久久国产精品久久久| 亚洲天堂av在线免费| 亚洲欧洲美洲综合色网| 欧美不卡视频一区发布| 久久婷婷亚洲| 久久激情五月激情| 欧美一区二区视频在线观看2020 | 国产精品视频免费观看| 欧美日韩mv| 欧美精品激情在线|