OpenGl著色器簡單範例

2021-01-15 百度經驗

新手,把書上的代碼弄來弄去,結果還是沒有動,就搜了好久,終於弄到一個定點著色器和片源著色器能運行的了.搜到的blog:http://blog.csdn.net/qianqiang1989/article/details/8307219

首先會使用vs2013英語版創建C++的ConsoleApplication並且會增加相關的文件.cpp或者.h (特別說明,添加完也可以通過對增加的文件rename/重命名 修改後綴,比如下面的.vert就是那樣修改的),相關經驗已經發布;依次增加5個文件,五個文件明明如圖(這裡的名字是因為這些文檔中相關調用是這樣的,如果要自己命名,就要知道到哪裡改,代碼後面依次放出)

其次,下載完需要的opengl 的相關include的  .h,.lib.dll(去官網,或者相關的程序學習網站)

接著就是配置。相關經驗已經上傳

在文件名字為  minimal.vert裡面填上如下(圖代碼)void main(){        gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex; }

在文件名字為  minimal.frag裡面填上如下(圖代碼)void main(){    gl_FragColor = vec4(0.6,0.4,0.2,1.0);}

在文件名字為  textfile.h裡面填上如下(圖代碼)char *textFileRead(char *fn);///讀取文件int textFileWrite(char *fn, char *s);///寫入文件

 在文件名字為  textfile.cpp裡面填上如下代碼#include <stdio.h>#include <malloc.h>#include <string.h>  char *textFileRead(char *fn){ FILE *fp; char *content = NULL; int count = 0;  if (fn != NULL) { ///打開文件  fopen_s(&fp,fn, "r"); if (fp != NULL) { fseek(fp, 0, SEEK_END); count = ftell(fp); rewind(fp); if (count > 0) { content = (char *)malloc(sizeof(char) * (count + 1)); count = fread(content, sizeof(char), count, fp); content[count] = '\0'; } fclose(fp); } } return content;} int textFileWrite(char *fn, char *s){ FILE *fp; int status = 0;  if (fn != NULL) { ///打開文件  fopen_s(&fp, fn, "w"); //fp = fopen(fn, "w"); if (fp != NULL) { if (fwrite(s, sizeof(char), strlen(s), fp) == strlen(s)) status = 1; fclose(fp); } } return(status);}

  在文件名字為  textfile.cpp裡面填上如下代碼,效果是圖一,可以自己去片源著色器改顏色哈#include <iostream>#include<glew.h> #include<glut.h>   #include<gl.h>#include "textfile.h"#pragma comment(lib,"glew32.lib")#define printOpenGLError() printOglError(__FILE__, __LINE__) static float degree = 0;///茶壺旋轉的度數 /*** @brief 處理窗口大小改變* @param  w 窗口的寬* @param  h 窗口的高**/void changeSize(int w, int h){ ///重新定義視口 glViewport(0, 0, w, h); ///重新設置投影變換 if (h == 0) h = 1;/// 防止高為0產生除0錯誤 float ratio = 1.0 * w / h;///寬高比 glMatrixMode(GL_PROJECTION);///當前矩陣設為投影矩陣 glLoadIdentity();///清空投影矩陣 gluPerspective(45, ratio, 1, 1000);//重設投影矩陣 ///模型視點變換 glMatrixMode(GL_MODELVIEW);///當前矩陣設為模型視點矩陣}/*** @brief 顯示函數**/void renderScene(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清空顏色緩存和深度緩存 glLoadIdentity();///清空模型視點矩陣 ///視點變換 gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, -1.0, 0.0f, 1.0f, 0.0f); ///模型變換 旋轉茶壺 glRotatef(degree, 0, 1, 1); ///繪製茶壺 glutSolidTeapot(1); degree += 0.1;///旋轉度數增加 glutSwapBuffers();///交換緩存(雙緩存模式)}/*** @brief 處理鍵盤事件 按下 Esc 退出程序**/void processNormalKeys(unsigned char key, int x, int y){ if (key == 27) exit(0);}/*** @brief 列印OpenGL錯誤信息* @param  file 錯誤所在的文件* @param  line 錯誤所在的行* @return 1 OpenGL error* @return 0 other  error**/int printOglError(char *file, int line){ GLenum glErr; int retCode = 0; glErr = glGetError();///獲取錯誤 while (glErr != GL_NO_ERROR) { printf("glError in file %s @ line %d: %s\n", file, line, gluErrorString(glErr)); retCode = 1; glErr = glGetError();///獲取下一個錯誤 } return retCode;}/*** @brief 列印日誌**/void printInfoLog(GLhandleARB obj){ int infologLength = 0; int charsWritten = 0; char *infoLog; glGetObjectParameterivARB(obj, GL_OBJECT_INFO_LOG_LENGTH_ARB, &infologLength); if (infologLength > 0) { infoLog = (char *)malloc(infologLength); glGetInfoLogARB(obj, infologLength, &charsWritten, infoLog); printf("%s\n", infoLog); free(infoLog); }}/*** @brief 設置著色器**/void setShaders(){ GLhandleARB v, f, p; char *vs = NULL, *fs = NULL; ///創造空白頂點著色器對象並返回其句柄 v = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);   ///頂點著色器 v f = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); ///片元著色器 f ///讀取著色器原始碼文件 vs = textFileRead("minimal.vert");///頂點著色器原始碼字符串 fs = textFileRead("minimal.frag");///片元著色器原始碼字符串 ///加入到字符串數組 const char * vv = vs; const char * ff = fs; /// 將著色器原始碼字符串數組提交給空白的著色器 /// glShaderSourceARB() 參數表: /// GLhandleARB shader        --- 著色器 /// GLuint nstrings           --- 字符串數組中多少個元素 本例子就只有1個字符串 /// const GLcharARB **strings --- 字符串數組 /// GLint *lengths            --- 對應字符串數組的長度數組 NULL表示所有字符串以null結束 glShaderSourceARB(v, 1, &vv, NULL); glShaderSourceARB(f, 1, &ff, NULL); ///釋放字符串所佔用的內存空間 free(vs); free(fs); ///編譯原始碼 glCompileShaderARB(v); glCompileShaderARB(f); ///列印日誌 printInfoLog(v); printInfoLog(f); ///創造空白程序對象並返回其句柄 p = glCreateProgramObjectARB(); ///將著色器對象附加到程序對象 glAttachObjectARB(p, v); glAttachObjectARB(p, f); ///連結程序對象 列印日誌 glLinkProgramARB(p); printInfoLog(p); ///安裝程序對象 glUseProgramObjectARB(p);}/*** @brief 主函數 程序入口**/int main(int argc, char **argv){  //創建窗口相關函數 glutInit(&argc, argv);///初始化GLUT並處理命令行參數 glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);///深度緩存 雙緩存 RGBA顏色模式 glutInitWindowPosition(100, 100);///窗口左上角位置 glutInitWindowSize(320, 320);///窗口大小 glutCreateWindow("GLSL的第一步");///創建窗口 ///註冊各種回調函數 glutDisplayFunc(renderScene);///註冊顯示回調函數 renderScene glutIdleFunc(renderScene);///註冊後臺管理函數(事件循環空閒時運行) renderScene glutReshapeFunc(changeSize);///註冊窗口大小改變時的回調函數 changeSize glutKeyboardFunc(processNormalKeys);///註冊鍵盤輸入回調函數 processNormalKeys ///啟動必須的功能 glEnable(GL_DEPTH_TEST);///開啟深度緩存測試 glEnable(GL_CULL_FACE);///啟動多邊形剔除功能 glClearColor(1.0, 1.0, 1.0, 1.0);///指定清除顏色 glewInit();///glew初始化 ///檢測是否支持基本的頂點著色器和片元著色器 if (GLEW_ARB_vertex_shader && GLEW_ARB_fragment_shader) { printf("Ready for GLSL\n"); } else { printf("No GLSL support\n"); exit(1); } setShaders();///設置著色器 glutMainLoop();///進入主循環  return 0;}

