创建窗口`
#include <iostream>
//GLEW
#define GLEW_STATIC
#include <GL/glew.h>
//GLFW
#include <GLFW/glfw3.h>
using namespace std;
//创建一个窗口,定义窗口的宽高常亮
const GLint WIDTH = 800, HEIGHT = 600;
//着色器语言,一长串字符串
//顶点着色器
//着色器语言用的是330版本
/*const GLchar *vertexShaderSource = "version 330 core\n"
"layout(location=0) in vec3 position;\n"//location is 位置,in是输入,输入3维向量vec3,起名叫position
"void main()\n"
"{\n"
"gl_Position=vec4(position.x,position.y,position.z,1.0f);\n"//glposition是着色器内部保留的变量不需声明,vec4是四维向量,齐次坐标系(x,y,z,1),最后的1必须是1
//最后不是1,需做额外的处理
"}";
//片源着色器
//与顶点着色器版本一直
const GLchar *fragmentShaderSource = "version 330 core\n"
"out vec4 color;\n"//输出Out一个4维颜色变量
"voud main()\n"
"{\n"
"color=vec4(1.0f,0.5f,0.2f,1.0f);\n"
"}";
*/
int main()
{
//初始化GLFW
glfwInit();
//设置窗口
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//设置OpenGL主版本3.3之后的版本都兼容
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//设置OPenGL此版本
//使用OPENGL核心模式
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//core profile即glew
//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE);mac系统
//不可改变窗口大小
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
//自动填充,tab跳下一个参数
GLFWwindow *window = glfwCreateWindow(WIDTH, HEIGHT, "B17040506", nullptr, nullptr);//生成窗口,窗口大小,窗口名,是否设置全屏,基本不用
//分辨率即像素的个数,操作系统显示一个像素用更多的像素内存,需要知道真缓存大小(在显卡里),真缓存包含颜色缓存Colar,深度缓存
//Depth,模板缓存(画阴影)
int screenWidth, screenHeight;
glfwGetFramebufferSize(window, &screenWidth, &screenHeight);
//判断窗口是否新建成功
if (nullptr == window)
{
cout << "fail" << endl;
glfwTerminate();//关闭
return -1;
}
//指定当前窗口
glfwMakeContextCurrent(window);
//启动OPENGL
glewExperimental = GL_TRUE;
//检查是否启动成功
if (GLEW_OK != glewInit())
{
cout << "fail" << endl;
glfwTerminate();
return -1;
}
//使用OPENGL,viewport是将真缓存显存中一致的数据映射到屏幕上的过程
glViewport(0, 0, screenWidth, screenHeight);
//开始画图,屏幕一秒钟闪许多次(60HZ),要刷新很多次
//欧洲标准一秒钟刷新30帧,美25帧
/*
//import and compile shaders
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);//创建顶点着色器对象
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);//传递字符串
glCompileShader(vertexShader);//编译,检查语法错误
GLint success;
GLchar inforLog[512];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
*/
while (!glfwWindowShouldClose(window))//点红茶关闭窗口,值为真;不点一直执行这部分循环
{
//满足glfw
glfwPollEvents();//监听鼠标键盘,调出来与键盘啊进行交互
//人眼对绿色不敏感
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);//用颜色进行清除屏幕,RGBA,0-256个层次,用浮点数进行表示,A是指透明度0指全透明
glClear(GL_COLOR_BUFFER_BIT);//
glfwSwapBuffers(window);//真缓存在显卡里,显卡将真缓存映射到屏幕上需要时间,在这段时间里,同时开启另一个真缓存,即双缓存模式
}
glfwTerminate();
return 0;
}
/*
画三角形即画顶点,用两个着色器即连个函数
using namespace std;
int main(int argc,char** argv[])
{
//初始化glew
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK)
{
std::cout << "failed to intialize GLEW" << std::endl;
return -1;
}
//初始化GLFW
glfwInit();
//
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
//使用OPENGL核心模式
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//不可改变窗口大小
glfwWindowHint(GLFW_RESIZABLE ,GL_FALSE);
//创建窗口对象
//指定窗口宽高
int screen_width = 800;
int screen_height = 720;
//后面两个参数表示是否使用全屏模式和共享上下文的窗口
GLFWwindow *window = glfwCreateWindow(screen_width, screen_height, "computer graphics", nullptr, nullptr);
//如果窗口创建失败,输出failed to create opengl context
if (window == nullptr)
{
cout << "failed to create opengl context" <<endl;
glfwTerminate();
return -1;
}
//将窗口的上下文设置为当前线程的主上下文,即将窗口设置为当前正在使用的
//glfwMakeContextCurrent(window);
//创建视口
//int width, height;
//从gLFW中获取控制渲染窗口的宽高(像素)
//glfwGetFramebufferSize(window, &width, &height);
//用glViewPort函数设置窗口的维度
//glViewport(0, 0, width, height);
//游戏循环,在GLFW退出前一直保持运行
while (!glfwWindowShouldClose(window))
{
glfwPollEvents();//检查有无触发事件,如键盘输入鼠标移动等
//渲染指令
//设置清空屏幕所用的颜色,状态设置函数
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
//清除颜色缓冲,状态应用函数
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);//交换颜色缓冲
}
//释放为GLFW分配的内存
glfwTerminate();
return 0;
}
*/