一、OpenGL的原理解析

文章目录

    • OpenGL到底实现的是什么?
    • OpenGL内模型数据的本质是什么?
    • 为什么三角形是 3D 渲染的最基本单元?
    • MVP 变换(Model-View-Projection 变换)
    • OpenGL渲染流程-摄像机变换
    • OpenGL渲染流程-投影变换
    • OpenGL渲染管线概述

OpenGL到底实现的是什么?

在这里插入图片描述
上述图中左边有一个圆柱体。我们的观看视角是从左上方LOOK去观察这个圆柱体,在这种情况下,我们会在右边的屏幕上看到一个扁平的圆柱体。所谓的OpenGL实现的渲染就是从某个方向看向场景中的物体,最终在屏幕上渲染成一张图片的功能。

OpenGL内模型数据的本质是什么?

在这里插入图片描述在 OpenGL 中,顶点数据(Vertex Data) 是渲染 3D 物体的基本单位。每个顶点可以包含位置(Position)、颜色(Color)、法线(Normal)、纹理坐标(Texture Coordinates)等信息。这些数据通常存储在 顶点缓冲对象(VBO,Vertex Buffer Object) 中,并由顶点着色器(Vertex Shader)处理。

为什么三角形是 3D 渲染的最基本单元?

在这里插入图片描述
在 OpenGL 和计算机图形学中,三角形是无敌的! 这是因为三角形在 3D 渲染中具有许多独特的优势,使其成为构建复杂几何形状的基础单元。

1. 三角形是最简单的平面图元

  • 最少的顶点数:三角形是最简单的多边形,只需 3 个顶点 就能确定一个平面,而四边形可能是非平面的(比如扭曲的四边形)。
  • 计算简单:任何 3D 空间中的三角形顶点都可以唯一确定一个平面,避免了几何上的歧义。

2. 三角形永远是平面的

  • 在 3D 空间中,任意 3 个不共线的点总能唯一确定一个平面,而四边形或多边形可能会因为顶点不共面而导致扭曲(例如凸起的四边形无法保证在同一平面上)。
  • 由于三角形始终是平面的,它在光照、纹理映射和裁剪等渲染计算中更高效、更稳定。

MVP 变换(Model-View-Projection 变换)

1. MVP 变换的三个阶段
MVP 变换由三个矩阵相乘而成:

MVP=Projection×View×Model

Model 变换(M,模型矩阵):

  • 作用:把物体从本地坐标系(Local Space)转换到世界坐标系(World Space)。
  • 典型操作:平移(Translate)、旋转(Rotate)、缩放(Scale)。

View 变换(V,视图矩阵):

  • 作用:把物体从世界坐标系(World Space) 转换到相机坐标系(Camera Space)。
  • 典型操作:定义相机位置、方向、朝向,模拟我们用眼睛看物体的方式。

Projection 变换(P,投影矩阵):

  • 作用:把物体从相机坐标系(Camera Space)转换到 裁剪坐标系(Clip Space),然后进行透视除法(Perspective Division),最终变换到屏幕坐标系(Screen Space)。
  • 透视投影(Perspective Projection):适用于 3D 场景,近大远小。
  • 正交投影(Orthographic Projection):适用于 2D 或 CAD 场景,平行投影。

2. MVP 变换流程图

局部坐标 (Local Space)(Model 变换)
世界坐标 (World Space)(View 变换)
相机坐标 (Camera Space)(Projection 变换)
裁剪坐标 (Clip Space)(透视除法)
NDC (Normalized Device Coordinates)(视口变换)
屏幕坐标 (Screen Space)

OpenGL渲染流程-摄像机变换

在这里插入图片描述
在 OpenGL 的渲染流程中,摄像机变换(视图变换)是将场景从世界坐标系转换到摄像机坐标系(观察空间)的关键步骤。这一步模拟了从摄像机视角观察场景的效果。

