OpenGl著色器簡單範例

2020-12-17 百度經驗

新手,把書上的代碼弄來弄去,結果還是沒有動,就搜了好久,終於弄到一個定點著色器和片源著色器能運行的了.搜到的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;}

相關焦點

  • 原創 | 學好opengl走遍天下都不怕系列《基礎篇》
    前言最近本來是想認真學習下《opengl es第三版》這本書,無奈內容過於生澀,有點看不下去,偶遇opengl-tutorial.org
  • opengl實踐-從零開發遊戲
    作者:愛幹球的RDlearnopengl是一套很棒的opengl教程,深入淺出、有源碼且免費,除了說良心,不知道還能用什麼詞彙來形容這種高水平且善良的公益行為
  • OpenGL glfw學習(一)初識,環境,窗口
    這個接口由近350個不同的函數調用組成,用來繪製從簡單的圖形比特到複雜的三維景象。 解釋一下就是,OpenGL不是什麼語言,也不是包、庫,而僅僅是一套接口,一套規範。我們可以調用其編程接口處理圖像,完成圖形的渲染過程。而對於實現其接口的程序庫,則由不同企業或個人來實現,甚至你自己也可以來寫OpenGL接口的具體實現。咱們使用時只要求具體功能,不用關注其底層實現。
  • OpenGL 與 Go 教程(一)Hello, OpenGL
    你可能不知道的是三角形或許是繪製的圖形中最簡單的,實際上我們最終會用某種方式把三角形拼成方形。好吧,那麼我們想要繪製一個三角形,怎麼做呢?我們通過定義圖形的頂點來繪製圖形,把它們交給 OpenGL 來進行繪製。
  • Power BI輕鬆製作動態著色地圖
    上一篇文章使用PowerBI地圖模擬疫情地圖以後,有小夥伴後臺問,能否利用著色地圖,按時間動態展示變化情況呢?當然是可以的,並且非常簡單,下面介紹一下思路。首先找到每日的地區數據(本文示例為1.21-2.11數據),這裡不再具體介紹。
  • 「範例卷積神經網絡」和信息最大化
    在那篇文章中,我簡單地提了一下「Exemplar-CNNs」的方法。這一方法也能被理解為「卷積神經網絡範例」。本文內容摘要:本文對「範例卷積神經網絡」的訓練方法僅作了簡單簡單的概述,所以如果想要獲得更多、更真實的信息,請閱讀論文原文。本文簡要介紹了「變分信息最大化」,並將其運用到了「範例卷積神經網絡」的案例中。
  • New程序媛OpenGL全解析之—第一個OpenGL程序解析
    對於 OPENGL程式設計師而言,著色器就是使用 OPENGL著色語言( OPENGL Shading Language,GLSL)編寫的一個小型函數。GLSL是構成所有 OPENGL著色器的語言,它與C++語言非常類似,儘管GLSL中的所有特性並不能用於 OPENGL的每個著色階段。我們可以以字符串的形式傳輸GLSL著色器到 OPENGL。今天我們的例子中也正是這樣使用的。
  • CSharpGL(0)一個易學易用的C#版OpenGL
    你可以:繪製模型你可以用legacy opengl(glVertex)或modern opengl(VBO+Shader)繪製模型。當然這是最基本的功能。CSharpGL提供一個GLCanvas控制項供你進行繪製。使用紋理(貼圖)你可以用legacy opengl(glVertex)或modern opengl(VBO+Shader)為模型貼上貼圖。
  • UE4精品課程 | OpenGL學習筆記(三)繪製三角形/四邊形
    圖形渲染管線可以被劃分為兩個主要部分:第一部分把你的3D坐標轉換為2D坐標;第二部分是把2D坐標轉變為實際的有顏色的像素;2,著色器圖形渲染管線可以被劃分為幾個階段,每個階段將會把前一個階段的輸出作為輸入。所有這些階段都是高度專門化的(都有一個特定的函數),並且很容易並行執行。
  • UE4虛幻引擎 Cel著色材質教程卡通陰影
    在本教程中,您將學習:創建和使用後處理材料創建一個cel著色器將cel著色器隔離到特定的網格使用查找表控制色帶入門下載入門項目並解壓縮( 提取碼: incg)。導航到項目文件夾,然後打開CelShader.uproject。您將看到以下場景:這是您將要進行陰影處理的字符。
  • 銅門的著色工藝流程及著色問題
    經過著色的銅門,由於更具有美感,且其使用、觀賞價值比較高,因而受到人們的普遍歡迎。著色銅除有美麗的外觀,作為裝飾外,還可以提高銅的耐磨性和耐蝕性,因此,著色技術開發了表面處理又一新領域。
  • 7種架構範例的深度學習,每個範例都提供了TensorFlow教程
    作為MIT的深度學習基礎系列課程的一部分,本文概述了7種架構範例的深度學習,每個範例都提供了TensorFlow教程的連結。 我們不久前介紹了 MIT 的深度學習基礎系列課程,由 MIT 學術研究員 Lex Fridman 開講,將介紹使用神經網絡解決計算機視覺、自然語言處理、遊戲、自動駕駛、機器人等領域問題的基礎知識。
  • 鋁氧化著色攝像頭配件汙漬處理,中性除油劑高效清洗實例
    鋁氧化著色配件。現在遇到的問題是氧化過後鋁表麵粉塵汙漬難處理,要中性清洗劑、清洗不腐蝕基材。技術人員收到樣品後,根據多年的專業經驗,很快給出方案,實驗流程大致如下:1、213中性除油劑,按5%比例使用, 60~70度超聲波清洗5分鐘,去除表麵粉塵汙漬2、水洗3次3、熱風吹乾中性除油劑清洗後,鋁氧化著色攝像頭配件不褪色
  • 營養著色與催紅劑著色有什麼區別?果實著色效果分析!
    對於果實上色,很多人考慮解決果實上色問題,但是對於使用不同上色產品後的後果沒有考慮那麼多,今天玖怡灃老師與大家說說不同著色產品對於果實上色後的影響問題:鈦磷鉀果甜紅使用後效果對比對於果實著色產品,從營養方面說一般分為營養型著色肥與非營養型催紅劑,為什麼這麼叫呢,一種是通過營養調節植物的各種機能實現果實提前著色增甜的效果,一種是通過激素或調節劑的形式促進果實對花青苷的非自然形成
  • 使用KeyboardColorXII為iPhone的鍵盤著色
    近期涉及使用KeyboardColorXII為iPhone的鍵盤著色內容備受矚目,很多讀者對此也很有興趣,現在給大家羅列關於使用KeyboardColorXII為iPhone的鍵盤著色最新消息。Cydia現在提供了一個新的免費版本,由iOS開發人員asphyxia提供,名為KeyboardColorXII,可讓您根據需要為手機的鍵盤著色,無論您喜歡深色,淺色還是彩色的東西。
  • 讓文化為徽商精神著色
    竊以為,徽商精神簡言之:以勤立本,以誠立業,經濟上光,文化著色。  胡適曾把徽商比喻成「徽駱駝」,徽商的這種駱駝精神是中國經濟騰飛的驕子,吃苦耐勞,勇挑重擔,勇往直前,鍥而不捨,在中華乃至世界經濟潮流中都堪稱奇蹟。當今世界,人員熙熙攘攘,人才比肩接踵,而徽商精神則是注入經濟夢的一劑強心劑。所以,在有著經濟優勢的安徽,文化更要為經濟著色,文化和經濟並駕齊驅,成為徽商發展的雙翼。
  • 原液著色纖維是什麼 原液著色纖維原理 原液著色纖維優缺點
    原液著色纖維是什麼 原液著色纖維原理 原液著色纖維優缺點 2018-05-08 14:49:56 來源:全球紡織網 原液著色纖維是什麼,原液著色纖維原理,
  • 基於OpenGL ES的深度學習框架編寫
    比如實時摳人像這個case: 對每一幀相機預覽產生的數據,系統將其映射為opengl 的一個external texture,然後需要 計算出一個 mask texture,與原先的texture作混合,顯示出來。
  • 網格著色技術牛逼!Asteroids演示 圖像質量提升
    2018年12月20日,英偉達的Asteroids demo展示了在場景中渲染大量複雜對象時,英偉達圖靈GPU架構中內置的網格著色技術,將能夠顯著提高性能和圖像質量。以下視頻介紹了Asteroids demo中的網格著色器功能,一起來看看吧。
  • 影響反應性著色結果的因素
    影響反應性著色結果的因素大多承包商都力求做到最好,但如果您不知道會影響最終著色外觀的許多因素,那將是非常困難的。在很多項目重,承包商在沒有任何正確的表面處理或知識的情況下簡單地將著色劑塗在項目上。這不僅是使承包商倒閉的快速方法,而且還可能給被著色的混凝土帶來不良聲譽。以下列出了幾個在著色變化中起作用的因素。選擇著色顏色時應考慮以下因素,並引起客戶注意。1、水泥顏色-淺色水泥,尤其是白色,將產生比深灰色地坪更明亮的顏色。由於著色劑是半透明的,因此水泥的底色將在最終顏色中起主要作用。