操作系统:Win10
工具:VS2019
环境:glfw 3.3.0.1、glew1.9.0.1
测试结果
测试代码
#include <iostream>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
using namespace std;
//窗口背景色
float red, green, blue = 0.0f;
void framebuffer_size_callback(GLFWwindow* window, int width, int height);、
//窗口消息处理函数
void processInput(GLFWwindow* window);
//GLSL编译
const char* vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
"}\0";
const char* fragmentShaderSource = "#version 330 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
" FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
"}\n\0";
void processInput(GLFWwindow* window)
{
if (glfwGetKey(window, GLFW_KEY_R) == GLFW_PRESS)
{
cout << "当前窗口颜色:Red" << endl;
green = 0.0f;
blue = 0.0f;
red = 1.0f;
}
if (glfwGetKey(window, GLFW_KEY_G) == GLFW_PRESS)
{
cout << "当前窗口颜色:Green" << endl;
green = 1.0f;
blue = 0.0f;
red = 0.0f;
}
if (glfwGetKey(window, GLFW_KEY_B) == GLFW_PRESS)
{
cout << "当前窗口颜色:Blue" << endl;
green = 0.0f;
blue = 1.0f;
red = 0.0f;
}
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
{
cout << "Window was closed..." << endl;
glfwSetWindowShouldClose(window, true);
}
}
//窗口大小视口变换,没搞清楚是怎么用的
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
int main(int argc, char* argv[])
{
//初始化glfw,使用3.3版本
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//开窗600*800,标题OpenGL
GLFWwindow* window = glfwCreateWindow(600, 800, "OpenGL", NULL, NULL);
//开窗失败
if (window == NULL)
{
cout << "Creating window fail" << endl;
glfwTerminate();
return EXIT_FAILURE;
}
//OpenGL是一个状态机,设置这个窗口为当前运行上下文
glfwMakeContextCurrent(window);
//glew初始化失败
glewExperimental = true;
if (glewInit() != GLEW_OK)
{
cout << "glew init fail" << endl;
glfwTerminate();
return EXIT_FAILURE;
}
glViewport(0, 0, 600, 800);
//窗口处理函数
// 创建顶点着色器,源代码为vertexShaderSource字符串,编译
int vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
//编译出错显示
int success;
char infoLog[512];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
}
// 创建片段着色器,源代码为fragmentShaderSource字符串,编译
int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
// 编译出错显示
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
}
// 创建程序,链接
int shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
// 链接程序错误显示
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
}
//程序已经生成,不需要它们了删除
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
//三角形是顺时针画的
float vertices[] = {
0.5f, 0.5f, 0.0f, // 三角形上顶点坐标
0.5f, -0.5f, 0.0f, // 三角形右下顶点坐标
-0.5f, -0.5f, 0.0f, // 三角形左下顶点坐标
};
//VBO:顶点缓冲对象 VAO:顶点数组对象
unsigned int VBO, VAO;
//各生成一个对象
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
//OpenGL是状态机,必须要告诉它我们要用哪个顶点数组对象
glBindVertexArray(VAO);
//OpenGL是状态机,必须要告诉它我们要用哪个顶点缓冲对象
glBindBuffer(GL_ARRAY_BUFFER, VBO);
//设置VBO的数据为vertices(三角形三个顶点)这个数组,GL_STATIC_DRAW:不能改变数据
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
//设置属性指针,从偏移地址0((void*)0)开始取,每次3个GL_FLOAT大小,取完后,地址
//后移3 * sizeof(float)大小
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
while (!glfwWindowShouldClose(window))
{
processInput(window);
glClearColor(red, green, blue, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
//使用刚才编译的shaderProgram,其实这一句可以放在循环外(我猜的)
glUseProgram(shaderProgram);
//这一句上面已经有了加不加都无所谓,这里循环绑定意义不大(我猜的)
glBindVertexArray(VAO);
//告诉OpenGL我要用顶点数组第0个开始用,用3个画一个三角形
glDrawArrays(GL_TRIANGLES, 0,3);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return EXIT_SUCCESS;
}