#include "GLTools.h"
#include "GLBatch.h"
#include "GLMatrixStack.h"
#include "GLShaderManager.h"
#include "GLFrame.h"
#include "GLFrustum.h"
#include "StopWatch.h"
#ifdef __APPLE__
#include
#else
#include
#endif
static GLFrustum frustum;
static GLShaderManager shaderManager;
static GLTriangleBatch toursBath;
static void SpecialFunc(int key, int x, int y) {
}
static void glutKeyboardFunc(unsigned char key, int x, int y) {
}
static void glutShape(int w, int h) {
if (h == 0) {
h == 1.0f;
}
glViewport(0, 0, w, h);
/// 设置透视投影
frustum.SetPerspective(35.0f, (float)w/(float)h, 1.0, 100.0);
}
static void loadData() {
glClearColor(0.8f, 0.8f, 0.8f, 1.0f);
glEnable(GL_DEPTH_TEST);
shaderManager.InitializeStockShaders();
/// 形成一个环
gltMakeTorus(toursBath, 0.4f, 0.15f, 200, 200);
形成一个球
gltMakeSphere(toursBath, 0.4f, 10, 20);
/*
glPolygonMode函数用于控制多边形的显示方式,有GL_FILL、GL_LINE、GL_POINT三种模式可供选择。参数face用于指定多边形哪一面收到模式改变的影响,取glPolygonMode函数用于控制多边形的显示方式,有GL_FILL、GL_LINE、GL_POINT三种模式可供选择。参数face用于指定多边形哪一面收到模式改变的影响,取值为GL_FRONT、GL_BACK、GL_FRONT_AND_BACK;参数mode用于指定新的绘图模式,GL_FILLS是默认值,生成填充的多边形,GL_LINE生成多边形的轮廓,GL_POINT只画出顶点。
如果你想要了解更多关于glPolygonMode函数的信息,可以继续向我提问。值为GL_FRONT、GL_BACK、GL_FRONT_AND_BACK;参数mode用于指定新的绘图模式,GL_FILLS是默认值,生成填充的多边形,GL_LINE生成多边形的轮廓,GL_POINT只画出顶点。
如果你想要了解更多关于glPolygonMode函数的信息,可以继续向我提问。
*/
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
}
static void RenderScene() {
/// 建立基于时间变化的动画
static CStopWatch rotTimer;
/// 当前时间 *60s
float yRot = rotTimer.GetElapsedSeconds() * 60.0f;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
/// 矩阵变量
M3DMatrix44f mtranlate, mRotate, mModelview, mModelViewProject;
/// 创建一个4*4的矩阵变量 将花托沿着Z轴负方向移动2.5个单位长度
m3dTranslationMatrix44(mtranlate, 0.0f, 0.0f, -2.5f);
/// 创建一个4*4的矩阵 在y轴上渲染yRot度 yRot根据经过时间设置动画帧率
m3dRotationMatrix44(mRotate, m3dDegToRad(yRot), 0.0f, 1.0f, 0.0f);
/// 为modelView 通过矩阵旋转矩阵 移动矩阵相乘 将结果添加到mModerView上
m3dMatrixMultiply44(mModelview, mtranlate, mRotate);
/// 将模型和视图矩阵的投影矩阵
/// 将投影矩阵乘以模型视图矩阵 将变化结果通过矩阵乘法应用到mModelViewProject矩阵上
m3dMatrixMultiply44(mModelViewProject, frustum.GetProjectionMatrix(), mModelview);
// 将这个已完成的矩阵传递给着色器,并渲染这个圆环面。
//绘图颜色
GLfloat vBlack[] = { 0.0f, 0.0f, 0.0f, 1.0f };
//通过平面着色器提交矩阵,和颜色。
//平面着色器的工作只是使用提供矩阵来顶点来进行转换,并且使用指定的颜色对几何图形进行着色以得到实心几何图形
shaderManager.UseStockShader(GLT_SHADER_FLAT,mModelViewProject,vBlack);
toursBath.Draw();
glutSwapBuffers();
glutPostRedisplay();
}
int main(int argc,char *argv[]) {
gltSetWorkingDirectory(argv[0]);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_MULTISAMPLE);
glutInitWindowSize(800, 600);
glutCreateWindow("window");
GLenum error = glewInit();
if (error != GLEW_OK) {
printf("===============error=\%s\n",glewGetErrorString(error));
return 1;
}
glutSpecialFunc(SpecialFunc);
glutKeyboardFunc(glutKeyboardFunc);
glutReshapeFunc(glutShape);
glutDisplayFunc(RenderScene);
loadData();
glutMainLoop();
}