OpenGL-基础知识(更新中)

本文基于The Cherno在Youtube上的OpenGL系列视频总结出的笔记,等这个系列视频学习完后,将更加系统详细的学习《计算机图形学编程(使用OpenGL和C++ 第二版)》这本书。个人认为看cherno的视频上手速度更快,而且他对基本概念和原理的解释非常通俗易懂,对于想快速学习OpenGL的同学很适用。
目前学习进度:9/31。以下编号对应系列视频的编号:

OpenGL-youtube

1

OpenGL是一个规范,类似C++,本身不提供代码,提供那个代码的是GPU供应商,例如NVIDIA/AMD,其驱动中包含了OpenGL的实现,该实现并不开源,即你无法看到其源码

OpenGL相比于Vulcan更简单,更易学?OpenGL是跨平台的

Direct3D接口设计得很好

legacy OpenGL和modern OpenGL的区别是modern更像是一组预设功能,legacy则提供更底层的调用。另外两者的最大区别是着色器(shader)不同,shader是一段运行在GPU上的代码,modern OpenGL的shader是可编程的,legacy则是不可编程的

2

window的图形api是directX/direct3D

OpenGL函数是在GPU驱动文件中的(dll),而不是某个可以被下载的代码,我们要做的事情是从驱动的dll库中“提取”函数并且得到函数指针从而调用他们,但是这个动作与平台有关,例如window需要一些win32函数来提取dll中的函数,为了跨平台我们需要glew库帮我们处理跨平台的事情,glew是openGL的扩展库,这些库的实现是识别我们的图形驱动类型并找到相应的dll文件并加载函数指针,这些dll文件原本就在我们电脑上。

3 4 5

openGL是一个状态机,pipeline工作方式:为显卡提供绘制需要的数据并存储在GPU上,然后使用shader着色器(在GPU上执行)读取这些数据,并显示在屏幕上。通常绘制图形时我们使用vertex buffer存储数据,我们通过vertext attribute告诉OpenGL这些数据的layout布局,即如何解码/翻译这些数据。

vertex可以包含除了位置之外的其他信息,如颜色,纹理等,这些都是vertex的属性,属性通过index来索引(0,1,2…),如0时位置,1是纹理,它表明了属性在buffer中的layout

void glVertexAttribPointer(
GLuint index,  // 指定当前vertex属性的索引
GLint size,  // 表示当前vertex属性的由几部分(component)组成,只能是1/2/3/4,例如二维坐标size是2,三维坐标size是3
GLenum type,  // 当前vertex属性的数据类型
GLboolean normalized,  //  是否让opengl归一化,例如颜色0-255归一到shader中的[0,1]空间
GLsizei stride,  // vertex的大小,即vertex所有属性相加的大小
const GLvoid * pointer);  // 下一个属性的偏移位置

n个属性就调用glVertexAttribPointer n次

6

如果程序没有提供shader,某些GPU driver会提供默认的shader。
shader是一个运行在GPU上的程序,shader将数据进行解析,从而实现绘制、光照等等效果。
shader类型:

  • vertex shader。顶点着色器
  • fragment shader。片段着色器,像素着色器

  • vertext shader和fragment shader覆盖了90%的场景。
    OpenGL pipeline(管道)基本工作过程:
  • 在CPU上写入了一系列的数据
  • 将数据送入GPU
  • (使OpenGL处于某种状态从而)触发draw call()
  • 进入shader stage,即GPU开始处理draw call并在屏幕上绘制
    • vertex shader先于fragment shader被调用
      vertex shader的作用是告诉OpenGL我们希望vertex在什么位置,此外vertex shader解析所有vertex attr并将数据传递给下一个shader。vertex shader对每个vertex都会调用一次
      fragment shader的作用是决定每个像素是什么颜色,fragment shader对每个需要 绘制的/rasterized(光栅化/栅格化)的 像素都会调用一次,例如一个绘制三角形,其内部需要填充的每个像素都会调用一次fragment shader
      由于不同shader的调用次数不同,因此对于某些性能优化的场景,我们应该尽可能地减少在频繁调用的shader中进行不必要的计算。

