使用了glew库和freeglut库
#include <GL/glew.h>
#include <GL/freeglut.h>
#include <iostream>
// 窗口大小
const GLint WIDTH = 800, HEIGHT = 600;
const GLchar* 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 GLchar* fragmentShaderSource = "#version 330 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
" FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
"}\0";
void render()
{
// 清空颜色缓冲区
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 使用着色器程序
// 创建顶点着色器
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, nullptr);
glCompileShader(vertexShader);
// 创建片段着色器
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, nullptr);
glCompileShader(fragmentShader);
// 创建着色器程序
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
// 删除着色器对象
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
// 顶点数据
GLfloat vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
// 创建顶点缓冲对象(VBO)
GLuint VBO, VAO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
// 绘制三角形
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);
// 交换缓冲区
glutSwapBuffers();
}
int main(int argc, char** argv)
{
// 初始化GLUT
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowSize(WIDTH, HEIGHT);
glutCreateWindow("OpenGL");
// 初始化GLEW
glewExperimental = GL_TRUE;
glewInit();
// 设置视口大小
glViewport(0, 0, WIDTH, HEIGHT);
// 注册回调函数
glutDisplayFunc(render);
// 进入GLUT循环
glutMainLoop();
return 0;
}
#include <GL/glew.h>
#include <GL/freeglut.h>
#include <iostream>
int windowWidth = 800;
int windowHeight = 600;
float time = 0.0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
// 设置着色器程序和参数
GLint shaderProgram;
GLuint vertexShader;
GLuint fragmentShader;
const GLchar* vertexShaderSource = R"(
#version 330 core
layout (location = 0) in vec3 aPos;
void main()
{
gl_Position = vec4(aPos, 1.0);
}
)";
const GLchar* fragmentShaderSource = R"(
#version 330 core
uniform float time;
uniform vec2 resolution;
out vec4 FragColor;
void main()
{
vec2 uv = gl_FragCoord.xy / resolution.xy;
float strength = 0.2;
float speed = 1.0;
float frequency = 10.0;
vec2 offset = vec2(cos(uv.y * frequency + time * speed), sin(uv.x * frequency + time * speed)) * strength;
vec3 color = vec3(1.0, 0.5, 0.0);
FragColor = vec4(color, 1.0) + vec4(offset.x, offset.y, 0.0, 0.0);
}
)";
// 创建和编译顶点着色器
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
// 创建和编译片段着色器
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
// 创建着色器程序
shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
// 检查编译错误
GLint success;
GLchar infoLog[512];
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
}
// 设置着色器参数
glUseProgram(shaderProgram);
glUniform1f(glGetUniformLocation(shaderProgram, "time"), time);
glUniform2f(glGetUniformLocation(shaderProgram, "resolution"), windowWidth, windowHeight);
// 绘制一个全屏四边形
glBegin(GL_QUADS);
glVertex2f(-1.0, -1.0);
glVertex2f(1.0, -1.0);
glVertex2f(1.0, 1.0);
glVertex2f(-1.0, 1.0);
glEnd();
glutSwapBuffers();
}
void idle()
{
time += 0.01;
glutPostRedisplay();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(windowWidth, windowHeight);
glutCreateWindow("Wave Shader");
// 初始化GLEW
glewExperimental = GL_TRUE;
glewInit();
glutDisplayFunc(display);
glutIdleFunc(idle);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glutMainLoop();
return 0;
}