OpenGL 渲染流程概述:

  1. 顶点着色器:处理顶点属性,如位置、法线和纹理坐标。
  2. 图元装配:将顶点组装成图元(如点、线、三角形)。
  3. 几何着色器(可选):对图元进行进一步处理或生成新的图元。
  4. 光栅化:将图元转换为片段(像素),准备进行逐像素处理。
  5. 片段着色器:计算每个片段的颜色和其他属性。
  6. 测试与混合:执行深度测试、模板测试、混合等操作,最终将片段写入帧缓冲区。

摄像机变换(视图变换):
在上述流程中,视图变换发生在顶点着色器阶段之前。它将顶点从世界坐标系转换到摄像机坐标系,使场景以摄像机为中心进行观察。
实现视图变换的关键步骤:

  1. 定义摄像机位置(Position):确定摄像机在世界坐标系中的位置。
  2. 定义摄像机目标(Target):确定摄像机所看的目标点。
  3. 定义上向量(Up Vector):指定摄像机的上方向,用于确定摄像机的旋转和倾斜。

OpenGL渲染流程-投影变换

在这里插入图片描述
在 OpenGL 的渲染流程中,投影变换(Projection Transformation)是将场景从摄像机坐标系(视图空间)转换到裁剪坐标系的关键步骤。这一过程决定了如何将三维场景投影到二维屏幕上,以实现逼真的视觉效果。

投影变换的主要类型:
透视投影(Perspective Projection):

  • 特点:模拟人眼的视觉效果,具有近大远小的透视效果。
  • 应用:广泛用于需要深度感的 3D 场景渲染,如游戏和虚拟现实。

正交投影(Orthographic Projection):

  • 特点:平行投影,物体无论远近都保持相同的尺寸,没有透视缩放。
  • 应用:常用于工程制图、CAD 应用和某些 2D 游戏。

投影矩阵的作用:
投影矩阵将摄像机坐标系中的三维坐标转换为裁剪坐标系。在裁剪坐标系中,坐标被标准化到一个特定范围内,通常是 [-1, 1]。任何超出这个范围的顶点都会被裁剪掉,即不会被渲染。

投影变换的过程:

  1. 定义投影矩阵:根据所需的投影类型(透视或正交),设置相应的参数,如视锥体的左右、上下、近远平面等。
  2. 应用投影矩阵:将投影矩阵应用于顶点坐标,将其从视图空间转换到裁剪空间。
  3. 透视除法:在裁剪空间中,对顶点的齐次坐标进行透视除法,将其转换为标准化设备坐标(NDC)。

注意事项:

  • 在透视投影中,近剪裁面(near plane)必须为正值,且远剪裁面(far plane)大于近剪裁面。
  • 投影矩阵的设置直接影响场景的视野、深度感和最终的渲染效果。

OpenGL渲染管线概述

在这里插入图片描述
1.顶点着色器(Vertex Shader)
在OpenGL中,顶点着色器(Vertex Shader)是图形渲染管线的第一个可编程阶段,负责处理输入的顶点数据。它的主要作用是对每个顶点进行独立的处理,并将处理后的数据传递给后续的渲染阶段。顶点着色器是OpenGL着色器编程的核心部分之一,开发者可以通过编写顶点着色器代码来实现自定义的顶点变换和处理逻辑。

顶点着色器的作用:

  • 顶点变换:将顶点的局部坐标(模型空间)转换为世界坐标、观察坐标(相机空间)和裁剪空间坐标。通常通过矩阵乘法(如模型矩阵、视图矩阵和投影矩阵)来实现。
  • 顶点属性处理:处理顶点的属性数据,如位置、颜色、法线、纹理坐标等。可以将这些属性传递给后续的片段着色器或其他着色器阶段。
  • 自定义计算:开发者可以在顶点着色器中实现自定义的计算逻辑,例如顶点动画、变形效果、光照计算(如顶点光照)等。
  • 数据传递:将处理后的顶点数据(如位置、颜色、纹理坐标等)传递给后续的渲染阶段(如图元装配、几何着色器、片段着色器等)。