7 8

shader代码可以直接在程序中编写,或者来自某个shader代码文件,或者是某些二进制文件,然后给OpenGL提供这些代码进行编译,链接到同一个shader程序中,并返回给我们一个唯一的shader ID。shader程序在GPU上运行

9

绘制的基本单元是三角形,因为这是使用最少vertex确定一个平面的方法。当我们绘制一个矩形,我们实际上绘制了两个三角形.
index buffer用于重用已经存在的vertex,避免过多重复数据。
GL_ELEMENT_ARRAY_BUFFER的数据类型必须是unsigned int,不能是int

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

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

相关文章

使用 SDKMAN! 在 Mac(包括 ARM 架构的 M1/M2 芯片)安装适配 Java 8 的 Maven

好的,这是使用 SDKMAN! 安装适配 Java 8 的 Maven 的步骤: 前提条件: 安装 SDKMAN!: 如果你的系统上没有安装 SDKMAN!,请按照以下说明进行安装: curl -s "https://get.sdkman.io" | bash source "$HOME/.sdkman/bin/sdkman-i…

【Stable Diffusion模型测试】测试ControlNet,没有线稿图?

相信很多小伙伴跟我一样,在测试Stable Diffusion的Lora模型时,ControlNet没有可输入的线稿图,大家的第一反应就是百度搜,但是能从互联网上搜到的高质量线稿图,要么收费,要么质量很差。 现在都什么年代了&a…

oracle表分区--范围分区

文章目录 oracle表分区分区的原因分区的优势oracle表分区的作用oracle表分区类型一、范围分区二、 创建分区表和使用:1、按照数值范围划分2、按照时间范围3、MAXVALUE2. 向现有表添加新的分区3、 分区维护和重新组织(合并/删除) oracle表分区…

InspurServer服务器监控指标详解

在现代信息化环境中,服务器的稳定运行对于业务连续性至关重要。InspurServer作为高性能服务器解决方案,其性能监控与优化更是不可或缺。本文将基于监控易一体化运维软件,深入探讨InspurServer服务器的关键监控指标,包括响应时间、…

基于opencv的 24色卡IQA评测算法源码-可完全替代Imatest

1.概要 利用24色卡可以很快的分析到曝光误差,白平衡误差,噪声,色差,饱和度,gamma值。IQA或tuning工程一般用Imatest来手动计算,不便于产测部署,现利用opencv实现了imatest的全部功能&#xff0c…

Django开发入门 – 4.创建Django app

Django开发入门 – 4.创建Django app Create A Django App Under An Existing Project By JacksonML 1. 什么是Django app? Django项目面向Web应用程序,它会由一个或多个子模块组成,这些子模块称为apps。 Django apps负责执行完整Web应用程序中涉及…

string

string 概念 string 字符串其实是一种更加高级的封装,string字符串中包含大量的方法, 这些方法使得字符串的操作变得更加简单。 C中将字符串直接作为一种类型,也就是string类型,使用string类型创建的 对象就是C的字符串。 使用C中提供的string是,必须添加头文件string。 st…

如何在Excel和WPS中进行翻译

文档翻译我们可以用在线翻译工具,Excel工作表的翻译使用在线翻译工具就不是特别方便,那么如何快速进行翻译呢,我们今天介绍在不同的场景下如何利用翻译函数和Python程序来实现单元格的快速翻译。 一、在wps中进行翻译 WPS是我们常用的办公软…

Docker Desktop Windows 之 安装 SqlServer

Docker 安装SqlServer 》》拉取 Pull docker pull mcr.microsoft.com/mssql/server:2022-latest 》》运行 run docker run -e “ACCEPT_EULAY” -e “MSSQL_SA_PASSWORDSA12345” -p 1400:1433 --name sql-server2022 -h sql-server2022 -d mcr.microsoft.com/mssql/server:20…

【STM32】ADC|多通道ADC采集

