位置: 编程技术 - 正文

[3D 图形学基础] 读书笔记(1) Part_I(Getting Started) - Introduction(3d图形学原理)

发布时间:2024-02-27

推荐整理分享[3D 图形学基础] 读书笔记(1) Part_I(Getting Started) - Introduction(3d图形学原理),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:3d图形学数学基础,3d图形原理,3d图形学原理,3d图形学看什么书,3d图形学看什么书,3d图形学基础有哪些内容,3d图形学基础有哪些内容,3d图形学基础有哪些内容,内容如对您有帮助,希望把文章链接给更多的朋友!

开始读这本书大概有一个多月了吧,前学后忘,所有的知识点都是看我都是“仿佛你曾经明白过我们的样子喔”不做笔记真的是不行了,打算按照书的章节来写,期待我能早日从这本书毕业呢。

介绍一下这本书先:《Foundations of 3D Computer Graphics》, by Steven J. Gortler,

以下是第一章,因为非常基础,感觉比在其他地方看到的解释都更好理解,所以基本是通篇翻译过来的,总共也就 4-5 页的样子。

Chapter_IIntroduction

1.1OpenGL

OpenGL 设计的目的是为了实现一系列特定的操作来绘制3D计算机图形,随着硬件越来越便宜,越来越多的功能也被加入到了图形硬件中,并通过 OpenGL API 暴露给用户。随后,通过写一种特定目的的小程序 - shader,用户完全控制图形计算的某个部分也变得可行了。shader 通过 API 来传递和编译,在 OpenGL 中,这些 shader 以 GLSL - 一种类 C 风&#;的语言来编写。两个可编程的主要部分分别是 vertex shader (顶点着色器) 和 fragment shader (片段着色器)。这两部分之所以开放给用户,一个是因为将这些灵活性提供给用户非常有用,还有一个是因为这部分计算可以通过 single instruction multiple data (SIMD) (单指令多数据结构)来并行完成。处理几何体上不同点的操作可以独立完成,而决定一个像素是否需要被显示也与其他像素完全无关。

在现代的 OpenGL 程序中,许多(并非所有)实际的 3D 图形是由 shader 完成的而非 OpenGL API 自身的一部分。从这个角度讲,OpenGL 更多是关于如何管理你的数据和你的 shader 而更少的关于 3D 计算机图形。随后我们会讲到实现 3D 计算机图形时 OpenGL 所主要进行的步骤,以及不同的 shader 在其中的作用。

在 OpenGL 中,几何体用一些三角面的集合来表示。一方面,三角面对 OpenGL 来说处理起来足够简单和有效率,另一方面,我们可以用三角面来接近非常复杂的 shape (形状、模型)。如果你的计算机图形程序使用更抽象的几何体表示方法,在 OpenGL 绘制它之前必须将它转换为三角面的集合。

简要来说,OpenGL 的计算决定了每个三角面上面每个 vertex(顶点)在屏幕上的位置,找出是哪些屏幕点(即像素),位于每个三角面上,随后再进行一些计算来决定该像素应有的颜色。现在我们更详细的来过一遍这个流程。

每个三角面由三个顶点组成。我们将一些数&#;数据关联在每个顶点上,这样的数据称为 attribute (属性)。最终,我们需要决定该顶点的位置(二维几何体用2个点而三维几何体用3个点来表示)。我们可以用其他属性来关联其他类型的数据,也会影响最终该顶点的外观。例如,我们也许会关联颜色(RGB)属性到每个顶点上。其他属性也许可以用来描述相关材质属性,例如,一个表面在该顶点有多亮。

[3D 图形学基础] 读书笔记(1) Part_I(Getting Started)  - Introduction(3d图形学原理)

将顶点数据从 CPU 转到 GPU开销非常高昂,因此通常要尽量减少该操作。有一种特定的 API 调用来将顶点数据传送给 OpenGL,即将数据存入 vertex buffer (顶点缓存)中。

一旦顶点数据传送给 OpenGL,我们可以在随后的任何时间发送 draw call (绘图调用)到 OpenGL。它会让 OpenGL 读取特定顶点缓存,并将三个一组的顶点绘制为三角面。

