程序代码如下:
#include <GLTools.h>
#include <GLFrustum.h>
#include <StopWatch.h>
#include <GLMatrixStack.h>
#include <GLGeometryTransform.h>
#define FREEGLUT_STATIC
#include <GL/glut.h>
GLMatrixStack modelViewMatrix;
GLMatrixStack projectionMatrix;
GLFrustum viewFrustum;
GLGeometryTransform transformPipeLine;
GLTriangleBatch batch;
GLint flatShader;
GLint location_color;
GLint location_matrix;
void SetupRC()
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
gltMakeTorus(batch, 0.8f, 0.25, 50, 25);
//设置绘图模式为线模式
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
//加载顶点程序文件和片段程序文件,指定一个属性参数:顶点
//颜色和变换矩阵通过设置统一值传入
flatShader = gltLoadShaderPairWithAttributes("flatShader.vp", "flatShader.fp", 1, GLT_ATTRIBUTE_VERTEX, "vVertex");
location_color = glGetUniformLocation(flatShader, "vColor");
location_matrix = glGetUniformLocation(flatShader, "transformMatrix");
}
void RenderScene()
{
static CStopWatch watch;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
GLfloat vColor[] = {0.0f, 0.0f, 1.0f, 1.0f};
modelViewMatrix.PushMatrix();
modelViewMatrix.Translate(0.0f, 0.0f, -4.0f);
modelViewMatrix.Rotate(watch.GetElapsedSeconds()*60.0f, 0.0f, 1.0f, 0.0f);
glUseProgram(flatShader);
//设置颜色统一值和统一变换矩阵
glUniform4fv(location_color, 1, vColor);
glUniformMatrix4fv(location_matrix, 1, GL_FALSE, transformPipeLine.GetModelViewProjectionMatrix());
batch.Draw();
modelViewMatrix.PopMatrix();
glutSwapBuffers();
glutPostRedisplay();
}
void ChangeSize(int w, int h)
{
glViewport(0, 0, w, h);
//创建模型视图投影矩阵
viewFrustum.SetPerspective(35.0f, float(w)/h, 1.0f, 100.0f);
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
modelViewMatrix.LoadIdentity();
transformPipeLine.SetMatrixStacks(modelViewMatrix, projectionMatrix);
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(800, 600);
glutCreateWindow("show");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
GLenum ret = glewInit();
if (GLEW_OK != ret)
{
fprintf(stderr, "glew err: %s", glewGetErrorString(ret));
return 1;
}
SetupRC();
glutMainLoop();
return 0;
}
顶点着色器程序如下,将文件保存为“flatShader.vp”放置在工程目录下:
#version 130
in vec4 vVertex;
uniform mat4 transformMatrix;//变换矩阵统一值
void main(void)
{
gl_Position = transformMatrix * vVertex;
}
片段着色器如下,将文件保存为“flatShader.fp”放置在工程目录下:
#version 130
uniform vec4 vColor;//颜色统一值
out vec4 vFragColor;
void main(void)
{
vFragColor = vColor;
}
效果和OpenGL自带的着色器一样: