Skip to content

Archive

Category: Tech article
Anti-alias,简称AA,在图形学中广泛地用于提升渲染质量。经过几十年的发展,AA也从离线渲染逐步普及到了实时渲染的领域。本系列文章将总结一下在实时渲染中使用的AA方法的前世和今生。本篇集中讨论硬件提供的AA方法。 [caption id="attachment_1126" align="aligncenter" width="258"] 图1. 一个像素内部的采样点。16个红圈表示16个采样点,蓝色和黄色是覆盖了这个像素的两个三角形。[/caption] SSAA Super Sampling Anti-Aliasing是最直观的一种AA方法。实现方法之一就是渲染一个大图,然后downsample,这相当于在每个最终像素内部做了一个均匀分布采样。更通用的描述是,每个像素分布多个采样点(可以均匀分布、Poisson分布、随机分 ...
OpenGL ES在移动设备上大行其道,在PC上要开发点东西,一般就需要一个OpenGL ES Emulator。目前常见的模拟器有来自AMD、ARM、Qualcomm和NVIDIA的。他们的能力如何呢?让我们来进行一次简单的横向比较。 基本特性 厂商 AMD ARM 名称 OpenGL ES 2.0 Emulator (已经卖给Qualcomm) OpenGL ES 2.0 Emulator v1.2 模拟目标 AMD handheld GPU Mali 核心版本 2.0 1.x,2.0 扩展 GL_AMD_alpha_test GL_AMD_compressed_3DC_texture GL_AMD_compressed_ATC_texture GL_AMD_logic_op GL_AMD_program_binary_Z400 GL_AMD_writeonly_rendering GL_EXT_texture_filter_anisotropic GL_EXT_texture_type_2_10 ...
上周的帖子刚提到NVIDIA宣布了CUDA 4,昨天就收到NV的邮件说CUDA 4.0 RC可以下载了。developer注册用户可以从http://developer.nvidia.com/object/cuda_4_0_RC_downloads.html找到。 本来不打算说什么,碰巧在某网站看到了一篇所谓的“新特性解析”,典型的一个不懂技术的小编装懂地写软文。所以我不得不在这里拨乱反正,以免国内读者受其误导。 CUDA 4.0的更新主要集中在三方面 简化并行程序的移植 加速多GPU编程 更好的工具链支持 简化并行程序移植 在CUDA(其实还有AMD的stream)出来之前,并行程序移植GPU只能直接用shader,限制诸多,代码不灵活,基本算重写,而不是移植。有了CUDA之后,情况有所好转。在CUDA 4.0下, ...
Gamma校正对于图形和图像来说是个常提的概念,但对于gamma的缘由和使用方法,却存在着很多传说。本文将尽可能解析gamma校正来源,破解各种迷思。 Gamma校正从何而来 有一种常见的说法,gamma来源于眼睛对光感受。我也曾经错误地采用了这种说法。在wikipedia上查到了gamma的真正来源: 开发gamma编码是用来抵消阴极射线管(CRT)显示器的输入和输出特性。电子枪的电流,也就是光的亮度,与输入的正极电压的变化是非线性的。通过gamma压缩来改变输入信号抵消了这个非线性,因此输出图像就能有预期的亮度。 所以,gamma校正和人眼特性无关,仅仅和CRT有关。更新的显示方法,比如LCD和等离子之类,为了保证兼容,也都选择了和当年CRT一样的非 ...
前一阵子连载的“KlayGE中的延迟渲染”系列文章经过整理,现在有一个完整的版本放在wiki网站:http://www.klayge.org/wiki/index.php?title=%E5%BB%B6%E8%BF%9F%E6%B8%B2%E6%9F%93。
偶然发现了一个检测浮点数是否是NaN的做法:如果f == f返回false,就表示f是NaN。对于float和double都管用。
KlayGE中的延迟渲染(四)集中在Anti-alias的方法,本篇是这个系列的完结篇,我们一起来探讨未来将对延迟渲染所做的改进。 展望未来 shading pass再次渲染物体的改进 Deferred Lighting最受争议的一点应属在shading pass需要再次渲染几何体了。如果物体很多,尤其是有tessellation和GS的,多渲一遍有可能抵消了lighting pass带来的性能提升。改进的方法之一就是在建立G-Buffer阶段,用类似Deferred Shading的fat G-Buffer。除了原先的一张纹理,还需要一张纹理用来存放diffuse信息。但是lighting pass和原来一样,不涉及diffuse。shading pass就变成画一个全屏四边形,从G-Buffer的第二章纹理读取diffuse,进行着色。甚至emit也这么处理。 ...
KlayGE中的延迟渲染(三)介绍了lighting pass的优化技巧,本篇将讲解anti-alias。 Anti-Alias 从Deferred Shading发明的一天起,anti-alias的问题就一直困扰着所有Deferred的方法。虽然很多无良的游戏厂商直接在Deferred Rendering的游戏里不支持AA,但确实AA对提升画面质量很有帮助。 Edge AA 在Deferred的框架里,很自然会想到用Edge AA来处理AA。其过程不外乎: 边缘检测,得到每个像素“像边缘的程度” 在shader里根据“像边缘的程度”来控制采样坐标 这本身并不是个复杂的过程,尤其是第二步,非常直截了当了,所以这里集中讨论的是如何进行边缘检测。 GPU Gems 2的“Deferred Shading in STALKER”一文提供了一种边缘检测的 ...
在KlayGE中的延迟渲染(二)里,Deferred Lighting的3个阶段都已经得到解释,本篇将讲解如何更快地计算lighting pass。 Light volume 在Deferred Rendering中,表示一个光源最简单的方法就是一个全屏的四边形。它能让G-Buffer的每一个pixel都参与计算,在pixel shader中才过滤掉多余的像素。虽然可以保证结果正确,但毕竟多余计算太多,效率不高。这里常用的一个优化就是用一个凸的几何形状来表示光源。该几何 形状覆盖的pixel才计算该光源对它的贡献。显而易见的是,spot light用圆锥,point light用球或者立方体,directional light和ambient light用全屏四边形。下图画了一个spot light的volume: 这样的几何体类似于古老的shado ...
在有些设备上只有float没有double,比如前几代GPU、部分移动设备等。当非得用到double精度的时候该怎么办? 我记得去年在某个地方见到过用2个float模拟double的作法,经过一番玩命地搜索,得来全不费功夫,就在CUDA SDK的Mandelbrot例子里找到了2个float模拟double乘法的函数。甚至,GTX280上的double也是类似的方法模拟出来的,所以慢的惊人,只有float八分之一的速度。(EDIT: Mandelbrot在GTX480上,float和double都可以到60-70 fps,模拟的话只有20-30 fps,Fermi的double速度上去了) 先show一下模拟乘法的函数dsmul: // This function multiplies DS numbers A and B to yield the DS product C. __device__ inline void dsmu ...