当前位置: 首页 > news >正文

【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;
}

2.1.4 着色器编译
http://www.dtcms.com/a/122995.html

相关文章:

  • 09-Spring 与线程安全:IOC 与多线程下的坑与解法
  • 解锁Midjourney创作潜能:超详细提示词(Prompts)分类指南
  • 【42期获取股票数据API接口】如何用Python、Java等五种主流语言实例演示获取股票行情api接口之沪深指数最新分时BOLL数据及接口API说明文档
  • 三、使用Keil5新建STM32工程
  • 【学Rust写CAD】29 Alpha256结构体(alpha256.rs)
  • torch.meshgrid()
  • 【OCR】总结目前流行的主要的OCR工具
  • Jenkins安装流程
  • 联邦学习研读笔记
  • printf
  • 【NLP 面经 9、逐层分解Transformer】
  • 第十一章 Python语言-高阶技巧(终章)
  • Dubbo(44)如何排查Dubbo的服务依赖问题?
  • 17. git pull
  • 6、nRF52xx蓝牙学习(nrf_gpiote.c库函数学习)
  • 基于 AI智能体、大模型、RAG、Agent 等技术构建公司内部闭环智能问答系统的详细方案,结合 Spring Boot + Vue 管理系统 的改造思路
  • Http代理服务器选型与搭建
  • Starrocks的Bitmap索引和Bloom filter索引以及全局字典
  • 基于微信小程序的志愿服务系统的设计与实现
  • 数字图像处理作业3
  • fuse-python使用fuse来挂载fs
  • 汽车软件开发常用的建模工具汇总
  • Joomla 常用模块 - 在线用户与Joomla 常用模块 - 自定义HTML模块
  • [leetcode]判断质数
  • 关于C++日志库spdlog
  • JS 函数提升
  • 蓝桥杯十一届C++B组真题题解
  • 革新电销流程,数企云外呼开启便捷 “直通车”
  • 各种场景的ARP攻击描述笔记(超详细)
  • stream流Collectors.toMap(),key值重复问题