算法相关技术专家
从本篇教程开始,我们暂停代码的学习,先来了解一下D3D11的管线,这些管线不涉及具体的硬件,而是着重于理解能够支持D3D11的管线实现。 参考资料: http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the-graphics-pipeline-2011-part-1/ 通过前面的教程,我们知道,要用D3D11画一个三角形,我们需要做以下步骤: 这些步骤大致分为四个阶段,初始化阶段,数据装配阶段,shader执行阶段,以及合并输出阶段。
转帖:http://www.liusuping.com/it-tech/pci-e-pci-express-jieshao.html 什么是PCI Express PCI-Express是当前主流的总线和接口标准,它原来的名称为“3GIO”,是由Intel提出的,很明显Intel的意思是它代表着下一代I/O接口标准。
在D3D11应用程序中,我们按下alt+enter键,会切换到全屏模式。有时候,我们在WM_SIZE中有一些代码,全屏时,会使得程序崩溃,比如之前教程的代码,就是如此。 下面我们在D3DClass.cpp 中,增加代码,禁止alt+enter键全屏。
现在我们在common.h中增加一个debug的宏,在每个d3d11函数后调用,如果d3d函数出错,它能够给出程序中错误的代码行数。 common.h代码如下: #pragma once #include #include #if defined(DEBUG) ...
本篇教程中,我们将在三维场景中,画一个简易的坐标轴,分别用红、绿、蓝三种颜色表示x,y,z轴的正向坐标轴。 为此,我们要先建立一个AxisModelClass类,来表示坐标轴顶点。 现在系统类之间的关系图如下: AxisModelClass类和前面的ModelClass类相似,只是创建顶点缓冲和索引缓冲时,指定了3条线段,表示三个坐标轴。
在上篇教程代码的基础上,我们增加一个TimerClass类,这个类的功能很简单,就是可以计算相邻2帧的时间差。利用这个时间差值,可以实现平滑的动画,使得动画不会因为不同机器fps不同,从而动画效果变快或者变慢。
本章我们将替换掉CameraClass类,实现一个稍微靠谱点的摄像机类。并通过Q,W,E,A,S,D,Z,X,C等按键实现摄像机的控制。 该类的主要功能就是根据指定的摄像机位置,up方向以及lookat方向,得到最终的视图矩阵,所谓视图矩阵就是把世界坐标系的顶点位置转化到视点(或者说摄像机)空间的矩阵。
The data structure is extremely simple: a bounded FIFO. One step up from plain arrays, but still, it’s very basic stuff.
http://en.wikipedia.org/wiki/Z-order_curve Z-order curve From Wikipedia, the free encyclopedia Jump to: navigation, search Not to be confused with Z curve or Z-order.
原帖地址:http://fgiesen.wordpress.com If you’re working with images in your program, you’re most likely using a regular 2D array layout to store image data.
前面教程我们通过D3D11画了一个三角形,本章我们将画一个颜色立方体,它的立体感更强。主要的变动是ModelClass类,在ModelClass中定义一个立方体需要的顶点信息,然后创建顶点缓冲和索引缓冲。
在上篇教程中,我们实现了在D3D11中画一个简单的三角形,但是,当我们改变窗口大小时候,三角形形状却随着窗口高宽比例改变而改变,如下图所示: 这是因为我们改变了窗口大小,但后缓冲大小在程序初始化时候,已经被指定,不随着窗口改变而改变,这样在视口映射下,我们所渲染的三角形就改变了形状。
在本篇教程中,我们将通过D3D11画一个简单的三角形。在D3D11中,GPU的渲染主要通过shader来操作(当然还有一些操作是由GPU固定管线完成,比如光栅化操作),最常用的shader操作是顶点shader(vertex shader)和像素shader(pixel shader)。
接着上篇教程的代码,本篇加入基本的D3D代码,实现一个完整的D3D11程序框架。 我们增加一个新类D3DClass, 用来处理3D渲染功能。增加该类后,程序的框架如下图: GraphicsClass.h代码改变如下, 主要是增加了一个D3DClass类成员变量,在Render函数中,将会调用D3DClass的相应Render函数,比如BeginScene、EndScene,BeginScene主要是清除framebuffer,设置渲染背景颜色,而EndScene则是把交换前后缓冲,使当前渲染的内容在屏幕上显示出来。
在前一篇教程程序代码的基础上,这次我们将增加2个类: InputClass,键盘处理的代码将放在这个类里面,GraphicsClass类,D3D渲染的代码放在这个类里,这两个类都是SystemClass类的成员变量,SystemClass类中会调用这2个类实例的初始化、渲染以及shutdown函数。
在本教程中,我们把前面一个教程的代码,进行封装。把初始化函数,Run函数,窗口回调函数,ShutdownWindows函数等封装到一个System class中。 首先我们要在前面建立的solution,myTutorialD3D11中,鼠标右键点击,选择New Project, 创建一个名为myTutorialD3D11_1的空工程,在工程中增加main.cpp文件。
在vs2010中,建立一个新的win32工程,名字是: myTutorialD3D11, 注意:同时勾选Create directory for solution,我们同时建立一个solution,后面教程的所有的工程文件,我们都建立在这个solution中。
基于OpenCV harr级联分类器的人脸及眼睛、鼻子、嘴巴检测程序。 代码很简单: #include #include #include #include #include using namespace std; int main() { c...
发现OpenCV中读取视频或者usb camera的方法如此简单,下面是opencv2.31中实现的读取摄像头的代码: int main() { //打开视频文件 //cv::VideoCapture capture("bike.
from: http://www.geeks3d.com/20101001/tutorial-gamma-correction-a-story-of-linearity/ 1 – What is gamma correction and why is it important? 2 –...
F2 跳转到函数定义 Shift+F2 声明和定义之间切换F4 头文件和源文件之间切换Ctrl+1 欢迎模式Ctrl+2 编辑模式Ctrl+3 调试模式Ctrl+4 项目设置模式Ctrl+5 ...
The Basic Lighting Model OpenGL and Direct3D provide almost identical fixed-function lighting models.
1、什么是垂直同步? 垂直同步又称场同步(Vertical Hold),从CRT显示器的显示原理来看,单个象素组成了水平扫描线,水平扫描线在垂直方向的堆积形成了完整的画面。显示器的刷新率受显卡DAC控制,显卡DAC完成一帧的扫描后就会产生一个垂直同步信号。
在本节,我们主要介绍OpenCL中buffer的使用,同时提供了两个个完整的例子,一个是图像的旋转,一个是矩阵乘法(非常简单,没有分块优化)。 1、创建OpenCL设备缓冲(buffer) OpenCL设备使用的数据都存放在设备的buffer中[其实就是device memory中]。
1、OpenCL扩展 OpenCL扩展是指device支持某种特性,但这中特性并不是OpenCL标准的一部分。通过扩展,厂商可以给device增加一些新的功能,而不用考虑兼容性问题。现在各个厂商在OpenCL的实现中或多或少的使用了自己的扩展。
本节主要介绍NBody算法的OpenCL性能优化。 1、NBody NBody系统主要用来通过粒子之间的物理作用力来模拟星系系统。每个粒子表示一个星星,多个粒子之间的相互作用,就呈现出星系的效果。
性能优化 1、线程映射 所谓线程映射是指某个线程访问哪一部分数据,其实就是线程id和访问数据之间的对应关系。 合适的线程映射可以充分利用硬件特性,从而提高程序的性能,反之,则会降低性能。 请参考Static Memory Access Pattern Analysis on a Massively Parallel GPU这篇paper,文中讲述线程如何在算法中充分利用线程映射。
GPU线程及调度 本节主要讲述OpenCL中的Workgroup如何在硬件设备中被调度执行。同时也会讲一下同一个Workgroup中的workitem,如果它们执行的指令发生diverage(就是执行指令不一致)对性能的影响。
6、Nvdia GPU Femi架构 GTX480-Compute 2.0 capability: 有15个core或者说SM(Streaming Multiprocessors )。
GPU架构 内容包括: 1.OpenCLspec和多核硬件的对应关系 AMD GPU架构 Nvdia GPU架构 Cell Broadband Engine 2.一些关于OpenCL的特殊主题 OpenCL编译系统 Installable client driver 首先我们可能有疑问,既然OpenCL具有平台无关性,我们为什么还要去研究不同厂商的特殊硬件设备呢? 了解程序中的循环和数据怎样映射到OpenCL Kernel中,便于我们提高代码质量,获得更高的性能。
OpenCL内存模型 OpenCL的内存模型定义了各种各样内存类型,各种内存模型之间有层级关系。各种内存之间的数据传输必须是显式进行的,比如从host memory到device memory,从global memory到local memory等等。
Kernel对象: Kernel就是在程序代码中的一个函数,这个函数能在OpenCL设备上执行。一个Kernel对象就是kernel函数以及其相关的输入参数。 Kernel对象通过程序对象以及指定的函数名字创建。
OpenCL内存对象: OpenCL内存对象就是一些OpenCL数据,这些数据一般在设备内存中,能够被拷入也能够被拷出。OpenCL内存对象包括buffer对象和image对象。 buffer对象:连续的内存块----顺序存储,能够通过指针、行列式等直接访问。
1、OpenCL架构 OpenCL可以实现混合设备的并行计算,这些设备包括CPU,GPU,以及其它处理器,比如Cell处理器,DSP等。使用OpenCL编程,可以实现可移植的并行加速代码。
对应用程序来说,选择合适的memory object传输path可以有效提高程序性能。 下面先看一写buffer bandwidth的例子: 1. clEnqueueWriteBuffer()以及clEnqueueReadBuffer() 如果应用程序已经通过malloc 或者mmap分配内存,CL_MEM_USE_HOST_PTR是个理想的选择。
首先我们了解一些优化时候的术语及其定义: 1、deferred allocation(延迟分配), 在第一次使用memory object传输数据时,runtime才对memory object真正分配空间。
当我们用clCreateBuffer, clCreateImage创建OpenCL memory object时候,我们需要输入一个flag参数,这个参数决定memory object的位置。 cl_mem clCreateBuffer (cl_context context,...
这篇日志是学习AMD OpenCL文档时候的总结。 OpenCL用memory object在host和device之间传输数据,memory object由runtime(运行库,driver的一部分)来管理。
在ATI Stream Computing Programming Guide中,例举了AMD 5系列显卡的参数信息。 我比较关注其中Peak bandwidths的计算,以便在opencl程序测试bandwidth利用率。