一旦给出 draw call 指令,每个顶点(即它的所有属性)都会分别被顶点 shader 处理。除了属性数据, shader 还会访问 uniform variables (统一变量)。这些变量由应用程序所设置,但你只能在 OpenGL draw call 之间设置它们,而不是对每个顶点设置它们。

顶点 shader 是你自己的程序,你可以在其中放任何你想要的内容。顶点 shader 最常见的应用是决定一个顶点最终在屏幕上的位置。例如,一个顶点在其属性中存有自身的 3D 位置数据。同时,还可能存在描述虚拟摄影机3D中位置在2D屏幕映射的统一变量。我们将在随后的章节2-6以及中讲到这一类的具体计算。

一旦顶点 shader 计算出顶点在屏幕上的最终位置,它将这个&#;赋给一个保留的输出变量 gl_Position。这个变量的 x 和 y 坐标系被解释为绘图窗口中的位置。左下角为(-1,-1),右上角(1,1)。超出这个方块范围的&#;即在绘图区域之外。

顶点 shader 也可以输出其他的变量供片段 shader 随后用来决定三角面所覆盖的每个像素的颜色。这些输出被称为 varying variables (变化变量)因为,我们随后也会讲到,它的&#;在一个三角面中的不同像素间也会有变化。

一旦完成后,这些顶点及其变化变量会被三角面 assembler(装配器)收集,每三个分为一组。

OpenGL 的下一项工作是将每个三角面绘制在屏幕上。这一步称作 rasterization(光栅化)。它用三个顶点位置来放置每一个三角面。并随后计算屏幕上的哪些像素位于该三角面之内。对于每个像素,光栅化程序对于每个变化变量来计算插&#;。这表示每个变化变量的&#;,由三个相关的三角形顶点&#;混合而来。混合的比例与该像素到每个顶点的距离相关。我们将会在第章讲到混合的具体方法。因为光栅化是一个非常专门并且经过高度优化的操作,这一步是不可编程的。

最终,对于每个像素这些插&#;数据被传递给片段 shader。片段 shader 是你用 GLSL 编写的另一个随后交给 OpenGL 处理的程序。片段 shader 的职能是通过传递给它的变化及统一变量来决定像素的颜色。这些由片段 shader 最终计算出的颜色被放置在 GPU 内存中叫做 framebuffer (帧缓存)的地方。帧缓存中的数据随后送去显示到它该在屏幕上出现的位置。

在 3D 图形中,我们通常通过计算一些模拟光线从一些材质表面反射方式的公式来决定像素的颜色。该计算也许会用到存储在变化变量中表示某一像素的材质和几何体属性的数据。它或许也会使用保存在统一变量中表示场景中光源位置和颜色的数据。通过改变片段 shader 中的程序, 我们可以模拟光线在不同类型材质上的反弹;这样可以给固定的几何体创建不同的表面变化。我们在章中会更详细的讲这一过程。

作为颜色计算的一部分,我们也可以指示片段 shader 从存储的附属图像中获取颜色数据。这样的图像称为 texture(纹理)并由统一变量来指定。同时,叫做 texture coordinates (纹理坐标)的变化变量告诉片段 shader 怎样从纹理中获取适合的像素。使用这一过程称作 texture mapping (纹理映射),可以模拟将不同部分的图像粘合到每个三角面上。该过程可以用来给一个由很少三角面组成的简单几何体带来很高的视觉复杂度。(这里是在说法线贴图)随后在第章会详细讲到。

当颜色被存入帧缓存时,一个称作 merging (合并)的步骤决定了一个从片段 shader 中输出的“新”颜色怎样和或许已经存在于帧缓存中的“旧”颜色混合。当 z-buffering (深度缓冲)被启用时,会进行一个测试,来决定一个刚刚由片段 shader 处理过的几何体点与另一个已经存在于帧缓存中的点相比距离视角更近还是更远。而帧缓存只在新的点更近时被更新。深度缓冲在从三维场景中创建图像时非常有用。我们在第章中讨论深度缓冲。此外,OpenGL 也可以根据指示用不同比例将新旧两种颜色混合在一起。这个可以用在透明物体上。这一过程称作 alpha blending (透明混合)并在第章中讨论。因为这个混合步骤涉及到读写共享的内存(帧缓存),这一步骤也是不可编程的,但可以由不同 API 调用来控制。