相關焦點

  • 「範例卷積神經網絡」和信息最大化
    在那篇文章中,我簡單地提了一下「Exemplar-CNNs」的方法。這一方法也能被理解為「卷積神經網絡範例」。本文內容摘要:本文對「範例卷積神經網絡」的訓練方法僅作了簡單簡單的概述,所以如果想要獲得更多、更真實的信息,請閱讀論文原文。本文簡要介紹了「變分信息最大化」,並將其運用到了「範例卷積神經網絡」的案例中。
  • 銅門的著色工藝流程及著色問題
    經過著色的銅門,由於更具有美感,且其使用、觀賞價值比較高,因而受到人們的普遍歡迎。著色銅除有美麗的外觀,作為裝飾外,還可以提高銅的耐磨性和耐蝕性,因此,著色技術開發了表面處理又一新領域。
  • 多肉植物怎麼養,才能著色養出狀態,其實很簡單一看就會了
    有很多的多肉愛好者在養多肉的過程中出現了一些問題,比如說肉肉的著色問題。有些肉肉愛好者總是為自己的肉肉著色不好兒苦惱。小編今天就和大家聊一聊這方面的問題吧。肉肉植物是如何著色呢?給肉質植物著色的四個最重要的元素是:1、陽光條件,2、通風環境,3、溼度,4、溫度,當這四種元素在你的家裡得到滿足時,給肉上色就變得非常容易了。讓我們開始逐一分析一下吧。1、陽光條件:日照的時間是越唱越好不是越強越好,太強的陽光反而會使它受傷害。溫室和暖房裡肉肉顏色鮮豔的主要原因是日照時間足夠長,大部分可達6-8小時。
  • 鋁氧化著色攝像頭配件汙漬處理,中性除油劑高效清洗實例
    鋁氧化著色配件。現在遇到的問題是氧化過後鋁表麵粉塵汙漬難處理,要中性清洗劑、清洗不腐蝕基材。技術人員收到樣品後,根據多年的專業經驗,很快給出方案,實驗流程大致如下:1、213中性除油劑,按5%比例使用, 60~70度超聲波清洗5分鐘,去除表麵粉塵汙漬2、水洗3次3、熱風吹乾中性除油劑清洗後,鋁氧化著色攝像頭配件不褪色
  • 深圳鋁氧化著色價格
    深圳鋁氧化著色價格,佛山市南海區海光鋁氧化有限公司,成立於1999年8月,本廠與中國香港星光鋁質氧化有限公司共同合作創辦,氧化技術已有35年以上的經驗,對鋁的加工及特性有一定的認識。全鋁室內門比木門有耐腐蝕,更加不容易變形等特點,鈦鎂合金材質更穩定,結構更科學,不易朽壞,其氧化著色層不脫落,不褪色,經久耐用。
  • EPE珍珠棉包裝_著色方式
    在生產EPE珍珠棉包裝的過程中,著色和配色是比較重要的一環,掌握EPE珍珠棉包裝的著色技術和方法可以確保其顏色和質量,簡單理解EPE珍珠棉包裝著色的注意事項。接下來,跟著小編一起來了解一下關於EPE珍珠棉包裝的著色方式吧。
  • 鋁型材陽極氧化電解著色工藝技術發展現狀分析
    慧聰表面處理網訊:鋁陽極氧化膜具有多孔性和可吸附性,是最理想的著色載體。通過著色不僅可以提高產品的裝飾性和耐蝕性,同時給鋁製品表面以各種功能特徵,增加商業價值。目前已經開發出很多氧化膜著色技術,大體上可以分為化學著色和電解著色。
  • 史酷比狗著色書
    史酷比狗著色書是一款休閒類塗色遊戲。玩家可以在遊戲中對各種圖畫根據提示塗上相應的顏色,使其保持美觀,在這裡可以鍛鍊玩家的想像力和動手操作能力,不同的關卡有著不一樣的任務,通過任務可以得到相應的道具,這些道具可以在遊戲內給予玩家很大的幫助。
  • 聚乙烯醇纖維材料的著色
    聚乙烯醇纖維材料的紡前著色維綸染色中,傳統的染色方法可以染淺色,但若染深色如黑、藏青、棕則不易獲得滿意的色牢度,所以凡欲染深色時均已紡前原液著色較為簡單有利。紡前原液著色是在紡絲前對原液(聚乙烯醇水溶液)添加著色劑製成有色原液,然後再進行紡絲而製成有色纖維的,品種有長絲、短纖及中長纖維等,產品用於毛紡,針織,地毯,縫紉線,裝飾布,學生裝等多種用途。
  • 電泳紫銅著色鋁型材的生產
    【鋁道網】隨著鋁表面處理技術的發展,通過電解著色技術生產的建築鋁型材表面處理顏色日趨豐富多彩,從單純的錫鹽著色、鎳鹽著色、錫-鎳混合鹽著色,到硒酸鹽著鈦金色
  • 吡唑醚菌酯會影響柑橘著色嗎?三唑類殺菌劑對著色影響大嗎?
    柑橘著色好,受消費者喜愛,果商收購時給的價格,也會比著色普通的要高些。到了著色期,會想著如何讓果實著色好,用藥也會特別的注意,會考慮藥劑會不會影響果實著色。吡唑醚菌酯是比較常用防治真菌類病害的藥劑,著色期噴了是否會影響著色還存在爭議,有認為有利著色,有認為會延緩著色。吡唑醚菌酯會影響著色嗎?兩個版本第一個:吡唑醚菌酯能夠增加葉綠素的含量,促進植物對氮的吸收,會導致果實著色延緩。第二個:吡唑醚菌酯使果樹葉片增綠,促進光合產物的合成,提高果實品質。
  • 鋁及鋁合金陽極氧化、著色及封閉的現狀和發展趨勢
    2.2.1 硫酸硬質陽極氧化  硫酸法成分簡單穩定,操作容易,低溫氧化可獲得數十至數百微米的硬質膜。硫酸硬質陽極氧化的主要缺陷是一般要在低溫下進行,而且受鋁合金組成的影響很大。經氧化處理的鋁材為陽極,以石墨電極為陰極,50Hz220V交流電源經調壓器調至8V後輸入電解槽,電解著色10min,即可得到亮麗的黑色鋁合金表面。
  • 「看似簡單的電路:跨阻放大器」之近似運算放大器
    一個看似簡單的電路只有兩個器件,一個運算放大器和一個反饋電阻,通常用於將電流轉換為電壓。我們熟悉的光探測器或阻抗計電流檢測放大器就是這樣的電路。電路如圖1所示,其中運算放大器的輸入電容Ci顯示在外面以方便分析。運算放大器的輸入容抗通常約為Ci = 10pF。
  • 範例分析:多元線性回歸分析
    基礎回顧簡單線性和多元線性回歸理論基礎請回顧:相關與回歸分析基礎;一元(簡單線性)相關分析與回歸分析
  • 鋁陽極氧化著色 二
    著色型材的氧化電流密度必須控制在130A/㎡。   7陽極氧化時應經常巡視電壓、電流、溫度等各種儀表,發現異常應及時排除。   8氧化後的型材應檢測膜厚,並做好記錄,膜厚達不到要求的必須重新延長氧化時間至膜厚達到要求。
  • 淺談塑膠容器的著色要求
    對於大多數重視日化和化妝品行業的工程師來說,包裝容器的著色往往關注的是它的色澤的正確性和一致性,但對於著色的穩定性和安全性很容易忽視掉;這對於一個重視包裝工程的專業人士來說,本人認為這個重要性是第一位的;但這其中大家有不一致的看法,和標準不夠清晰,或者存在判斷上的模糊性等;就這一問題我想闡述一下個人的實際經驗,供大家參考。
  • 鋁合金的陽極氧化和電解著色工藝
    1.2需要電解著色處理的型材,每一掛型材應是同一種規格,避免產生色差。    1.3導電梁與導電座之間應接觸良好,保證通電正常,接觸溫升不大於30℃。    1.4送電進行氧化處理時應一次給足總電流,並自此時開始計算處理時。送電時要防止出現電流的過大衝擊,電壓上升應取軟啟動,電壓上升時間一般為10~15s。
  • 鋁件小氧化電解著色與有機染色的區別
    這些鋁製品就是表面經過著色處理的。一般來說鋁製品的著色分為四種:■電解著色■電鍍著色■有機染色■無機染色小件氧化鋁製品而我們最最常用的著色方法是電解著色和有機染色。其實以上四種著色方法都是在鋁材陽極氧化之後,封孔之前完成的。因為陽極氧化後的材料表面會形成緻密的氧化膜孔,有利於顏色吸附。它們的區別在於:1、著色劑不同,電解著色採用的是金屬鹽作為著色劑而有機染色採用的是化學染料作為著色劑。
  • 鋁合金錫—鎳雙鹽電解著色技術
    發展到今天,鋁型材陽極氧化電解著色技術已經處於核心技術地位,鋁型材電解著色技術水平的高低代表著一個鋁型材企業表面處理技術水平的地位,決定著鋁型材企業產品的競爭力,本文針對目前鋁型材行業中採用最多、應用最廣泛的錫—鎳雙鹽電解著色技術進行詳細的研究。
  • 對於幾種著色顏料的優缺點對比
    2.氧化鐵黃(鐵黃,Fe2O3H2O)     遮蓋力好,著色力強,耐光,耐鹼。大量用於建築材料。     3.鎘黃(CdS)     顏色非常鮮豔,耐光,耐熱,耐鹼。     不足:1)不耐酸;2)遇潮氣易粉化;3)遮蓋力和著色力不如鉻黃;4)價貴。     適於制耐高溫塗料。