测试环境: Win10 VS2017
OpenGL搭建环境:https://blog.csdn.net/qq_39574690/article/details/114146097
// Traingle.app
//Our first OpenGL program that will just draw a triangle on the scree
//我们第一个OpenGL程序那将会仅绘画一个三角形在屏幕上
#pragma comment(lib,"gltools.lib") //**非常重要的一句代码,不然会报错!
//#pragma comment(lib,"glew32.lib") //网上搜索到的添加这条,但依然报错
#include <GLTools.h> //OpenGL toolkit
#include <GLShaderManager.h> //Shader Manager Class
#ifdef __APPLE__
#include <glut/glut.h> //OS X version of GLUT
#else
#define FREEGLUT_STATIC
#include <gl/glut.h> //window freeglut equivalent
#include <gl/glew.h>
#endif
GLBatch triangleBatch;
GLShaderManager shaderManager;
//window has change size, or has just been created. In either case, we need
//to use the window dimensions to set the viewport and the projection matrix.
//窗口已经改变大小,或刚刚创建。无论哪种情况,我们都需要使用窗口尺寸来设置视口和投影矩阵。
void ChangeSize(int w, int h)
{
//根据窗口尺寸(0,0,w,h) 设置视口和投影矩阵
glViewport(0, 0, w, h);
}
//This function does any needed initialization on the rendering context.
//这个函数为渲染内容而执行任何需要的初始化操作。
//this is the first opportunity to do any OpenGL related tasks.
//这是做任何OpengGL相关任务的第一个机会(第一个触发点?)
//为程序作一次性的设置
void SetupRC()
{
//Blue background
glClearColor(0.0f, 0.0f, 1.0f, 1.0f); //设置清除屏幕颜色:RGBA(0,0,1,1) 蓝色 [即底色]
//初始化着色管理器
shaderManager.InitializeStockShaders();
//构建三角形顶点数组,vVert包含3个顶点的(x, y, z)笛卡尔坐标
//Load up a triangle
GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f,
0.5f, 0.0f, 0.0f,
0.0f, 0.5f, 0.0f };
//开始构建批次,GL_TRIANGLES 表示三角形,后面参数是顶点数
triangleBatch.Begin(GL_TRIANGLES, 3);
/*
* 批次增加存储属性
* CopyVertexData3f(XYZ顶点数据)
* CopyNormalDataf(表面法线)
* CopyColorData4f(RGBA颜色)
* CopyTexCoordData2f(纹理坐标)
*/
triangleBatch.CopyVertexData3f(vVerts);
//结束批次属性设置,表明完成数据复制操作,不能再添加新属性
triangleBatch.End();
}
//Called to draw scene
//开始渲染
void RenderScene(void)
{
//Clear the window with current clearing color
//清除一个或一组特定的缓冲区
//使用清除屏幕颜色[上方设置为蓝色]来进行清除屏幕缓冲区、深度缓冲区、模板缓冲区?
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();
//Perform the buffer swap to display the back buffer
//执行缓冲区交换来显示后端缓冲区
//(即显示上方代码的渲染结果置换到界面,上方代码执行渲染结果会缓存到后端缓冲区,这句代码将后端缓冲区的内容置换到显示屏幕上显示)
/*
* 当 glutInitDisplayMode 有传入双缓冲模式时,
* 将在后台缓冲区进行渲染,然后在结束时交换到前台
* 为了防止观察者看到可能随着动画帧和动画帧之间闪烁的渲染过程
*/
glutSwapBuffers();
}
//Main entry point for GLUT based programs
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);
//初始化窗口大小
glutInitWindowSize(800, 600);
//创建窗口
glutCreateWindow("Triangle");
//注册回调函数,拦截窗口大小变化消息,ChangeSize 是自定义方法名
glutReshapeFunc(ChangeSize);
//注册回调函数,拦截窗口渲染消息,RenderScene 是自定义方法名
glutDisplayFunc(RenderScene);
//确保驱动程序的初始化中没有出现任何问题。
GLenum err = glewInit();
if (GLEW_OK != err) {
fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
return 1;
}
//初始化设置
SetupRC();
//进入调用循环
glutMainLoop();
return 0;
}
2021年3月13日23:24:23更新
gltools.lib的引入可如下给项目配置即可