OpenGL中的颜色混合功能(一) OpenGL中的颜色混合功能(一)我们知道,材料属性和光照参数可以极大地增加图形的真度,但除此之外,我们在对现实世界进行建模时,有许多效果是

windows visual studio 基于openGL的粒子系统设计 这是我上计算机三维动画的时候的期末作业,自己动手做的能实现粒子系统的效果,同时代码很简单,只有一个cpp文件,很适合想要理解粒子系统原理

windows visual studio openGL开发环境配置 1.到openGL官方网站去下载openGL的开发包,目录如下2.打开visualstudio创建win控制台程序3.打开项目的属性4.配置项目动态库路径5.配置openGL的lib的目录(其

标签: 3d图形学原理

本文链接地址:https://www.jiuchutong.com/biancheng/373146.html 转载请保留说明!

上一篇:BUG: OpenGL error 0x0500 in -[CCEAGLView swapBuffers] 328

下一篇:OpenGL中的颜色混合功能(一)(opengl颜色代码表)

  • 税收筹划的内容主要包括
  • 隔月发票退回应该如何操作
  • 处置公司车辆账务处理
  • 成本计算账户期末一般有余额吗
  • 企业出售不动产的涉税问题
  • 研究开发费用资本化和费用化
  • 培训机构开发票不能开公司抬头吗
  • 业务活动费用和行政支出
  • 增值税专票逾期抵扣怎么操作
  • 捐赠的所得税怎么处理
  • 发票没认证可以作废吗?
  • 一次性奖励随工资发
  • 代开劳务票税率多少?
  • 增值税抵扣主要用于哪些税收?
  • 坏账准备怎么冲回
  • 资产总计与负债和所有者权益总计不一致
  • 取得增值税专用发票注明税额
  • 建筑安装施工过程
  • 银行承兑汇票开票流程图
  • 个体户核税怎么核
  • 固定资产的销售
  • 即征即退和先征后退适用范围
  • 文件类型有几种分类
  • 花语大全各种花的花语花树
  • NEC笔记本电脑开机启动热键
  • 鸿蒙系统怎么设置屏幕不休眠
  • windows server 2008和r2
  • avgorange是什么文件夹可以删除吗
  • 如何关闭win10专业版自动更新
  • 代扣代缴个税手续费返还政策
  • php中split
  • 外贸企业出口退税账务处理
  • 液晶显示器容易坏点
  • php中defined什么意思
  • 销售机构人员工资属于管理费用吗
  • 生育津贴如何做账
  • 增值税怎样计算
  • 企业生产经营管理费用包括
  • vue onblur
  • 企业长期资金来源有哪些
  • 冰岛北部内陆景观有哪些
  • 一般纳税人购买原材料会计分录
  • 无票收入需要开票吗
  • 法人给对公账户转账
  • mongodb基础知识
  • Python中input输入多行文本
  • 数据库系统中,用户通过什么访问数据
  • 支付招标代理费的请示
  • 以前年度损益影响当期损益吗
  • 小规模纳税人指的是谁
  • 增值税附加税包括哪些税种及税率
  • 单位保险柜里都放些什么
  • 业务招待费扣除标准2023
  • 房租转租怎么处理合法
  • 计提印花税会计分录怎么写
  • 专利补贴收入计入什么科目
  • 支付股东借款现金流量表怎么填
  • 漏记以前年度财务费用怎么处理
  • 小规模30万含专票吗
  • 农业技术人员是什么意思
  • 从公账提取备用金到个人账户怎么做会计分录
  • 集团管理费收入是否纳税
  • fedora改密码
  • ubuntu 安装zsh
  • linux安装视频教程
  • winoldap.exe - winoldap进程是什么意思
  • windows怎么拨号
  • win7怎么看磁盘
  • cocos2dx入门
  • OpenGL ES2.0-iPhone开发-part1
  • threejs中文文档pdf
  • 学习ExtJS fit布局使用说明
  • 如何制作批处理
  • unity改vs版本
  • shell python
  • python字典添加多个键值对
  • js中数组排序sort的用法
  • 税务局举报管理办法
  • 补充协议需要双方签字盖章吗
  • 浙江 国家地理
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号