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