【C++游戏引擎开发】第11篇:GLFW、GLAD环境搭建与第一个三角形渲染
一、GLFW、GLAD安装
1.1 vcpkg安装相关库
跨平台C++包管理利器vcpkg完全指南
# 安装GLFW
vcpkg install glfw3
# 安装GLAD
vcpkg install glad
1.2 初始测试代码
#include <glad/glad.h>
#include <GLFW/glfw3.h>
int main() {
glfwInit();
GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", nullptr, nullptr);
glfwMakeContextCurrent(window);
gladLoadGL();
while (!glfwWindowShouldClose(window)) {
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
glfwPollEvents();
}
return 0;
}
运行出现一个黑色窗口即为成功。
二、第一个三角形
2.1 着色器简介
着色(Shading) 是计算机图形学中通过计算物体表面颜色、光照和材质属性的过程,其核心作用在于模拟光线与物体交互的视觉效果。在渲染管线中,着色器(Shader)作为可编程模块,分别控制顶点变换(顶点着色器)和像素着色(片段着色器),实现从基础颜色填充到复杂光照模型(如漫反射、镜面高光)、纹理映射以及后期特效的生成,最终赋予3D模型逼真的视觉表现力,是连接几何数据与屏幕像素的关键技术环节。
2.1.1 顶点着色器
#version 460 core // 指定使用GLSL 4.6核心模式
layout (location = 0) in vec3 aPos; // 声明输入顶点属性(三维坐标)
void main()
{
gl_Position = vec4(aPos, 1.0); // 坐标转换为齐次坐标
}
核心功能:
- 顶点数据处理(逐顶点执行)
- 接收应用程序传入的原始顶点数据(三维坐标)
- 通过aPos变量获取每个顶点的位置信息
- 坐标空间转换
- 将模型空间的局部坐标转换为裁剪空间坐标
- 构造四维齐次坐标(w分量设为1.0),满足投影需求
- 输出到内置变量gl_Position供后续管线使用
2.1.2 片段着色器
#version 460 core // 声明使用GLSL 4.6核心模式
out vec4 FragColor; // 定义颜色输出变量
void main()
{
// 为每个像素设置固定颜色(RGBA格式)
FragColor = vec4(1.0, 0.5, 0.2, 1.0); // 橙色
}
核心功能:
- 接收光栅化阶段生成的片段(Fragment,即潜在的像素候选)
- 对每个片段执行一次着色器代码(高度并行)
- 通过
FragColor
变量输出最终颜色(RGBA格式)
2.1.3 着色器创建
代码:
GLuint createShaderProgram(const char* vertSource, const char* fragSource) {
// 编译两个着色器
GLuint vertexShader = compileShader(GL_VERTEX_SHADER, vertSource);
GLuint fragmentShader = compileShader(GL_FRAGMENT_SHADER, fragSource);
// 创建程序对象
GLuint program = glCreateProgram();
glAttachShader(program, vertexShader); // 附加顶点着色器
glAttachShader(program, fragmentShader); // 附加片段着色器
glLinkProgram(program); // 链接程序
// 检查链接状态
GLint success;
glGetProgramiv(program, GL_LINK_STATUS, &success);
if (!success) {
char infoLog[512];
glGetProgramInfoLog(program, 512, nullptr, infoLog);
std::cerr << "Program linking error:\n" << infoLog << std::endl;
}
// 清理着色器对象
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
return program;
}