本次实现的是ADC实现数字信号与模拟信号的转化,数字信号时不连续的,模拟信号是连续的。 1.ADC转化的原理 模拟-数字转换技术使用的是逐次逼近法,使用二分比较的方法来确定电压值 当单片机对应的参考电压为3.3v时,0~ 3.3v(模拟信…

pdf.js默认显示侧边栏和默认手形工具

文章目录 默认显示侧边栏(切换侧栏)默认手形工具(手型工具) 大部分的都是在viewer.mjs中的const defaultOptions 变量设置默认值,可以使用数字也可以使用他们对应的变量枚举值 默认显示侧边栏(切换侧栏) 在viewer.mjs中找到defaultOptions,大概在732行,或则搜索sidebarViewOn…

使用DeepSeek和Kimi快速自动生成PPT

目录 步骤1:在DeepSeek中生成要制作的PPT主要大纲内容。 (1)在DeepSeek网页端生成 (2)在本地部署DeepSeek后,使用chatBox生成PPT内容 步骤2:将DeepSeek成的PPT内容复制到Kimi中 步骤3&…

PADS多层板减少层数

前提 PADS是硬件工程师必备的画图软件,相信很多朋友遇到过为降低成本把6层板改为4层,或8层改为6层的经历,正常是把不需要的两层上所有东西删掉,然后修改层设置,下面举例说明。 首先是将要删除的层上的数据全部删除&a…

Spring 项目接入 DeepSeek,分享两种超简单的方式!

⭐自荐一个非常不错的开源 Java 面试指南:JavaGuide (Github 收获148k Star)。这是我在大三开始准备秋招面试的时候创建的,目前已经持续维护 6 年多了,累计提交了 5600 commit ,共有 550 多位贡献者共同参与…

【LeetCode】689、三个无重叠子数组的最大和

【LeetCode】689、三个无重叠子数组的最大和 文章目录 一、dp1.1 dp 二、多语言解法 一、dp 1.1 dp // go // 输入: nums[] // 计算: 找三段长度为 k 的不重叠的子数组. 要求这 3k 个元素之和最大 // 输出: 三段子数组的 起始位置. 若有多个结果, 返回字典序最小的一个 func …

transformer

导语: 2017年,一篇名为《Attention is All You Need》的论文横空出世,提出了Transformer模型,彻底改变了自然语言处理(NLP)领域的格局。Transformer以其独特的结构和强大的性能,迅速成为NLP领域…

DeepScaleR:仅用 1.5B 参数超越 OpenAI O1-Preview 的强化学习模型

1. 项目概述 1.1 项目目标与意义 DeepScaleR 项目旨在通过强化学习技术推动人工智能模型的性能提升,以更低的成本实现更优的推理能力。其核心目标是开发出在特定任务上超越现有模型的高效模型,同时为开源社区提供技术参考,促进技术的普惠和创新。 技术突破:DeepScaleR-1.…

深入理解指针初阶:从概念到实践

一、引言 在 C 语言的学习旅程中,指针无疑是一座必须翻越的高峰。它强大而灵活,掌握指针,能让我们更高效地操作内存,编写出更优化的代码。但指针也常常让初学者望而生畏,觉得它复杂难懂。别担心,本文将用通…

八、OSG学习笔记-

前一章节: 七、OSG学习笔记-碰撞检测-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145558132?spm1001.2014.3001.5501 一、了解OSG图元加载显示流程 本章节代码: OsgStudy/wids CuiQingCheng/OsgStudy - 码云 - 开源中国https:…

在 ARM64 架构系统离线安装 Oracle Java 8 全流程指南

在 ARM64 架构系统离线安装 Oracle Java 8 全流程指南 文章目录 在 ARM64 架构系统离线安装 Oracle Java 8 全流程指南一、引言二、下载前的准备2.1 确认系统架构2.2 注册 Oracle 账号 三、从 Oracle 官方下载 Java 8 for ARM643.1 访问 Oracle Java 存档页面3.2 选择合适的版本…