/**
着色器管理器(shader Mananger)類。沒有着色器,我們就不能在OpenGL(核心框架)進行着色。着色器管理器不僅允許我們創建並管理着色器,還提供一組“存儲着色器”,他們能夠進行一些初步䄦基本的渲染操作。
*/
#include "GLShaderManager.h"
/**
#include<GLTools.h>` GLTool.h頭文件包含了大部分GLTool中類似C語言的獨立函數
*/
#include "GLTools.h"
/*
在Mac 系統下,`#include<glut/glut.h>`
在Windows 和 Linux上,我們使用freeglut的靜態庫版本並且需要添加一個宏
*/
#include <glut/glut.h>
//簡單的批次容器,是GLTools的一個簡單的容器類。
GLBatch triangleBatch;
//定義一個,着色管理器
GLShaderManager shaderManager;
//窗口大小改變時接受新的寬度和高度,其中0,0代表窗口中視口的左下角坐標,w,h代表像素
float stemp = 0.1;
//設置正方形,其中數組vVert包含所有4個頂點的x,y,笛卡爾坐標對。
//這里的繪圖只有0到1,三個一組,分別是x,y,z
GLfloat vVerts[] = {
0.5f,0.5f,0.0f,
-0.5f,0.5f,0.0f,
-0.5f,-0.5f,0.0f,
0.5f,-0.5f,0.0f,
};
void ChangeSize(int w,int h)
{
glViewport(0,0, w, h);
}
//為程序作一次性的設置
void SetupRC()
{
//設置背影顏色
glClearColor(0.0f,0.0f,1.0f,1.0f);
//初始化着色管理器
shaderManager.InitializeStockShaders();
//批次處理
//Begin 第一個參數是繪制類型 第二個參數是定點個數
triangleBatch.Begin(GL_TRIANGLE_FAN,4);
triangleBatch.CopyVertexData3f(vVerts);
triangleBatch.End();
}
//開始渲染
void RenderScene(void)
{
//清除一個或一組特定的緩沖區
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
//設置一組浮點數來表示紅色
GLfloat vRed[] = {1.0f,0.0f,0.0f,1.0f};
//傳遞到存儲着色器,即GLT_SHADER_IDENTITY着色器,這個着色器只是使用指定顏色以默認笛卡爾坐標第在屏幕上渲染幾何圖形
shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
//提交着色器
triangleBatch.Draw();
//將在后台緩沖區進行渲染,然后在結束時交換到前台
glutSwapBuffers();
}
void SpecialKey(GLint key,GLint x,GLint y)
{
float xstemp = 0;
float ystemp = 0;
if(key == GLUT_KEY_UP)
{
xstemp = 0;
ystemp = stemp;
}
if(key==GLUT_KEY_LEFT)
{
xstemp = -stemp;
ystemp = 0;
}
if(key==GLUT_KEY_DOWN)
{
xstemp = 0;
ystemp = -stemp;
}
if(key==GLUT_KEY_RIGHT)
{
xstemp = stemp;
ystemp = 0;
}
vVerts[0] = vVerts[0] + xstemp;
vVerts[1] = vVerts[1] + ystemp;
vVerts[3] = vVerts[3] + xstemp;
vVerts[4] = vVerts[4] + ystemp;
vVerts[6] = vVerts[6] + xstemp;
vVerts[7] = vVerts[7] + ystemp;
vVerts[9] = vVerts[9] + xstemp;
vVerts[10] = vVerts[10] + ystemp;
triangleBatch.CopyVertexData3f(vVerts);
//重新繪制 ,這里會調用RenderScene的方法
glutPostRedisplay();
}
int main(int argc,char* argv[])
{
//設置當前工作目錄,針對MAC OS X
gltSetWorkingDirectory(argv[0]);
//初始化GLUT庫
glutInit(&argc, argv);
/*初始化雙緩沖窗口,其中標志GLUT_DOUBLE、GLUT_RGBA、GLUT_DEPTH、GLUT_STENCIL分別指
雙緩沖窗口、RGBA顏色模式、深度測試、模板緩沖區*/
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
//GLUT窗口大小,標題窗口
glutInitWindowSize(800,600);
//設置窗口的標題
glutCreateWindow("簡單的圖形繪制");
//注冊回調函數
glutReshapeFunc(ChangeSize);
//如果窗口有新的事件或者調用了重新繪制的時候,都會調用該方法
glutDisplayFunc(RenderScene);
//特殊鍵盤的使用函數
glutSpecialFunc(&SpecialKey);
//驅動程序的初始化中沒有出現任何問題。
GLenum err = glewInit();
if(GLEW_OK != err) {
fprintf(stderr,"glew error:%s\n",glewGetErrorString(err));
return 1;
}
//調用SetupRC
SetupRC();
glutMainLoop();
return 0;
}