2.形状装配(Shape Assembly)
在OpenGL中,Shape Assembly(形状装配)是图形渲染管线中的一个固定功能阶段,位于顶点处理之后和几何处理之前。它的主要作用是将顶点数据组装成基本的几何图元(如点、线、三角形等),为后续的光栅化和片段处理做准备。

形状装配的作用:

  • 图元组装:将顶点数据按照指定的图元类型(如 GL_POINTS、GL_LINES、GL_TRIANGLES 等)组装成几何图元。
  • 裁剪(Clipping):在组装过程中,OpenGL会检查图元是否在视景体(View Volume)内。如果图元完全在视景体内,则保留;如果完全在视景体外,则丢弃;如果部分在视景体内,则进行裁剪,只保留可见部分。
  • 透视除法(Perspective Division):将顶点从裁剪空间坐标(Clip Space)转换为标准化设备坐标(NDC,Normalized Device Coordinates)。透视除法是通过将裁剪空间坐标的(x, y, z, w) 分量除以 w 来实现的。
  • 视口变换(Viewport Transformation):将标准化设备坐标(NDC)映射到屏幕空间(窗口坐标)。这一步骤决定了最终的图元在屏幕上的位置和大小。
  • 为光栅化做准备:组装后的图元会被传递给光栅化阶段,光栅化会将图元转换为片段(像素)。

3.几何着色器(Geometry Shader)
在OpenGL中,几何着色器(Geometry Shader)是图形渲染管线中的一个可选阶段,位于顶点着色器之后和光栅化之前。它的主要作用是对图元(如点、线、三角形等)进行进一步处理,并可以生成新的图元。几何着色器提供了更大的灵活性,允许开发者在图元级别上实现复杂的几何变换和生成。

几何着色器的作用:

  • 图元变换:可以对输入的图元进行修改,例如将点扩展为四边形、将线扩展为带状多边形等。可以实现几何变形、细分、简化等效果。
  • 图元生成:可以生成新的图元,例如从一个点生成多个点,或从一个三角形生成多个三角形。适用于粒子系统、几何实例化等场景。
  • 图元剔除:以根据某些条件(如位置、法线方向等)决定是否丢弃某些图元。
  • 数据传递:可以将处理后的图元数据传递给后续的渲染阶段(如光栅化和片段着色器)。

4.Tests and Blending(测试与混合)
在OpenGL中,Tests and Blending(测试与混合)是图形渲染管线中片段处理阶段的关键步骤,用于决定最终写入帧缓冲区的片段颜色和深度值。这些操作在片段着色器之后执行,主要用于处理片段的可见性、透明度和颜色混合等问题。

  • 测试(Tests):深度测试(Depth Test)、模板测试(Stencil Test)、裁剪测试(Scissor Test)。
  • 混合(Blending):透明度混合、颜色混合公式、混合因子。

5.片段着色器(Fragment Shader)
在OpenGL中,片段着色器(Fragment Shader)是图形渲染管线中的一个关键可编程阶段,负责处理光栅化后生成的片段(Fragment),并计算每个片段的最终颜色和其他属性。片段着色器是OpenGL着色器编程的核心部分之一,开发者可以通过编写片段着色器代码来实现各种视觉效果,如光照、纹理映射、颜色混合等。

片段着色器的作用:

  • 颜色计算:计算片段的最终颜色,通常基于光照模型、纹理采样、顶点颜色等。可以实现复杂的光照效果(如漫反射、镜面反射、环境光等)。
  • 纹理映射:通过采样纹理,将纹理颜色应用到片段上。支持多重纹理、纹理混合等高级纹理技术。
  • 片段丢弃:根据某些条件(如透明度、深度值等)决定是否丢弃片段。丢弃的片段不会写入帧缓冲区。
  • 数据输出:将计算后的颜色和其他数据(如深度值、模板值)写入帧缓冲区。支持多渲染目标(MRT),可以同时输出多个颜色附件。
  • 自定义效果:实现各种视觉效果,如阴影、模糊、边缘检测、颜色校正等。

