算法相关技术专家
原帖地址 http://ogldev.atspace.co.uk/www/tutorial19/tutorial19.html 最初我们计算环境光的时候,唯一影响光照的就是光的强度,接着在漫反射光计算时,我们引入了光源的方向以及物体顶点法线的概念,在本篇教程中,我们学习如何计算高光,我们会再次引入一个新的参数视点位置,因为高光会随着视点的移动而改变位置。
原帖地址:http://ogldev.atspace.co.uk/www/tutorial18/tutorial18.html 环境光和漫反射光最大的区别在于:漫反射光依赖于光源的方向,而环境光和光源方向完全无关,环境光在场景中是均匀分布的,对场景中的所有物体都有效,而漫反射光在物体朝向光源的一面才有光照效果,在背面则没有光照效果。
原帖地址:http://ogldev.atspace.co.uk/www/tutorial17/tutorial17.html 在3D真实感图形学中,光照是很重要的技术。从物理上讲,一束光是由很多细小的粒子“光子”组成,这些光子在空气中传输,在物体的表面折射,反射,最终进入我的视觉系统,形成了我们眼中看到的真实世界。
原帖地址:http://ogldev.atspace.co.uk/www/tutorial16/tutorial16.html 纹理映射意思就是把图片(或者说纹理)映射到3D模型的一个或多个面上。
1. 删除空行 : g/^$/d 2. 删除行首/行尾空格 删除行首空格:%s/^\s\+// 删除行尾空格:%s/\s\+$// "%":作用于整个文件; "\s\+$":表示行末($)前的一个或者多个(\+)空格(\s); "^\s\+":行首(^)的一个或者多个(...
一些有用的awk统计命令: 1.取范围内的内容 echo "ddd#fk*ll" | awk -F'[#*]' '{print $2}' 结果: fk echo "ddd#fk*ll" | awk -F'[#*]' '{print $1}' 结果: ddd 说明: #*中间的部分为$2, $1为#前面的部分,$3为*后的部分 2.
原帖地址:http://ogldev.atspace.co.uk/www/tutorial15/tutorial15.html 本篇教程中,我们将实现鼠标控制摄像机的方位。摄像机可以有多个自由度(所谓自由度,是指沿着某个方向的移动或旋转等操作,通常一个自由度用一个参数表示),不同的应用所需要的摄像机模式不同,所需要的自由度也不同,比如第一人称射击游戏和普通RPG游戏摄像机模式就不同。
原帖地址:http://ogldev.atspace.co.uk/www/tutorial14/tutorial14.html 前面一篇教程中,我们把摄像机放在三维空间的固定位置,本章我们尝试控制摄像机,在三维空间任意方向移动它。
原帖地址:http://ogldev.atspace.co.uk/www/tutorial13/tutorial13.html 在前面的教程中,我们都是默认摄像机坐标在三维坐标的原点,本篇教程我们开始讨论把摄像机放在三维空间的任意位置,从而更方便的从不同视角观察物体。
原帖地址:http://ogldev.atspace.co.uk/www/tutorial12/tutorial12.html 现在我们开始学习如何把三维物体投影到二维平面上,同时保持它的深度。
原帖地址:http://ogldev.atspace.co.uk/www/tutorial11/tutorial11.html 在前面的教程中,我们通过矩阵变化实现了物体在三维空间的平移、旋转、缩放操作。
原帖地址:http://ogldev.atspace.co.uk/www/tutorial10/tutorial10.html OpenGL提供了几个draw函数: 之前用的 glDrawArrays() 称作ordered draws(顺序的draw调用),如果指定draw体元为线,则顶点缓冲中按排列顺序,每2个顶点解释为线,如果体元为三角形,每三个顶点解释为三角形,在这里并没有共享的概念,比如要渲染一个四边形,就要画2个三角形,需要6个顶点。
原帖地址:http://ogldev.atspace.co.uk/www/tutorial09/tutorial09.html 本章我们了解3D管线的一个重要特性,在光栅化阶段的顶点属性插值。
原帖地址:http://ogldev.atspace.co.uk/www/tutorial08/tutorial08.html 缩放矩阵比较简单,它的目的就是在三个轴(x,y,z)方向,对物体长度进行缩放(或者说,对顶点在三个轴的分量进行缩放),当然也可以选择某个轴方向来缩放。
原帖地址:http://ogldev.atspace.co.uk/www/tutorial07/tutorial07.html 本章我们来学习一下,物体的旋转。所谓旋转,就是一个点,绕某个固定的轴转动一定的角度。
原文地址:http://ogldev.atspace.co.uk/www/tutorial03/tutorial03.html 本教程内容很少,主要是在教程2基础上渲染一个三角形。
在D3D10/11中,有D3D10_QUERY/D3D11_QUERY接口,通过QUERY接口,我们可以查询GPU的一些状态,比如GPU的时间戳信息(Timestamp)[这个常用来做performance分析],或者遮挡查询信息等等。
在前面的教程中,我们都是通过在ModelClass中直接产生顶点和索引数据,简单的三角形,立方体等等还好说,毕竟比较简单,如何显示复杂的三维物体呢?特别是利用已有的3D文件,比如obj, 3ds, md2, x等格式的文件,这时,就要利用这些3D格式的解析器,本教程中,我们利用Open Asset Import Library库,来显示各种格式的3D文件(动画文件,暂时不考虑,只考虑静态的3D文件)。
在D3D10中,通过ID3DX10Font接口对象,我们可以方便的在屏幕上输出文字信息,一个DrawText函数就能解决所有问题,但在D3D11中个,这个变得超级麻烦,因为微软移除了Font接口,要在屏幕上输出文本,用户需要做很多事情。
原帖地址:http://technet.microsoft.com/zh-cn/library/ee921514.aspx 如现在大家所想的那样, Windows7 其实是 Windows Vista 的改进版。
把物体从世界坐标系转化到视点坐标系的矩阵称为视图矩阵。 下面我们先看下OpenGL中视图矩阵的推导过程: 假设视点或camera的局部坐标系为UVN,UVN分别指向右方、上方和后方从而构成右手坐标系,视点则处于局部坐标系的原点位置。
在3D渲染中,输入数据是一些primitive信息,包括顶点位置、颜色、纹理坐标等等。在光栅化阶段,primitive(一般为三角形)被转化成一系列的fragment(或者称为像素),这些fragment接下来要做ps操作,此时每个fragment都有位置、颜色、纹理坐标这些属性信息,这些属性信息通过顶点属性用插值方法得到的。
原帖地址:http://blog.csdn.net/popy007/article/details/4091967 上一篇文章中我们讨论了透视投影变换的原理,分析了OpenGL所使用的透视投影矩阵的生成方法。
原帖地址: http://blog.csdn.net/popy007/article/details/1797121 透视投影是3D流水线的重要组成部分,它将视点空间中的点从视锥体(Frustum)变换到规则观察体( 裁剪空间),待裁剪完毕后再进行透视除法,此时规则观察体则成为归一化的规则观察体,然后归一化规则观察体中的XY平面进行视口映射,映射到屏幕空间,Z坐标则放入depth buffer中,然后再进行三角形的光栅化操作。
本篇教程中,我们学习一下如何用opencl有效实现数组求和,也就是通常所说的reduction问题。 在程序中,我们设置workgroup size为256,kernel的输入、输出缓冲参数都用uint4的格式,这样我们原始求和的数组大小为256*4的倍数,数据类型为uint。
五 、EQAA/CSAA EQAA(enhanced quality AA)和CSAA(coverage sample AA)其实是同样的采样技术,EQAA是AMD的实现,CSAA是NV的实现,下面我以EQAA为例看看这两种AA的原理: 在MSAA中,每个采样都有一个sample color缓冲相对应,这样在AA数目比较大的时候,比如16XMSAA,对memory的需求很大,为了节省内存带宽,就出现了EQAA/CSAA这些基于覆盖采样(coverage sample)的AA技术。
三、SSAA(super-sampling anti-aliasing) SSAA最初的思路是先上采样渲染图像,然后再下采样输出图像,比如我们要渲染输出一个256*256的图像,可以设置color buffer为512*512(4倍的SSAA),这个时候我们的ps需要执行512*512个thread,同时深度模版测试也要进行512*512次,最后把4倍的color buffer resolve成256*256,就是4个像素取平局值,得到最终的图像。
在篇日志中,我们学习一下在D3D11中,如何启用aa(反锯齿)功能,提高渲染质量,并了解一下硬件反锯齿的原理。首先我们先回顾一下采样和滤波的概念,然后了解在D3D11中,如何启用aa(anti-aliasing)功能,最后是SSAA/MSAA/EQAA/CSAA几种硬件aa的原理。
参考资料:http://www.anandtech.com/show/3851/everything-you-always-wanted-to-know-about-sdram-memory-but-were-afraid-to-ask SDRAM(Synchronous dynamic random access memory),同步动态随机访问内存,通常包括 SDR (Single Data Rate) SDRAMs以及DDR (Double Data Rate) SDRAMs.在显卡中常用的是GDDR SDRAMs以及HBM。
本章学习一下在opencl中如何实现矩阵的转置,主要的技巧还是利用好local memory,防止bank conflit以及使得全局memory的读写尽量是合并(coalensing)读写。
原帖地址:http://ogldev.atspace.co.uk/www/tutorial06/tutorial06.html 在这篇教程中,我们开始对三维物体进行位置变化操作,比如平移、旋转、缩放等等。
原帖地址:http://ogldev.atspace.co.uk/www/tutorial05/tutorial05.html 在这篇教程中,我们将接触到一种新的shader变量uniform variables,这种变量和属性变量的区别:属性变量是指每个顶点shader调用时,都会根据属性的位置从顶点缓冲中装入该顶点的相应属性值,而uniform变量,则对每个draw调用保持不变,这意味着你在draw调用前装入该变量,然后draw中每个顶点shader执行时,都能访问该变量,而且该变量值会保持不变。
原帖地址:http://ogldev.atspace.co.uk/www/tutorial04/tutorial04.html 本章开始学习shader的使用,以前大家常使用OpenGL固定管线来做一些程序,shader相对来说使用较少,而现代gpu编程,shader应用少不了,虽然使用shader编程,代码多一点,但是却更灵活。
在OpenCL编程中,特别是基于GPU的opencl的编程,提高程序性能最主要的方法就是想法提高memory的利用率,它主要包括两方面的优化:一方面是提高global memory的合并读写效率,另一方面就是减少local memory的bank conflict。
原帖地址:http://windrocblog.sinaapp.com/?p=486 图像处理中,图片像素点单通道值一般是[0-255]的unsigned char类型,将其转化到[0,1]之间,更方便计算,这就需要用到矩阵的归一化运算。
原文地址:http://ogldev.atspace.co.uk/www/tutorial02/tutorial02.html 通常在写OpenGL程序时候,我们都需要glew库,该库包装了OpenGL的各种扩展,便于我们使用。
本章教程内容主要来自:http://ogldev.atspace.co.uk/www/tutorial01/tutorial01.html 使用OpenGL之前,请先安装和设置好FreeGlut和glew, 下载地址: http://freeglut.
现在我们利用上一篇教程的方法,来统计一副RGBA图像中有多少个像素点(该像素点满足R, G, B, A任意分量>=5)。我考虑的方法是建立256 bin的直方图,对于一个像素,求max(R, G,B,A),用该值决定该像素点进入那个bin,这样求出直方图后,width*height - hostBin[0] - hostBin[1] - hostBin[2] - hostBin[3] - hostBin[4],即为我们要的结果。
histogram翻译成中文就是直方图,在计算机图像处理和视觉技术中,通常用histogram来进行图像匹配,从而完成track,比如meanshift跟踪算法中,经常要用到图像的直方图。 灰度图的histogram计算,首先要选择bin(中文可以称作槽)的数量,对于灰度图,像素的范围通常是[0-255],所以bin的数目就是256,然后我们循环整幅图像,统计出每种像素值出现的次数,放到对应的bin中。
原帖地址:http://shijuanfeng.blogbus.com/logs/206701809.html opencv中的多维数组——MatND的用法,因为直方图就是多维数组,所以了解一下它的基本用法,仅做收藏。
在C++模式设计中,常用的一种模式设计方法就是监听者-观察者模式。每个监听者对象都把自己理解的事件注册到一个中心事件处理注册库,接收到消息后,中心事件处理注册库会把该消息分发到每个监听者对象。
在本教程中,我们学习用opencl进行简单的图像处理,对一个图片进行旋转。图片读入、保存等工作,我们使用开源的FreeImage,下载地址:http://freeimage.sourceforge.net/ 首先我们建立一个gFreeImage类,用来装入图像,该类主要调用FreeImage的函数,首先会初始化FreeImage库,然后根据文件名猜测图像文件格式,最终load图像文件到变量FIBITMAP *bitmap中去。
通常情况下,我们的render target都是后缓冲,但也可以把render target设置为一个2d 纹理,然后再通过贴图的方式,把这个2d纹理显示出来,这样,就可以在一个屏幕上显示多个场景了。
在本教程中,我们使用二维NDRange来设置workgroup,这样在opencl中,workitme的组织形式是二维的,Kernel中 的代码也要做相应的改变,我们先看一下clEnqueueNDRangeKernel函数的变化。
本教程中,我们使用上一篇教程中产生的二进制kernel文件vecadd.bin作为输入来创建程序对象,程序代码如下: //kernel文件为vecadd.bin gclFile kernelFile; if(!kernelFile.
在教程二中,我们通过函数convertToString,把kernel源文件读到一个string串中,然后用函数clCreateProgramWithSource装入程序对象,再调用函数clBuildProgram编译程序对象。
现在,我们开始写一个简单的OpenCL程序,计算两个数组相加的和,放到另一个数组中去。程序用cpu和gpu分别计算,最后验证它们是否相等。OpenCL程序的流程大致如下: 下面是source code中的主要代码: int main(int argc, char* ar...
从今天开始学习OpenCL,下面先介绍OpenCL APP(Accelerated Parallel processing)的安装。 下载地址:http://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing-app-sdk/ 根据你的OS,选择相应的SDK版本。
前面我们用tessellation细分三角形或者四边形,产生的细分点都是在三角形或四边形平面内。本教程我们学习一下PN triangles(point normal triangles)的方法,把一个三角形细分为一个曲面。
TS中生成细分后顶点的u,v,{w}坐标,我们根据控制点和u,w,{w}坐标生成新的顶点位置,在前面四边形的细分中,我们用了双线性差值的方法,得到新的顶点位置,这些新顶点位置都在一个平面上。