Study-OpenGL
文章平均质量分 67
OpenGL学习系列的主要内容是在Qt5.6.x上学习OpenGL,不仅编程示例,同时学习理论知识。为了避免Visual Studio有点麻烦的环境配置,使用qmake创建项目文件,只需下载源代码就能跨平台运行。
阿兵-AI医疗
这个作者很懒,什么都没留下…
展开
-
half-angle slicing半角切片技术
体渲染(volume rendering)算法包括ray casting、Texture-based technique等。今天介绍Texture-based technique里的half-angle slicing技术。首先理解阴影的本质,光照被其他体素遮挡了。网上的代码有误,修正后代码在。原创 2024-01-06 14:21:17 · 564 阅读 · 0 评论 -
3.2.1 体渲染之Ray Casting
基本概念光线投射方法是基于图像序列的直接体绘制算法。从图像的每一个像素,沿固定方向(通常是视线方向)发射一条光线,光线穿越整个图像序列,并在这个过程中,对图像序列进行采样获取颜色信息,同时依据光线吸收模型将颜色值进行累加,直至光线穿越整个图像序列,最后得到的颜色值就是渲染图像的颜色。为什么在上面的定义是穿越 “ 图像序列 ” ,而不是直接使用 “ 体纹理 ” ?原因在于,体数据有多种组织形式,在基于 CPU 的高级语言编程中,有时并不使用体纹理,而是使用图像序列。在基于 GPU 的着色程序中,则必须使用原创 2021-05-23 10:05:40 · 2188 阅读 · 1 评论 -
OpenGL学习系列导航
简介 OpenGL学习系列是《计算机图形学(第四版)》、《OpenGL编程指南(原书第8版)》、《C++ GUI Qt4编程(第二版)》以及网络资源的学习笔记。主要内容是在Qt5.6.x上学习OpenGL,不仅编程示例,同时学习理论知识。为了避免Visual Studio有点麻烦的环境配置,使用qmake创建项目文件,只需下载源代码就能跨平台运行。 代码下载地址:https://githu...原创 2017-12-17 11:42:00 · 1558 阅读 · 2 评论 -
t0.0计算机图形学介绍
计算机图形学 计算机图形学(Computer Graphic, CG)是研究如何利用计算机算法来生成、处理和显示图形的一门学科,主要的算法包括:基于光栅扫描显示器的基本图形的扫描转换原理;基于齐次坐标的二维、三维变换矩阵的几何变换原理;基于像空间和物空间的三维实体动态消隐原理;基于颜色模型、光照模型和纹理映射技术的真实感图形显示原理。简单来说,计算机图形是计算机产生的图像。...原创 2016-11-05 23:27:14 · 722 阅读 · 0 评论 -
t0.1OpenGL绘图入门
OpenGL库 像许多学科一样,通过练习可以很快地掌握计算机图形学,练习利用OpenGL编写和测试生成各种不同图形的程序。 选择OpenGL,是因为其跨平台特性。首先介绍四种主要的OpenGL库1、基本GL库:OpenGL库的基础。它提供了OpenGL的基本函数。每个OpenGL函数都是以字符GL开头。2、GLUT库:GL实用工具包(the GL Utility Tookit)...原创 2016-11-16 21:51:01 · 3429 阅读 · 0 评论 -
t0.2 VS2015配置OpenGL编程环境
一、配置环境我们需要做的准备工作:安装好VS2015 下载OpenGL需要的库:GLUT库Windows环境下的GLUT下载地址:(大小约为150k)http://www.opengl.org/resources/libraries/glut/glutdlls37beta.ziphttps://www.opengl.org/resources/libraries/glut/...原创 2016-11-13 19:56:38 · 567 阅读 · 0 评论 -
t0.3VS2013配置OpenGL4.3及以上编程环境
学习OpenGL,首先得配置编程环境。由于Windows系统只自带OpenGL1.0版型,要学习4.3版以上的OpenGL就需要配置编程环境。分享我的配置方法,希望对大家有用。我的环境是:Win7 64位系统,VS2013,配置流程大同小异。一、准备工作1、工具下载和安装1、安装VS2013和支持VS2013的CMake2、下载freeglut(glew-2.0.0-win32.zip和glew-2原创 2017-02-26 22:59:29 · 2784 阅读 · 0 评论 -
t1.笛卡尔坐标系统
笛卡尔坐标小时候我们用的坐标系就是笛卡尔坐标系。下图是2维笛卡尔坐标系。 从二维到三维,增加一个z轴。如下图。 右手坐标系和左手坐标系左手坐标系和右手坐标系,是图形开发或游戏开发的基础知识。左手坐标系是X轴向右,Y轴向上,Z轴向前,右手坐标系的Z轴正好相反。叉乘的右手定则是用来确定叉乘积的方向的。如: c=aXb。右手展开,四指与向量a的方向一样,然后,弯曲四指后与向量b的...原创 2018-09-09 21:47:28 · 654 阅读 · 0 评论 -
t2.1雾化
基本概念 现实中,光线 被空气中无数粒子反射与折射。如果单位体积内粒子的浓度足够,则它们是可见的,例如烟、灰尘、雾等。计算机图形中,上述现象都是通过雾化技术加以模拟的。 想象我们正在注视远处的物体,眼睛与物体间的光线受到大量粒子的扰动。一些原来直线传播无法进入眼睛的光线,被那些粒子反射进入眼睛,这就是我们“看到”空气中粒子的原因。最后的视觉效果上,物体的颜色向雾的颜色偏移,粒子越多,偏...原创 2018-09-09 21:40:55 · 432 阅读 · 0 评论 -
t2.0光照模型
基本概念 学习《3D数学基础:图形与游戏开发》(美)Fletcher Dunn ,Ina Parberry著 15.4节的笔记。对计算机图形中,光照模型多了一份理解。 这里无法详尽讨论光照这样复杂而丰富的主题,几乎是不可能的。我们甚至连不同的光照计算都难以一一述及;它们中的每一个都有大部头的著作来描述。这里主要讨论大多数API(OpenGL和DirectX)中的“标准”光照模型。...原创 2018-09-09 22:16:03 · 474 阅读 · 0 评论 -
1.OpenGL学习之建立窗口
使用OpenGL绘图 OpenGL是绘制三维图形的标准API。从Qt5开始,OpenGL不再是单独模块,而作为Qt GUI核心的一部分。OpenGL本身只提供平台无关的画图功能,而不包含特定平台的窗口处理功能。QGLWidget类可以通过对它的子类化,并使用OpenGL命令开发自己的窗口部件。建立OpenGL窗口 QGLWidget类提供了三个方便的纯虚函数,可以在子类中重新实现来绘制三维图形。原创 2017-12-04 14:49:22 · 918 阅读 · 0 评论 -
2.OpenGL学习之基本图元
基本图元 在OpenGL中,基本图形元素如点、线、折线和多边形都是由一个或多个顶点所定义。这些顶点必须处于glBegin()和glEnd()函数之间。glBegin()的参数确定要画的对象,指示OpenGL开始收集绘制对象的元素数据,glEnd()函数命令结束并完成对象的元素列表,并将所有数据送到OpenGL图形绘制管道中进行绘制。例如glBegin(GL_POINTS); glV原创 2017-12-04 15:13:20 · 2357 阅读 · 0 评论 -
3.OpenGL学习之图元属性
OpenGL状态变量 属性值和其他参数设置由定义当前OpenGL状态的独立函数指定。OpenGL中的状态变量由颜色和其他图元属性、当前矩阵模式、模型观察矩阵的元素、缓存当前位置和场景光照效果参数等。所有OpenGL参数都有默认值,它们在被指定新值前保持不变并发挥作用。任何时候我们都可以查询系统状态参数的当前值。 OpenGL的所有图元使用当前状态表中的属性显示。改变一个或几个属性设定只能影原创 2017-12-04 17:59:55 · 737 阅读 · 0 评论 -
4.OpenGL学习之几何变换
几何变换 应用于对象几何描述并改变它的位置、方向或大小的操作成为几何变换(geometric transformation)。一个三维位置在齐次坐标中表示为四元列向量。因此,每一次几何变换操作表示成一个从左边去乘坐标向量的4*4矩阵。 在三维齐次坐标表示中,任意点P=(x,y,z)经过几何变换到位置P‘ 其中: 几何变换函数 在OpenGL的核心库中,每一种基本的几何变换都有一个独立的函数原创 2017-12-05 09:32:02 · 915 阅读 · 0 评论 -
5.OpenGL学习之纹理映射
纹理映射 一个常用的添加表面细节的方法是将纹理模式映射到对象表面上。纹理模式可以由一个矩形数组进行定义,也可以用一个修改对象表面光强度值的过程来定义,这个方法 称为纹理映射,而纹理可以定义成一维、二维或三维图案。任意纹理描述称为纹理空间,用0到1.0范围的纹理坐标来表示。纹理图案1、一维图案 一维纹理图案可以用颜色值的单足码数组指定,用来定义线性纹理空间的一系列颜色。例如,可以用足码为0到95的原创 2017-12-17 11:57:22 · 801 阅读 · 0 评论 -
6.OpenGL学习之多个纹理映射
纹理基础 在纹理之间进行切换或者重新加载不同的纹理图像可能会是开销非常大的操作。纹理对象允许我们一次加载一个以上的纹理 状态(包括纹理图像),以及在它们之间进行快速切换。纹理状态是由当前绑定的纹理对象维护的,而纹理对象是由一个无符号整数标识的。void glGenTextures(GLsizei n, GLuint *textures);在这个函数中,我们可以指定纹理对象的数量和...原创 2018-01-06 11:47:27 · 4145 阅读 · 0 评论 -
7.OpenGL学习之三维观察
三维观察如果对比纹理映射和以前的代码,发现多了调用gluLookAt方法语句,如下图所示。 如果没有这条语句,窗口里什么都没有。这其中涉及到三维观察或者变换管线,而三维观察的设置在OpenGL编程中非常重要的。变换管线的处理流程如下图。 类比到我们现实生活 理解上图的意思。如果我们要观察一个物体,我们可以从不同的位置去观察它(视图变换);移动或者旋转它(模型变换);如果把物体画下来原创 2018-01-14 12:59:38 · 4096 阅读 · 2 评论 -
8.OpenGL学习之颜色混合
颜色混合 通常情况下OpenGL渲染时会把颜色值放在颜色缓冲区中。每个片段的深度值也是放在深度缓冲区中的。当深度测试被关闭(禁用)时,新的颜色值简单得覆盖颜色缓冲区中已经存在的其他值。当深度测试被打开(启用)时,新的颜色片段只有当它们比原来的值更接近邻近的裁剪平面时才会替换原来的颜色片段。在正常情况下,任何绘制不是被完全丢弃,就是完全覆盖原来的颜色值,这取决于深度测试的结果。如果打开了Ope原创 2018-01-07 15:40:43 · 663 阅读 · 0 评论 -
9.OpenGL学习之光照模型
光照模型 如果我们希望渲染出的物体像是处于有若干光源照明的场景中。根据物体表面性质和光源的位置,每个物体不同的部分反射光的多少也不同。光照模型(lighting model)就是试图描述光源发出的光线和场景中的物体是如何相互作用。现实世界的光照过程是无法精确模拟,需要计算机近似处理。OpenGL把现实世界的光照系统近似分为三个部分:光源、材质和光照环境。光源 OpenGL提供了原创 2018-01-20 11:45:26 · 1408 阅读 · 0 评论 -
s0.GLSL学习之初识OpenGL着色语言
OpenGL渲染流水线1、固定功能渲染流水线 以前OpenGL对程序员提出的各种绘制图元或者属性的请求都采用固定的方式来处理。这种实现方式称为固定功能渲染流水线(fixed-function rendering pipeline)。也是前面一段时间我们学习的OpenGL流水线的实现方式。实现OpenGL最初的内部流程是一组有序的处理步骤,如下: 流水线阶段是固定的,它们无论原创 2018-02-04 22:36:07 · 491 阅读 · 0 评论 -
s1.GLSL学习之建立窗口
QOpenGLWidget 依旧从最简单的建立窗口开始。从Qt5.4开始,Qt推荐使用QOpenGLWidget,它将替代我们之前使用的QGLWidget。和QGLWidget一样,QOpenGLWidget提供了三个方便的虚函数,我们可以在子类中实现它们。 - paintGL() - 渲染OpenGL场景。每次窗口部件更新时调用。 - resizeGL() - 设置OpenGL视口原创 2018-02-03 20:10:42 · 463 阅读 · 0 评论 -
s2.GLSL学习之绘制三角形
主要内容 本文主要内容:实现《OpenGL编程指南(原书第8版)》第一章中渲染两个蓝色三角形示例。通过该示例,介绍GLSL编程的一般步骤。为了便于学习,没有新建用来保存着色器代码的文件triangles.vert和triangles.frag,而是用常量字符串直接表示;同时没有使用书中提到的LoadShaders类,而是将其中用到的代码在MyQGLWidget 类中实现。自己第一次看红宝书第原创 2018-02-04 21:54:54 · 1242 阅读 · 0 评论 -
s3.GLSL学习之着色器基础
着色器 着色器程序看起来确实和C语言非常类似,它们从入口点main函数开始,并且使用同样的字符集和注释约定,以及很多相同的处理指令。着色器是运行在GPU上的小程序。这些小程序为图形渲染管线的一个特定部分而运行。从基本意义上来说,着色器不是别的,只是一种把输入转化为输出的程序。着色器也是一种相当独立的程序,它们不能相互通信;只能通过输入和输出的方式来进行沟通。着色器的开头总是要声明版本,...原创 2018-02-20 18:50:41 · 534 阅读 · 0 评论 -
s4.GLSL学习之图元类型
图元类型 OpenGL的主要作用就是讲图形渲染到帧缓冲当中。为了实现这一要求,需要将复杂的物体分解成图元的形式(包括点、线、以及三角形),当它们的分布密度足够高时,就可以表达为2D以及3D物体的形态。OpenGL可以支持很多种不同的图元类型。不过它们最后都可以归结为三种类型的一种,即点、线或者三角形。线和三角形图元类型可以再组合为条带、循环体(线),或扇面(三角形)。这些图元类型通过Ope...原创 2018-03-11 21:52:00 · 626 阅读 · 0 评论 -
s5.GLSL学习之坐标系统变换
之前在OpenGL学习之三维观察中,介绍过视图变换。不过,《OpenGL编程指南(原书第8版)》这本书第五章用相机拍摄来类比视图变换操作比较形象,这里就做个笔记。相机模型 常见的视图变换操作可以类比为使用照相机拍摄照片过程,如图所示,使用相机的主要步骤列举如下: 将相机移动到准备拍摄的位置,将它对准某个方向(视图变换,view transform)。将准备拍摄的对象移...原创 2018-03-11 21:15:13 · 1651 阅读 · 0 评论 -
s6.GLSL学习之纹理映射(三角形)
纹理 通常来讲,计算机图像学的目标是决定组成图像的每个 部分的颜色。用高级着色算法计算像素的颜色是可能的,但这样的着色器的复杂度是很大的,以至于实现这样的方法是不实际的。因此,可以依赖纹理——大块的图像数据来绘制物体的表面使它们看起来更逼真。 这里面包含很多内容,比如OpenGL中的高级纹理类型,包括数组纹理、立方体映射纹理、深度纹理和缓存纹理。这里先只介绍如何在应用程序中使用纹理映射...原创 2018-03-11 20:16:39 · 1382 阅读 · 0 评论 -
s7.GLSL学习之纹理映射(多个纹理)
多个纹理 前一篇是一个简单的纹理应用,在片元着色器中没有为采样器设置值,这是因为只使用一个纹理。实际上,OpenGL同时支持多个纹理, 比如支持每个着色器阶段至少16个纹理,再乘以OpenGL支持的着色器阶段数目,最后结果是80个纹理。实际上,OpenGL有80个纹理单元,名字为GL_TEXTURE0到GL_TEXTURE79。当纹理函数,例如调用glBindTexture()的时候,它操作...原创 2018-03-18 20:36:07 · 1932 阅读 · 0 评论