OpenGL进阶 | GLM数学库& Shader相关

一、GLM数学库

        OpenGL和DirextX不一样,没有内置的数学库,于是我们需要找一个第三方数学库来完成OpenGL相关的数学计算。GLM库是一个为OpenGL准备的数学库,它提供了各种数学运算的函数,如矩阵运算、向量运算等。GLM库的接口与OpenGL非常相似,因此使用起来非常方便。

        GLM库支持多种数据类型,如向量(vec2、vec3、vec4)、矩阵(mat2、mat3、mat4)、四元数(quat)等,同时还提供了各种数学运算函数,如点乘(dot)、叉乘(cross)、矩阵乘法(matmul)等。GLM库的使用非常简单,不需要编译成库,只需要在代码中包含相应的头文件,就可以直接使用其中的函数和数据类型。

#include <iostream>
#include <glm/glm.hpp>

using namespace std;
using namespace glm;

int main()
{
    vec3 v1(1.0f, 2.0f, 3.0f);
    vec3 v2(4.0f, 5.0f, 6.0f);
    float k = 2.0f;
    
    vec3 v3 = v1 + v2 * k;
    
    cout << "v1 + v2 * k = (" << v3.x << ", " << v3.y << ", " << v3.z << ")" << endl;
    
    return 0;
}

二、Shader相关知识

        相比于CPU,GPU的优势不在于核心的处理能力,而是在于可以大规模并行处理数据。GPU上的core数量多但是计算能力小,CPU上的core数量少,但计算能力大。

1.GPU的工作流程

        简单来说:数据data (顶点数据) ----->VS文件(输入:data的顶点数据,输出:gl_Position的 vec4 顶点数据)----->光栅化处理(显卡自动负责,把点连成生成面,其中包括一定像素)------>FS文件(输入:光栅器的输出的像素,输出画面);

        复杂点说:顶点着色器 【数据data (顶点数据) ->VS文件(输入:data的顶点数据,输出:gl_Position的 vec4 顶点数据)】–> 光栅化【显卡自动负责,插值计算,把点生成像素】 –> 片段着色器【可编程管线的最后一个阶段,计算像素的颜色及其他属性】 –> alpha测试 –> 模板测试 –> 深度测试 –> Blend –> Gbuffer –> frontBuffer –> frame buffer –>显示器

2.完整的渲染管线

        渲染管线是计算机图形学中将3D模型转换为2D图像的过程。它是由一系列阶段组成的,每个阶段执行特定的操作。以下是完整的渲染管线:

  • 应用阶段(CPU)

        渲染管线之前的阶段,它涉及到3D模型的创建、导入和准备工作,以及对场景的设置和布置。以下是应用阶段的一些常见操作:3D建模、纹理贴图、场景布置、光照设置、物理引擎设置、动画制作。(应用阶段是渲染管线的前置阶段,它决定了3D模型的外观、场景的设置以及光照的效果等,直接影响最终渲染的效果

        在CPU上运行,包括3D模型的创建、场景的设置和布置等操作。

  • 几何阶段(GPU)

        在这个阶段中,3D模型的顶点被输入到渲染管线中。顶点的坐标和属性被转换为屏幕空间,计算出每个顶点的法线和切向量。还有可能进行一些基本的顶点变换,例如平移、旋转、缩放等。

        在GPU上运行,包括顶点着色器、几何着色器和变换反馈等操作。

  • 光栅化阶段(GPU)

        在这个阶段中,将几何阶段输出的图元(如三角形)转换为屏幕上的像素。在这个过程中,对每个像素进行深度测试、遮挡剔除和光栅化。还可能对像素进行采样和插值,以便在纹理映射等后续阶段中使用。

        在GPU上运行,包括剪切、光栅化和片元插值等操作。

  • 片元着色阶段(GPU)

        在这个阶段中,对每个像素进行颜色计算和光照计算。这包括基于光照和纹理的像素颜色计算,以及基于材质属性和光源的光照计算。

        在GPU上运行,包括片元着色器、深度测试、模板测试和颜色混合等操作。

  • 输出合成阶段(GPU)

        在这个阶段中,将最终的像素颜色值写入帧缓冲区中。这个阶段通常包括混合、透明度和颜色深度测试等操作,以确保最终渲染的结果与所需的输出一致。

        在GPU上运行,包括最终的像素颜色值写入帧缓冲区、深度缓冲区和模板缓冲区等操作。

        总之,GPU在渲染管线中发挥了非常重要的作用,它承担了几何阶段、光栅化阶段、片元着色阶段和输出合成阶段的任务。因为GPU可以同时执行大量并行的计算操作,可以快速处理大量的三角形和像素数据,从而实现高效的渲染效果。而CPU则更擅长于执行序列化的计算任务,因此主要用于应用阶段中的一些复杂计算和数据处理操作。

3.Shader

        shader通常称为着色器,作用是把CPU上的点渲染出来,shader在GPU上是并行执行的,比如三个顶点的数据,会在三个core上并行处理。

shader 主要有两种:

  • 顶点着色器 vertex shader:用于修改(平移,旋转,扭曲)顶点的位置 和确定顶点的颜色。
  • 片段着色器 fragment shader:也称做像素着色器 pixel shader, 用于确定每个像素的颜色,使用照明,材质等等。片段着色器既可以永远输出同一个颜色,也可以考虑光照、做凹凸贴图、生成阴影和高光,还可以实现半透明等效果。片段着色器还可以修改片段的深度,为多个渲染目标输出多个颜色。

猜你喜欢

转载自blog.csdn.net/weixin_39766005/article/details/130579567
今日推荐