转载请注明出处为KlayGE游戏引擎,本文地址为http://www.klayge.org/2011/07/26/%e4%b8%8d%e4%ba%89%e6%b0%94%e7%9a%84geometry-shader/

上周末实现了打算在KlayGE 4.0中使用的render to texture array功能。于是自然而然想到在ShadowCubeMap这个例子中使用,用来在1个pass内直接生成cubemap。结果,不比不知道,一比吓一跳。在不同GPU上FPS如下:

NV 9800GT NV 480GTX AMD 5870
6 pass Cubemap 158.63 312.82 241.10
Dual Paraboloid 5.77 375.32 211.91
1 pass Cubemap 66.08 288.77 228.44
1 pass Cubemap with instance 105.37 281.34 224.10
1 pass Cubemap with instance GS NA 287.80 211.01

9800GT所在机器的CPU比后两套系统差得多,没法横向比较,只能纵向比较。后两套系统只有GPU不同,可以横向和纵向比较。

5种做法

  • 6 pass Cubemap是个基准,实现方法就是最通俗的,在光源的位置向6个方向各渲一遍场景,得到cubemap的shadow map。
  • Dual Paraboloid需要渲染2个pass,正反面各一次,把经过tessellation的场景参数化到抛物面坐标系上。这种方法看似不错,但实际上省 不了多少draw(因为在高层就做了视锥剪裁),而且因为需要tessellation,开销会增加很多。在9800GT上,因为没有硬件的 tessellator,这里用的是简单的instanced tessellation,每个三角形不管大小都固定切分5次,所以性能超级低下。
  • 1 pass Cubemap的做法是,把每个顶点在VS里面分别乘上6个model view projection,得到了6个position全都传给GS。在GS里把每个三角形根据不同的position生成6份,然后通过 SV_RenderTargetArrayIndex传到不同的rt上,一个pass完成render to texture array。原先也试过在VS里面只是简单地把输入的position传给GS,而在GS里面完成乘矩阵的事情,结果更慢。
  • 1 pass Cubemap with instance的做法是用instance来生成6个顶点。这样在VS里面只需要根据SV_InstanceID选择乘上哪一个model view projection,在GS里面也不用生成6份。
  • 1 pass Cubemap with instance GS用到了D3D11新增的instance GS功能,让GS自己instance多个,而不用IA来进行instance的操作。

数据分析

  1. Dual Paraboloid需要做很细的tessellation,而tessellation正是NV Fermi的强项,所以DP在NV 480GTX上比AMD 5870快得多,甚至快于不必做tessellation的方法。
  2. 1 pass Cubemap with instance比1 pass Cubemap快一些,说明用IA来拆顶点的效率比GS高得多(因为GS更通用)。
  3. 1 pass Cubemap with instance GS和 pass Cubemap with instance速度差不多。instance GS的出现就是为了加速这种状况,但它似乎没有做到。
  4. 1 pass Cubemap比6 pass Cubemap慢了不少。而且如果没有在GS里面做frustum culling,会慢相当多!

对于3和4,有两种可能。第一是cubemap只有6个面,太少了,不够GPU发挥;这种可能性存在,但概率很低。更有可能是,GS太垃圾了,没法很有效地执行预期的操作。

结论

这样一测试,基本上可以认为,在render to cubemap的情况下,只要经过了GS,哪怕很简单的GS,都会对性能大打折扣。所以除非是类似于stochastic rendering、motion blur,其他时候用GS往往得不偿失。好在,D3D11的GPU上GS已经有所优化。比起D3D10的GPU来说,新一代GPU的GS性能损失少了很 多。但本来寄希望于instance GS,结果没有太多的好处,不知道以后的GPU和驱动会不会有所改进。

另外,如果实在要做render to texture array,别忘了在GS里面自己做frustum culling以及back face culling。这样能极大地减少输出三角形的个数,从而提升GS的性能。

转载于:https://www.cnblogs.com/gongminmin/archive/2011/07/27/2118000.html

