这是我们OPengl的第一个程序,我们先暂时不理解其中的原理,试着写一个简单的三角形移动的代码。
在这个代码执行后,我们会看到一个左右移动的三角形。
OpenGL程序示例
这是一个使用C++和OpenGL编写的简单程序,用于在窗口中绘制一个动态变化的三角形。
#include <glad/glad.h> // 包含GLAD库,用于加载OpenGL函数指针
#include <GLFW/glfw3.h> // 包含GLFW库,用于创建窗口和处理输入
#include <iostream>
#include <string>
#include <glm/glm.hpp>
#include <fstream>
using namespace std; // 使用标准命名空间
const int numVao = 1; // 定义顶点数组对象的数量为1
GLuint renderingProgram; // 声明渲染程序的ID
GLuint vao[numVao]; // 声明一个顶点数组对象数组
using namespace std; // 再次使用标准命名空间(冗余)
const int numVAOs = 1; // 定义顶点数组对象的数量为1(冗余)
float inc = 0.1;
float x = 0;
string readFile(const char* filePath) {
string content;
ifstream fileStream(filePath, ios::in);
string line = "";
while (!fileStream.eof()) {
getline(fileStream, line);
content.append(line + "\n");
}
fileStream.close();
return content;
}
// 创建着色器程序的函数
GLuint createShaderProgram() {
GLuint vShader = glCreateShader(GL_VERTEX_SHADER);
GLuint fShader = glCreateShader(GL_FRAGMENT_SHADER);
GLuint vfprogram = glCreateProgram();
string vertShaderStr = readFile("vertShader.glsl");
string fragShaderStr = readFile("fragShader.glsl");
const char* vertShaderSrc = vertShaderStr.c_str();
const char* fragShaderSrc = fragShaderStr.c_str();
//绑定顶点着色器和片段着色器
glShaderSource(vShader, 1, &vertShaderSrc, NULL);
glShaderSource(fShader, 1, &fragShaderSrc, NULL);
// 编译顶点着色器和片段着色器
glCompileShader(vShader);
glCompileShader(fShader);
// 将着色器附加到着色器程序并链接
glAttachShader(vfprogram, vShader);
glAttachShader(vfprogram, fShader);
glLinkProgram(vfprogram);
//绑定(glShaderSource)->编译(glCompileShader)->附加到着色器,片段着色器(glAttachShader)->链接到ID
return vfprogram; // 返回着色器程序的ID
}
// 初始化函数
void init(GLFWwindow* window) {
renderingProgram = createShaderProgram(); // 创建并获取着色器程序的ID
glGenVertexArrays(numVAOs, vao); // 生成顶点数组对象
glBindVertexArray(vao[0]); // 绑定顶点数组对象
}
// 显示函数
void display(GLFWwindow* window, double currentTime) {
// 清除颜色缓冲区和深度缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 使用着色器程序
glUseProgram(renderingProgram);
// 设置像素点的大小
glPointSize(30.0f);
// 设置多边形模式为线框模式
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
// 更新 x 的值
x += inc;
if (x > 1.0f) {
inc = -0.01f;
}
if (x < -1.0f) {
inc = +0.01f;
}
// 获取 uniform 变量的位置并设置其值
GLuint offsetLoc = glGetUniformLocation(renderingProgram, "offset");
glUniform1f(offsetLoc, x);
// 绘制三角形
glDrawArrays(GL_TRIANGLES, 0, 3);
// 交换前后缓冲区
glClear(GL_DEPTH_BUFFER_BIT);
}
int main(void) {
if (!glfwInit()) { exit(EXIT_FAILURE); } // 初始化GLFW库,如果失败则退出程序
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); // 设置OpenGL主版本号为4
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // 设置OpenGL次版本号为3
// 创建一个600x600的窗口,标题为“Wasyu的Program”
GLFWwindow* window = glfwCreateWindow(600, 600, "Wasyu s Program", NULL, NULL);
glfwMakeContextCurrent(window); // 将窗口的上下文设置为当前线程的主上下文
// 加载GLAD库,如果失败则退出程序
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { exit(EXIT_FAILURE); }
glfwSwapInterval(1); // 设置交换间隔为1,启用垂直同步
init(window); // 调用初始化函数
// 主循环,直到窗口关闭
while (!glfwWindowShouldClose(window)) {
display(window, glfwGetTime()); // 调用显示函数
glfwSwapBuffers(window); // 交换前后缓冲区
glfwPollEvents(); // 处理所有待处理的事件
}
glfwDestroyWindow(window); // 销毁窗口
glfwTerminate(); // 终止GLFW库
exit(EXIT_SUCCESS); // 正常退出程序
}
fragShader文件:
这是一个使用GLSL编写的简单着色器示例,用于设置输出颜色为紫色。
#version 430
out vec4 color;
void main(void)
{
color = vec4(1.0, 0.0, 1.0, 1.0);
}
vertShader文件:
这是一个使用GLSL编写的简单着色器示例,用于根据顶点ID设置不同的顶点位置。
//注意 其中uniform float offset 就是主函数中绑定进来的ID
#version 430
uniform float offset;
void main(void)
{
vec4 vec[3];
vec[0] = vec4(0.25, 0.0, 0.0, 1.0);
vec[1] = vec4(0.0, 0.25, 0.0, 1.0);
vec[2] = vec4(-0.25, 0.0, 0.0, 1.0);
for(int i=0; i<3; i++) {
if(gl_VertexID == i) {
gl_Position = vec[i] + vec4(offset, 0.0, 0.0, 0.0);
}
}
}
标签:1.0,OPENGL,void,window,GLuint,三角形,GL,绘制,着色器
From: https://www.cnblogs.com/AnnaStore/p/18605806