计算机图形学
文章平均质量分 92
拳四郎
拳四郎
展开
-
Stencil buffer
模版缓冲(stencil buffer)或印模缓冲,是在OpenGL三维绘图等计算机图像硬件中常见的除颜色缓冲、像素缓冲、深度缓冲之外另一种数据缓冲。词源模版(stencil)是指一种印刷技术,通常以蜡纸或者钢板印刷文字或图形;区别于模板(template),用木板为外形修剪的依据来复制形状;模版(stencil)是指印模,而模板(template)主要是指形模。模版缓冲是以像素为单位的,整数数值的缓冲,通常给每个像素分配一个字节长度的数值。深度缓冲与模版缓冲经常在图形硬件的随机存取内存(RAM)中分享相同原创 2015-06-24 20:40:46 · 11218 阅读 · 0 评论 -
OpenGL进阶(十八) - 从零搭建基于SDL2的GLSL编辑框架
环境:Ubuntu 12.04 64bit编译assimp 版本3.0.1270Assimp(Open Asset Import Library)是一个支持读取多种模型资源的开源库,当前最新的版本是3.0版,支持读取多种类型的3D模型。下载地址:http://sourceforge.net/projects/assimp/files/assimp-3.0/下载的是这个完整的源码包:assimp--原创 2014-03-16 16:33:18 · 9020 阅读 · 7 评论 -
基于Qt的图像处理技术和算法
原文链接: http://developer.nokia.com/community/wiki/Image_editing_techniques_and_algorithms_using_Qt翻译 2014-11-19 17:08:44 · 27336 阅读 · 4 评论 -
空间向量类Vector3的C++实现
double getDree( Node a, Node b ) { //求向量a,b之间的夹角 double c, d; c = a.x*b.x + a.y*b.y + a.z*b.z; d = sqrt(a.x*a.x + a.y*a.y + a.z*a.z) * sqrt(b.x*b.x + b.y*b.y + b.z*b.z); return acos(c/d);}原创 2014-09-02 15:00:44 · 5909 阅读 · 0 评论 -
Real-Time Rendering (10) - 图形硬件及学习小结(Graphics Hardware)
提要 时代在变,硬件也在变,但一些基本的架构其实根本未变,就像计算机发展了这么多年,还是逃不了几百年前图灵机所定下的:存储器;控制器;运算器,输入设备和输出设备。图形硬件也有自己的套路。Buffers and Buffering 缓冲区和缓冲Real time rendering 学习小节 话说我一直认为一个专题至少要写10篇博客才算是有一点自己的东西。原创 2013-12-26 23:22:21 · 7839 阅读 · 7 评论 -
Real-Time Rendering (6) - 多边形技术(Polygonl Techniques)
提要 图形学中呈现多边形的总体目的就是可视精度和速度。精确性是依具体情况而言的,对于机械而言,精确指的是模型的渲染在一定的误差范围;对于一个太空模拟游戏,最重要的是整体的感觉,模型的使用就成了关键。对于一个工程师,他希望每个斜角和倒角都显示清楚,对于游戏,只要足够流畅,一些小差错都是可以容忍的,因为它不一定出现在视线的焦点中,有些模型在下一帧或许就消失了。原创 2013-12-17 17:09:39 · 3889 阅读 · 3 评论 -
Real-Time Rendering (3) - 纹理(Texturing)
在图形学中,Texturing是一个将物体表面绘制上图像或者其他数据的过程。纹理贴图通过修改物体表面的渲染效果,达到一种更加真实渲染的目的。原创 2013-11-09 21:58:42 · 3148 阅读 · 0 评论 -
Real-Time Rendering (4) - 基于图像的绘制(Image-Based Effects)
用多边形来描述3D场景中的物体是最简单的一种方法了,但也有它的局限,有的时候基于图像的渲染(Image-bases rendering),有些场合IBR会更受用一些,它是基于图像数据的渲染。用图像来表示一个物体很大的好处就是效率非常的高,因为只需要处理图像中锁含有的像素就可以了。 很多物体,比如云彩和毛发,很难用多边形来表示。但用半透明的图片就可以很容易做到。原创 2013-12-05 23:38:16 · 6636 阅读 · 0 评论 -
Real-Time Rendering (7) -加速算法(Acceleration Algorithm)
提要 计算机的性能一直是大家关心的,即使在一个相对简单应用中,比如一个打字应用,如果有剩余的性能可以榨取,我们都可以用它来增加新的特性,比如联想拼写,语法检查,抗日锯齿文字显示,语音识别输入等等。 在实时渲染中没我们至少有四个表现上可以去追求的目标:提高帧率,提高渲染的分辨率,实现更加真实的光照和材质,实现更多的细节。60-85的FPS算是够快了。 一些原创 2013-12-20 00:35:13 · 5905 阅读 · 0 评论 -
Real-Time Rendering (8) - 光线求交(Ray intersection)
提要 光线在图形学中可以简单地用向量来表示:r(t) = o +td, o表示光线的出发点,d表示光线的方向,通常是单位向量,r表示光线在t时刻的位置。 光线求交在图形学中有着非常重要的应用,比如Global Illumination,collision detect,更是Ray tracing算法的核心。AABB / k-DOP / OBB AABB的全称是原创 2013-12-21 20:37:29 · 9226 阅读 · 0 评论 -
Real-Time Rendering (5) - 非真实性渲染(Non-Photorealistic Rendering)
提要 真实性渲染追求的是像照片那样的渲染效果,NPR也叫艺术渲染,则有着很多的目的,一种目地就是将模型渲染成技术插图,只有需要的部分才会呈现。一张闪亮的法拉利渲染效果图在向客户销售汽车的时候会很有用,但对于修理汽车引擎的工程师,一副线稿才是更有意义。 另一个NPR的应用领域是模拟绘画效果,比如铅笔,水彩等。这是一个巨大的领域,要获得特别的笔触也会涉及到大量的算法。卡通渲染原创 2013-12-07 11:33:34 · 9376 阅读 · 2 评论 -
OpenGL进阶(十九) - 多光源
从光说起先看一段wiki中对光的定义光是一种人类眼睛可以见的电磁波(可见光谱),视知觉就是对于光的知觉[1]。光只是电磁波谱上的某一段频谱,一般是定义为波长介于400至700纳米(nm)之间的电磁波,也就是波长比紫外线长,比红外线短的电磁波。有些资料来源定义的可见光的波长范围也有不同,较窄的有介于420至680纳米,较宽的有介于380至800纳米。光既是一种高频的电磁波,又是一种由称为光子的基本粒原创 2015-01-16 11:22:56 · 5325 阅读 · 1 评论 -
Real-Time Rendering (2) - 变换和矩阵(Transforms and Matrics)
提要 在图形的计算中,比如旋转、缩放、平移、投影等操作,矩阵都扮演着极其重要的角色,它是操作图元的基本工具。虽然很多的图形API已经封装好了这些矩阵操作,但是理解这些矩阵操作的原理会非常非常有帮助,比如说我们可以通过一些矩阵的快捷计算来加速你的代码。 如果你有一些线性代数的基础,看下面的内容的时候也不会很轻松,因为有点难且比较没意思,如果没有修过这门课,最好把线性代数原创 2013-08-14 22:17:40 · 5738 阅读 · 0 评论 -
局部光照模型及其BRDF
提要常见的光照模型一般包括四个部分ambient, diffuse, specular, 和emitted light. 即:vertex color = ambient + diffuse + specular + emitted light当有多个光源的时候,最后的颜色就是多个结果的叠加。Ambient light:环境光,通常定义在光源的中,注意每个光源的衰减量。Diffuse:漫反射部分,原创 2015-05-28 15:12:08 · 12329 阅读 · 0 评论 -
彻底搞懂四元数
提要旋转的表达方式有很多种,有欧拉角,旋转矩阵,轴角,四元素等等,今天要学习的就是游戏开发中最常用的四元素。从欧拉角和轴向角到四元数在讲四元素之前,我们先来看下简单的欧拉角和轴向角。欧拉角使用最简单的x,y,z值来分别表示在x,y,z轴上的旋转角度,其取值为0-360(或者0-2pi),一般使用roll,pitch,yaw来表示这些分量的旋转值。需要注意的是,这里的旋转是针对世界坐标系说的,这意味原创 2014-09-03 16:55:04 · 102864 阅读 · 11 评论 -
用C++实现一个Quaternion类
提要四元素是游戏开发中常用的用于处理旋转的数学工具,下面就用C++来实现一个四元素类。参考Unity中四元素的接口。如果没有看之前的 彻底搞懂四元数, 建议先看一下。代码清单Quaternion.h#pragma once#include "Vector3.h"#include "Mathf.h"class Quaternion{public: Quaternion(float x,原创 2015-12-24 00:04:15 · 9876 阅读 · 2 评论 -
两天学会DirectX 3D之第二天
提要前几天很简单地跑了一个DirectX 9 程序,以为DirectX就那么绘制,事实证明有点Naive了。之前的那个程序最多也就是个固定流水线的东西。但是今天要用DirectX11来写一个小的框架。龙书就不要看了,看Introduction to 3D GAME PROGRAMMING WITH DIRECTX®11几个重要的类ID3D11Device : 一个虚拟适配器;它被用于运行渲染和创建原创 2015-07-20 00:48:50 · 4090 阅读 · 0 评论 -
Marching squares & Marching cubes
提要Marching squares 主要是用于从一个地图(用二维数组表示)生成轮廓的算法。Marching cubes则对应的是在空间生成网格的方法。最常见的应用就是天气预报中气压图的生成,还常用于随机地形的生成。Marching squares 先说算法步骤。(1) 输入是一个Scalar grid,它是一张二维的表。这张表可以从一张二维图像生成,也可以从高度图生成等等。每个顶点对应一个Sca原创 2015-07-25 12:57:04 · 15648 阅读 · 8 评论 -
基于BRDF的光照模型
知识预备光亮度是物体表面某方向单位投影区域单位立体角的光流量沿着某条光线的光亮度是常数,但光通量随距离增大而衰减(实际是二次衰减,但在计算机图形学中采用线性衰减效果比较好)光强度是单位立体角的辐射能量辐射度是单位面积流出的光通量辐照度是单位面积流入的光通量它们的关系:光强度=光亮度*单位面积*入射角余弦辐照度=光亮度*入射角余弦*单位立体角辐射度=光亮度*入射角余弦*单位立体角(但方向不同)BRD原创 2015-06-19 09:18:55 · 13502 阅读 · 2 评论 -
Shading中的插值技术
在Per Vertex shader中处理着色计算的情况计算出的是每个顶点上shading的结果,通常模型都是由三角面来构成,面上的颜色如何处理,就是今天要探讨的。常用的三种方法是Flat Shading, Gouraud Shading, Phong Shading,对于渲染一个小球,结果对比如下,从左到右依次是Flat Shading, Gouraud Shading, Phong Shading。原创 2015-05-28 23:25:47 · 10129 阅读 · 2 评论 -
OpenGL进阶(十三) - GLSL光照(Lighting)
提要 在上一篇文章中,我们介绍了简单的Shading,同时提出了一个光照模型,模拟了一个点光源,但是,关于光的故事还没有结束... 今天要学习的是方向光源(Directional Light),聚光源(),多光源,影子,面光源。 关于光源的原理及数学描述,请参考:光线追踪(RayTracing)算法理论与实践(三)光照方向光源原创 2013-08-23 21:09:06 · 8243 阅读 · 0 评论 -
Forward Render VS Deferred Rendering
Forward Render传统的渲染方式,你提供给显卡形状Mesh,它将其打散成一堆节点,接着经过一系列的变换和分割成为Fregment或者像素,在呈现在屏幕之前已经完成了所有的渲染处理。这是相当线性的,每一个形状都会在生成完整图像之前经过流水线的每一个阶段。Deferred Rendering中文称为延迟渲染,渲染的工作被放在最后,直到所有的形状到都完成了前面的工作,一旦所有需要的缓冲建好,就原创 2015-04-12 15:14:31 · 11237 阅读 · 0 评论 -
Real-Time Rendering (1) - 渲染管线(Rendering Pipeline)
提要渲染管线是实时渲染中最重要的部分,它的最主要的任务就是在给定一个虚拟的场景,包括相机,object,灯光,纹理等等,生成一副2D的图像。最基础的渲染管线如下图所示:主要的阶段包括三个:Application,Geometry,Rasterizer,每个阶段都可能分成更小的管线,有些小的阶段会并行执行。下面来一个个讨论。The Application St原创 2013-07-29 22:03:46 · 5111 阅读 · 2 评论 -
Real-Time Rendering (9) - 碰撞检测(Collision Detection)
提要 碰撞检测(CD)在很多图形应用中都有着极其重要的角色,CAD/CAM,游戏动画,基于物理的建模,基本上所有的虚拟现实模拟都会用到, 我们常说的CD其实指的是Collision handling,可以分为三个部分:Collision detection,Collision determination,Collision response。Collision detecti原创 2013-12-25 21:12:48 · 6103 阅读 · 1 评论 -
OpenGL进阶(六)-粒子系统
一、提要 有一款例子特效软件叫做particle illution,在影视后期和游戏制作领域都可以用到,相信很多人都接触过,今天我们用SDL+OpenGL来实现例子效果。确保你搞定了物理模拟的代码! 代码下载二、原理简介 所谓的例子系统,就是同时控制一大堆类似的对象,这些对象可能是形体,可能是图片,有着不同的特征(寿命,速度,位置)。有了之前的基础,我们原创 2012-12-22 20:55:25 · 10247 阅读 · 1 评论 -
光线追踪(RayTracing)算法理论与实践(一)入门
提要本文先介绍光线追踪的理论,然后着重一步一步来搭建渲染场景,从最基本的向量类开始.采用的语言是c++,利用面向对象的思想,一些基础的线性代数和空间几何的知识也会用到,编程的框架用的是GLFW,渲染用到的是OpenGL。原理光线追踪,简单地说,就是从摄影机的位置,通过影像平面上的像素位置(比较正确的说法是取样(sampling)位置),发射一束光线到场景,求光线和几何图形间最近原创 2012-11-13 17:46:47 · 30711 阅读 · 8 评论 -
OpenGL进阶(十) - obj文件的导入
Obj文件简介 OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式,很适合用于3D软件模型之间的互导,也可以通过Maya读写。比如你在3dsMax或LightWave中建了一个模型,想把它调到Maya里面渲染或动画,导出OBJ文件就是一种很好的选择。目前几乎所有知名的3D软原创 2013-08-02 11:06:23 · 19264 阅读 · 5 评论 -
OpenGL进阶(二) - 自定义矩阵加载
opengl里面的平移,旋转,缩放都是基于矩阵的运算,我们可以很方便地通过设定参数的方式调用一些接口函数来实现,同时我们也可以通过自定义的矩阵来实现上述的基本变换。首先来看一个渲染程序。GLfloat rtri; GLfloat posX;GLfloat posY;GLfloat scale=0.5f;void render原创 2012-12-12 01:19:03 · 5036 阅读 · 1 评论 -
OpenGL进阶(一) - 多视口
提要OpenGL视口(Viewport)可以看作是窗口中OpenGL的绘制输出区域,可以通过一条简单的glViewport命令设置。一般的OpenGL教程都是单视口,即整个窗口为惟一的一个视口,Nehe的OpenGL教程是我最早见到涉及多视口的。与单视口程序相比,多视口程序的变化主要是:(一)多视口程序不能在窗口resize/reshape时直接调用glViewport,而应该在此时记原创 2012-12-07 20:25:33 · 13798 阅读 · 7 评论 -
Interactive 3D Graphics-Lesson4 Problem Set
第四课讲的是变换,还有坐标系之类的,不是很深。第四课的Problem set记录。1.机器人手臂要求是添加机器人手臂的底座,只要理解好THREE.Object3D()就可以了。参考一下原有的代码就可以得到结果。/////////////////////////////////////////////////////////////////////////////////*glob原创 2013-05-07 16:06:45 · 1979 阅读 · 0 评论 -
Interactive 3D Graphics-Lesson3 Notes
公开课的一些笔记。三种着色方式flat shading: 三角形的顶点没有法向量,三角形整个面才有法向量,打光时整个三角形只呈现一种颜色。Gouraud shading: 三角形的顶点都有各自的法向量,打光时三个顶点有各自的颜色,接着做双线性内插 (bilinear interpolation)来求得颜色,使整个三角形有渐层的颜色变化。Phong shading: 三角形的顶点都有原创 2013-05-05 20:52:16 · 2249 阅读 · 0 评论 -
Interactive 3D Graphics-Lesson2 Problem Set
Interactive 3D Graphics是Udacity上的一门图形学公开课(需要翻墙),最近在学习,在这里记录一下课程的学习进度和作业的答案。多边形的三角形划分由于在图形学中,面的表示通常是用三角形来表示,所以要显示多边形的时候,就要将其碎片化。/////////////////////////////////////////////////////////////原创 2013-04-15 19:59:35 · 2776 阅读 · 0 评论 -
OpenGL进阶(四)-用参数方程绘制椭球体
首先参考这篇文章绘制一个球体:OpenGL 用参数方程绘制球我们知道球体的参数方程是这样的:x=r·sin(α)·cos(β)y=r·sin(α)·sin(β)z=r·cos(α)椭圆的参数方程是:x=rx·sin(α)·cos(β)y=ry·sin(α)·sin(β)z=rz·cos(α)在这个基础上进行一些修改就可以实现椭圆的绘制了!代码实现如下原创 2012-12-20 18:21:52 · 12274 阅读 · 3 评论 -
OpenGL进阶(七)-康托尔集 谢尔宾斯基地毯 Koch雪花
这一篇关于分形图像,当然只是入门。分形通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。分形有几种类型,可以分别依据表现出的精确自相似性、半自相似性和统计自相似性来定义。虽然分形是一个数学构造,它们同样可以在自然界中被找到,这使得它们被划入艺术作品的范畴。之前有做过一个镂垫的程序,今天要做的是康托集,谢尔宾斯基原创 2012-12-29 12:10:43 · 7197 阅读 · 0 评论 -
光线追踪(RayTracing)算法理论与实践(三)光照
提要经过之前的学习,我们已经可以在利用光线追踪实现一些简单的场景。今天我们要探讨的是图形学里面的三种基本光源:方向光源,点光源,聚光灯。不同于利用现成的Api,这次会从理论到实际一步步用C++实现。前提工作在老师的建议下,我将图形引擎换成了SDL,最终的渲染效果比之前的好了很多,原来的GLFW虽然能够很好的兼容OpenGL,但并没提供对像素的控制,而SDL有Surface。原创 2012-12-05 00:09:48 · 11719 阅读 · 1 评论 -
光线追踪(RayTracing)算法理论与实践(二)平面、材质、联合光线与物体求交
提要经过上次的学习,我们已经可以建立一个简单的光线追踪的场景,接下来,我们继续我们的征程。今天要得到的最终效果如下:平面平面在空间几何中可以用一个向量(法向量)和平面中的一点P0来表示。平面就是满足下式的点集:n.(P-P0)=0得到:n.P=d;d=n.P0;则平面类我们就可以用代码这样来描述:#ifndef Plane_H#define Pla原创 2012-11-17 20:34:30 · 9875 阅读 · 4 评论 -
Window7下手动编译最新版的PCL库
PCL简介PCL是Point Cloud Library的缩写,是一个用于处理二维图像,三维深度图像和三维点云的C++库。该库是完全开源的,可免费用于商业和学术研究。官方网站:http://pointclouds.org/PCL的用途:下面对最新版的PCL库进行 编译。环境:windows7 32bitVS2010cmake2.8Tortoise原创 2013-07-29 19:09:45 · 6931 阅读 · 3 评论 -
OpenGL进阶(十七) - 深入理解OpenGL
翻译自《 OpenGL Programming Guide》(8th) 第一章,标题为 Introduction to OpenGL。红宝书第八版和第七版的最大的区别就是OpenGL的版本从OpenGL2.X变成了OpenGL4.X,渲染流水线也从固定流水变化为可编程流水线,shader满天飞...好,进入正文。此文主要内容如下:1.介绍OpenGL的作用,告诉你OpenGL在计算机图形学中能做原创 2014-03-03 00:36:57 · 9190 阅读 · 7 评论 -
OpenGL进阶(十五) - 弹簧质点系统(Mass Spring Systems)
简介 一个模拟变形物体最简单额方法就是将其表示为弹簧质点系统(Mass Spring Systems),因为方法简单,这个框架对于学习物理模拟和时间积分的各种技术都比较理想。一个弹簧质点包含了一系列由多个弹簧连接起来的质点,这样的系统的物理属性非常直接,模拟程序也很容易编写。 但是简单是有代价了:1.物体的行为依赖于弹簧系统的设置方法;2.很难通过调整弹簧系数来得到想要的结果;原创 2013-11-13 20:36:29 · 18779 阅读 · 14 评论 -
OpenGL进阶(十六) - GLSL纹理(Texture)
提要 纹理是实时渲染中的非常基础且非常重要的一个主题,它一直作为增强渲染效果的一个强有力手段。在固定渲染管线的opengl中,纹理的使用灵活度非常有限,有了shader之后,我们可以在shader中操作纹理,这时就可以用一些额外的渲染参数来渲染纹理,比如位移图(displacement maps),法向量(normal vectors)等等。 实际上在OpenGL原创 2013-11-24 11:02:46 · 14223 阅读 · 1 评论