6.光栅化(Rasterization)
在OpenGL中,光栅化(Rasterization)是图形渲染管线中的一个关键阶段,位于顶点处理之后和片段处理之前。它的主要作用是将几何图元(如点、线、三角形等)转换为片段(Fragment),即屏幕上的像素候选。光栅化是连接几何处理和像素处理的桥梁,决定了图元如何在屏幕上显示。

光栅化的作用:

  • 图元到片段的转换:将几何图元(如三角形)分解为片段,每个片段对应屏幕上的一个像素候选。片段包含颜色、深度、纹理坐标等插值属性。
  • 插值计算:对图元的顶点属性(如颜色、纹理坐标、法线等)进行插值,生成每个片段的属性值。插值是基于片段的屏幕位置和顶点的属性值计算的。
  • 片段生成:确定哪些像素位于图元内部或边缘,并生成相应的片段。对于部分覆盖图元的像素,光栅化会生成多个片段。
    为片段处理做准备:生成的片段会传递给片段着色器进行进一步处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/27807.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型——CogView4:生成中英双语高清图片的开源文生图模型综合介绍

CogView4:生成中英双语高清图片的开源文生图模型综合介绍 CogView4 是由清华大学 KEG 实验室(THUDM)开发的一款开源文生图模型,专注于将文本描述转化为高质量图像。它支持中英双语提示词输入,尤其擅长理解中文提示并生成带有汉字的图像,非常适合广告设计、短视频创作等场…

网络安全法与等级保护 PPT 精华汇总

资源描述 本资源文件为《网络安全法与等级保护》的PPT精华汇总,内容涵盖了网络安全法与等级保护的总体框架及相关标准规范。该PPT详细介绍了网络安全法与等级保护的各个章节和条款,并提供了基础类和应用类的相关标准文件,帮助读者全面了解和…

前端知识一

(ref函数)1.为什么vue3中使用ref来创建响应式数据,而不是直接声明一个变量 import { ref } from "vue";const count ref(0); // 创建一个响应式的计数器,初始值为0function increment() {count.value; // 增加计数器的…

国产免费AI的IDE-TRAE