不争气的geometry shader相关推荐

  1. OpenGL 几何着色器Geometry Shader

    OpenGL几何着色器Geometry Shader 几何着色器Geometry Shader简介 使用几何着色器 造几个房子 爆破物体 法向量可视化 几何着色器Geometry Shader简介 在 ...

  2. 【Unity Shader】使用Geometry Shader进行大片草地的实时渲染

    效果预览图 0. 前言 笔者最近阅读学习了知乎大神@陈嘉栋 所写的这篇文章:<利用GPU实现无尽草地的实时渲染>,这篇文章写得非常好,给出了实时生成一片草地的核心思路和基本流程,非常清晰- ...

  3. Unity Shader之几何着色器(Geometry Shader)实现面片飞散的爆炸效果

    前言 上篇文章初学集合着色器实现了草地效果,这篇再次使用GS实现一个"爆炸效果".为什么要加上引号呢,因为实现的其实不是一个传统的爆炸效果,更类似于面片向外扩散消失的一种科幻效果, ...

  4. NV GTX680对GTX580:另一个视角

    转载请注明出处为KlayGE游戏引擎,本文地址为http://www.klayge.org/2012/03/31/nv-gtx680%e5%af%b9gtx580%ef%bc%9a%e5%8f%a6% ...

  5. DirectX Shader 入门学习

    shader,英文意思是,著色器.着色程序.     Shader就是一段可以改变像素和顶点的小程序,这个Shader小程序可以为场景添加一些基本的几何学特效.例如湖水的涟漪,它会让特定的蓝色材质发生 ...

  6. 【GPU精粹与Shader编程】(一) 全系列核心知识点总览

    系列文章前言 <GPU Gems>1~3 .<GPU Pro>1~7 以及<GEM Zen>组成的GPU精粹系列书籍,是游戏开发.计算机图形学和渲染领域的业界大牛们 ...

  7. OSG与opengl的shader结合

    1.OpenGL(3.3)可编程管线 可编程管线可以理解为一系列的三维顶点经过加工变成二维离散的像素点.并且允许在特定的着色阶段自有配置(顶点着色,几何着色,片源着色). 这里主要介绍一下几何着色,几 ...

  8. unity 如何获取到屏幕中间_Unity通用渲染管线Shader日志输出工具

    这是侑虎科技第700篇文章,感谢作者邹春毅供稿.欢迎转发分享,未经作者授权请勿转载.如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨.(QQ群:793972859) 作者主页:https://w ...

  9. OpenGL Shader基本概念

    转载自:http://blog.csdn.net/lcphoenix/article/details/6574417 使用OpenGL创造的物体,在最终被绘制出来之前,有一个流水线处理过程,该过程被称 ...

最新文章

  1. 辞职之后的思考--激励
  2. [转]让你提升命令行效率的 Bash 快捷键
  3. Linux pwn入门教程——CTF比赛
  4. python 相交链表
  5. python2使用openpyxl_使用openpyxl for Python2.6有些困难
  6. 中国最闷声发大财的城市,人均GDP超杭州
  7. bat递归查找指定文件_批处理脚本遍历指定文件夹下的文件
  8. 再识PCI:一个PCI驱动实例
  9. 【C语言】指针进阶 - 指针数组 数组指针 数组指针传参 函数指针 指向函数指针数组的指针
  10. opc客户端_OPC UA 预备知识 OPC 核心概念
  11. 鸿蒙os到底是什么,聊聊鸿蒙OS到底是什么!
  12. mysql 纵列转横列_mysql行列转换方法总结
  13. 统计各班参加补考的人数
  14. 【华为OD机试真题 JS】解压报文
  15. 前端小demo:星星闪烁
  16. 根据观测时间,经纬度,求太阳高度角
  17. 嵌入式设备和固件中的自动漏洞检测(二):动态分析与符号执行技术
  18. 非结构化数据的相关知识
  19. 天池广东工业智造大数据创新大赛--铝型材表面瑕疵识别 --top1方案
  20. no input file specified解决方法

热门文章

  1. 吴恩达深度学习 —— 2.15 python中的广播
  2. RobHess的SIFT源码分析:imgfeatures.h和imgfeatures.c文件
  3. toj 4317 多连块拼图
  4. qt5.8连接mysql代码_qt5.8如何连接mysql
  5. 在过程中要正式批准可交付成果_邛海—螺髻山风景名胜区邛海西岸详细规划》获国家林草局批准执行...
  6. python爬虫分析数据_Python爬虫入门 处理数据
  7. 闪退mac_幕布闪退怎么办?别着急看这里
  8. python批量_Python学习第九十三天:Python批量处理图片
  9. data为long 怎么设置vue_vue--为什么data属性必须是一个函数
  10. 存储控制器wwn号_AUTOSAR学习笔记之存储