位置: 编程技术 - 正文

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

编辑:rootadmin

推荐整理分享[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颜色代码表)

  • 小型微利企业所得税计算公式2023
  • 暂估入库收到发票后怎么做分录
  • 三证合一后个体户注销流程
  • 企业的净资产包括实收资本吗
  • 增值税专用发票的三流合一是什么意思
  • 预算分配比例与国库不一样
  • 什么叫复式记账凭证
  • 公司广告法违规交不起罚款怎么办
  • 增值税专票未认证丢失怎么办
  • 银行收回贷款本息企业怎么做分录
  • 无形资产摊销的年限规定
  • 劳动仲裁是怎样仲裁公司的
  • 企业税审要钱吗
  • 工程预付款需要监理审批吗
  • 所得减免优惠明细表减免项目包括几项
  • 普通发票和专用发票的税点一样吗
  • 付现金可以开专用发票吗
  • 委托研发受托方怎么做账
  • 土地在会计中怎么处理
  • 进项税转出如何申报纳税
  • 电子普票开具的最新文件
  • 房屋租赁费属于什么服务
  • 期末调汇会计分录
  • 已抵扣原材料进项税额转出完整分录
  • 简单介绍linux
  • windows10如何清理c盘垃圾
  • 福利费用会计分录
  • 国际重复征税的类型及范围
  • 认证未抵扣往哪里记
  • 明股实债和明债实股
  • 安全生产费用怎么支出
  • 在路由器设置中怎么设置
  • desktop病毒
  • WordPress导航菜单权限控制
  • 企业向股东发放现金股利会引起
  • 债务担保是什么意思
  • 用彩泥可以做什么食物?
  • 低值易耗品的三级科目有哪些
  • php artisan key:generate
  • labelme目标检测
  • day03-CSS
  • 微信收款怎么做会计分录
  • 行政事业单位资产管理办法
  • 企业员工福利包括哪些内容
  • mysql版本5.5.x升级到5.6.x步骤分享
  • 销售公司提成表模板
  • 库存暂估入账的会计分录
  • 发票已开款未到的会计分录?
  • 营业利润净利润利润总额的区别
  • 有哪些发票可以报销
  • 春节重要通知发放工资
  • 票已收到、款未付会计分录
  • 滴滴普票可以计算抵扣吗
  • 养老院的账务处理会计实务问答
  • 日记账公式怎么设置
  • Linux服务器中MySQL远程连接的开启方法
  • 彻底删除win8应用商店
  • 从根上保证电脑安全、不中毒的方法
  • xp系统蓝屏解决
  • 如何修改linux系统名称
  • win7怎么连接其他电脑共享的打印机
  • win7未能启动怎么办
  • win10系统家庭版和专业版区别
  • win10如何打开hlp文件
  • 简述javascript中的函数
  • excel文档权限设置
  • nodejs bff
  • Unity3D游戏开发标准教程
  • Python列表list
  • python调用ansible执行playbook
  • 批处理设置ip地址配置的dns
  • 在dos下运行
  • bash shell脚本编程经典实例(第2版)
  • 深入理解javascript
  • 增值税发票综合服务平台登录不了
  • 破产重整期间的税收
  • 白云区嘉禾税务局地址
  • 四川企业退休人员80岁高龄补贴
  • 成都城镇居民社保怎么缴费
  • 企业完税证明怎么查询真伪
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设