还是在AI的加持下的新的工具 在上周一次偶然的机会看到了这样的标题–用上Claude的AI编程工具Trae。 AI我还没入门,编程也是小白级别。Claude是什么不知道。Trae这是什么也不知道。为什么起这个名字?都不知道含义。 先下载吧。(这里要说一…

解决中文乱码:字符编码全攻略 - ASCII、Unicode、UTF-8、GB2312详解

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

【Linux】进程信号——信号保存和信号捕捉

文章目录 信号保存信号相关的概念信号是如何保存的呢?有关信号保存的系统调用sigprocmask信号的增删查改查看pending表验证接口 信号捕捉用户态与内核态信号捕捉流程 总结 信号保存 信号相关的概念 信号递达:指 操作系统 将一个信号(Signal…

计算机网络数据传输探秘:包裹如何在数字世界旅行?

计算机网络数据传输探秘:包裹如何在数字世界旅行? 一、从快递网络看数据传输本质 想象你网购了一件商品: 打包:商家用纸箱包装,贴上地址标签(数据封装)运输:包裹经过网点→分拣中心→运输车(网络节点与链路)签收:快递员核对信息后交付(数据校验与接收)数据的网络…

CyberRT(apollo) 定时器模块简述及bug分析

timer 模块 timer的定义,cyberrt中timer模块用于设置定时器任务,字面意思,设置设置定时周期及出发频次(周期 or oneshot),到达指定时间时间触发callback time wheel 时钟节拍轮,常见的定时器设计&#x…

使用ast获取py文件中所有函数与类名

当我们在创建python项目,经常需要遍历和分析代码文件,特别是当我们想要自动化地获取某些信息,比如所有的函数和类名。Python的ast(Abstract Syntax Trees,抽象语法树)模块为我们提供了一个强大的工具,可以方…

【C语言5】函数:库函数、自定义函数、形参和实参、return语句、数组做函数参数、嵌套调用和链式访问、声明和定义

文章目录 一、函数的概念二、库函数2.1 标准库和头文件2.2 库函数的使用方法 三、自定义函数3.1 函数的语法形式 四、形参和实参4.1 实参4.2 形参4.2 实参和形参的关系 五、return 语句六、数组做函数参数七、嵌套调用和链式访问7.1 嵌套调用7.2 链式访问 八、函数的声明和定义…

【项目管理】基于 C 语言的 QQ 聊天室实现(TCP + 多线程 + SQLite3)

基于 C 语言的 QQ 聊天室(TCP + 多线程 + SQLite3) 项目功能基础功能: 登录、注册、添加好友、私聊、创建群聊、群聊扩展功能: 删除好友、注销账号、好友在线状态、群管理(拉人/踢人)、VIP 特权、邮件通知等 功能介绍:模拟QQ聊天客户端:登录界面:1、登录2、注册 //将用…

vscode 都有哪些大模型编程插件

VSCode 中有许多基于大模型的编程插件,这些插件通过集成人工智能技术,显著提升了开发者的编程效率和体验。以下是一些主要的大模型编程插件及其功能: GitHub Copilot GitHub Copilot 是由 OpenAI 开发的插件,能够根据代码上下文自…

每日一题洛谷普及/提高-P1154 奶牛分厩c++

无注释版 #include<iostream> #include<cstring> #include<cstdlib> using namespace std; bool ju(int n, int s[], int len, bool a[]) {memset(a, 0, n * sizeof(bool));for (int j 0; j < len; j) {if (a[s[j] % n]) {return false;}a[s[j] % n] t…

[liorf_localization_imuPreintegration-2] process has died

使用liorf&#xff0c;编译没报错&#xff0c;但是roslaunch报错如下&#xff1a; 解决方法&#xff1a; step1: 如果你之前没有安装 GTSAM&#xff0c;可以尝试安装它 step2: 检查是否缺少依赖库 ldd /home/zz/1210/devel/lib/liorf_localization/liorf_localization_imuPr…

Jmeter+ant+jenkins接口自动化测试

平台简介 一个完整的接口自动化测试平台需要支持接口的自动执行&#xff0c;自动生成测试报告&#xff0c;以及持续集成。Jmeter 支持接口的测试&#xff0c;Ant 支持自动构建&#xff0c;而 Jenkins 支持持续集成&#xff0c;所以三者组合在一起可以构成一个功能完善的接口自动…

springboot425-基于SpringBoot的BUG管理系统(源码+数据库+纯前后端分离+部署讲解等)

&#x1f495;&#x1f495;作者&#xff1a; 爱笑学姐 &#x1f495;&#x1f495;个人简介&#xff1a;十年Java&#xff0c;Python美女程序员一枚&#xff0c;精通计算机专业前后端各类框架。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xf…

如何将飞书多维表格与DeepSeek R1结合使用:效率提升的完美搭档

将飞书的多维表格与DeepSeek R1结合使用&#xff0c;就像为你的数据管理和分析之旅装上一台涡轮增压器。两者的合作&#xff0c;不仅仅在速度上让人耳目一新&#xff0c;更是将智能化分析带入了日常的工作场景。以下是它们如何相辅相成并改变我们工作方式的一些分享。 --- 在…

leetcode 148. 排序链表

题目如下 数据范围 通过代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : va…

关于对机器中的人工智能进行基准测试

大家读完觉得有帮助记得及时关注和点赞&#xff01;&#xff01;&#xff01; 抽象 最近的基准研究声称&#xff0c;AI 在各种认知任务上的表现已经接近甚至超过人类的“水平”。然而&#xff0c;本立场文件认为&#xff0c;当前的 AI 评估范式不足以评估类似人类的认知能力。我…

C# OnnxRuntime部署DAMO-YOLO交通标识检测

目录 说明 效果 模型信息 项目 代码 下载 参考 说明 效果 模型信息 Model Properties ------------------------- --------------------------------------------------------------- Inputs ------------------------- name&#xff1a;input tensor&#xff1a;Floa…