之前说过,可编程的着色器阶段有三个,依次是顶点着色器、几何着色器、像素着色器。之前说的都是顶点着色器和像素着色器,今天第一次详细介绍几何着色器,几何着色器是一个可选的阶段。

一、使用几何着色器的好处
不像顶点着色器那样,输入一个顶点必须输出一个顶点。在几何着色器中,最大的好处是,你可以创建或销毁顶点,实现一些有趣的效果。例如在本例中,输入公告板的中心顶点,可以扩展出四个边框角顶点(两个三角形)。注意,由几何着色器输出的顶点必须是经过齐次空间投影变换。

几何着色器入口函数定义如下:

[maxvertexcount(N)]
void ShaderName (
PrimitiveType InputVertexType InputName [NumElements],
inout StreamOutputObject<OutputVertexType> OutputName)
{// Geometry shader body…
}

[maxvertexcount(N)]中的N是自己指定的最大输出顶点数,尽量不要设置太大,否则会造成巨大性能的消耗(书中是1-20为宜)。

输入的图元类型PrimitiveType可以是如下几种:
1. point:点
2. line:线
3. triangle:三角
4. lineadj:邻接线
5. triangleadj:邻接三角

但是顶点类型还是顶点着色器输出的顶点类型。

输出类型总是有inout修饰符,并且是一个steam流类型,添加顶点到流中可以使用Append()方法。流类型可以是如下几种:
1. PointStream:点流
2. LineStream:线流
3. TriangleStream:三角流

二、公告板效果
公告板效果是用2D纹理来代替复杂的3D模型以节省资源,达到视觉欺骗的效果。

相信很多人以前都玩过一款十分经典的游戏《抢滩登陆2002》,当时的电脑显卡跟现在比差太远,但是可以模拟出大量的3D士兵人物,是怎么做到的呢?也是利用了公告板技术。

上面的人物都是2D纹理,没有想到吧?因为这款游戏的视角都是固定在中央,使用公告板技术几乎看不出来是2D纹理。所以如果运用恰当,公告板技术也可以发挥出很惊人的效果。即使到了如今显卡这么发达,也有很多网游和单机游戏使用公告板技术来实现草地这种3D模型复杂而且需要大量产生的物体。

下面就来看看如何用公告板技术实现树木的渲染。

首先需要一张2D树木的纹理:

(我故意在photoshop中打开,证明它完全只是一张2D图片)

我们重点关注在HLSL的几何着色器代码上。

我们要做的事情是,在几何着色器中将该纹理的中心顶点扩展到四个角顶点。

 // 输出顶点数是4个
[maxvertexcount(4)]
void GS(point VertexOut gin[1], uint primID : SV_PrimitiveID, inout TriangleStream<GeoOut> triStream)
{   // 根据树的朝向,得到上、前、右向量float3 up = float3(0.0f, 1.0f, 0.0f);float3 look = gEyePosW - gin[0].CenterW; //CenterW是中心顶点位置look.y = 0.0f; // 让y分量为零,这棵树就可以垂直于xz平面look = normalize(look);float3 right = cross(up, look);//// 根据中心顶点,计算四个角的顶点坐标(三角带形式)//float halfWidth  = 0.5f*gin[0].SizeW.x;float halfHeight = 0.5f*gin[0].SizeW.y;float4 v[4];v[0] = float4(gin[0].CenterW + halfWidth*right - halfHeight*up, 1.0f);v[1] = float4(gin[0].CenterW + halfWidth*right + halfHeight*up, 1.0f);v[2] = float4(gin[0].CenterW - halfWidth*right - halfHeight*up, 1.0f);v[3] = float4(gin[0].CenterW - halfWidth*right + halfHeight*up, 1.0f);//// 将坐标投影变换到齐次空间//GeoOut gout;[unroll]for(int i = 0; i < 4; ++i){gout.PosH     = mul(v[i], gViewProj); //这里不需要world投影,因为在应用程序阶段产生了世界坐标。保存了齐次空间坐标。gout.PosW     = v[i].xyz; //保存世界坐标,像素着色器要进行计算gout.NormalW  = look;gout.Tex      = gTexC[i];gout.PrimID   = primID;triStream.Append(gout); //将顶点添加到输出流}
}

像素着色器主要做的事情也只是根据顶点位置的进行UV纹理采样。

粗略一看效果还是可以骗人的。

不过,视角一移动到上方就露馅了,所以建议还是远处的物体采用Billboard技术吧~哈哈

示例源代码:
https://github.com/ljcduo/Introduction-to-3D-Game-Programming-With-DirectX11/tree/master/Chapter%2011%20The%20Geometry%20Shader/TreeBillboard

DirectX11 使用几何着色器实现公告板效果相关推荐

  1. DirectX11 With Windows SDK--17 利用几何着色器实现公告板效果

    DirectX11 With Windows SDK--17 利用几何着色器实现公告板效果 原文:DirectX11 With Windows SDK--17 利用几何着色器实现公告板效果 前言 上一 ...

  2. UnityShader_使用几何着色器实现草坪效果(简易)

    本文参考自该文章 实现思路: 1.几何着色器实现草 (三角形),原理是将几何着色器的三角片元输入重新构造成草的样式 2.让草可以在各种地形朝上生长(切线空间) 3.曲面细分可以动态改变模型定点数,进而 ...

  3. DirectX11 With Windows SDK--15 几何着色器初探

    DirectX11 With Windows SDK--15 几何着色器初探 原文:DirectX11 With Windows SDK--15 几何着色器初探 前言 从这一部分开始,感觉就像是踏入了 ...

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

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

  5. opengl 纹理贴到对应的位置_一步步学OpenGL(27) -《公告牌技术与几何着色器》

    教程 27 公告牌技术与几何着色器 原文: http://ogldev.atspace.co.uk/www/tutorial27/tutorial27.html CSDN完整版专栏: https:// ...

  6. Unity Shader:用几何着色器实现复联3灭霸的终极大招灰飞烟灭

    (图1:正常渲染) (图2:几何着色器粒子化特效进行中) (图3:几何着色器粒子化特效进行中) 1,用几何着色器进行图元转换 在OpenGL渲染管线中,几何着色器Geometry Shader有一个独 ...

  7. Windows 8 Directx 开发学习笔记(十四)使用几何着色器实现三角形细分

    几何着色器是从DirectX 10才引入的着色器,是一个可选阶段,位于顶点着色器和像素着色器阶段之间.顶点着色器以顶点作为输入数据,而几何着色器以完整的图元作为输入数据,像点.直线.三角形等.之所以引 ...

  8. OpenGL基础41:几何着色器

    在顶点着色器之后,片段着色器之前,还有几何着色器,它是可选的,在<OpenGL基础3:渲染管线>这一章中就有提到了,有了几何着色器后可以做很多骚操作,更容易实现很多有意思的效果 一.最简单 ...

  9. 第二十二章 opengl之高级OpenGL(几何着色器)

    OpenGL 使用几何着色器 用点造物体 爆破物体 法向量可视化 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader), 几何着色器的输入是一个图元(如点或三角形)的一组顶点 ...

最新文章

  1. js 禁止复制粘贴全选
  2. 【鸿蒙 HarmonyOS】界面跳转 ( AbilitySlice 之间的界面跳转 | AbilitySlice 之间的值传递 )
  3. TCP/IP协议精华指南pdf发布
  4. 【十二省联考2019】字符串问题【后缀自动机】【拓扑排序】
  5. LeetCode - Medium - 114. Flatten Binary Tree to Linked List
  6. solution: stuch on 'setting up your MAC'
  7. 使用Mysql进行数据管理
  8. 浮点数表示(记录学习过程中遇到的问题)
  9. 以太坊 ERC-20 ERC-721 ERC-1155区别对比
  10. 经典而常用的配乐和背景音乐合集(上)
  11. 极域电子教室中计算机图标对齐,极域电子教室使用手册整理,新手必备
  12. MFC实现文字随鼠标移动
  13. Windows蓝屏自动修复无法修复你的电脑
  14. Mac OS 使用笔记
  15. innodb中的行格式——Compact、Dynamic、Compressed、Redundant详解
  16. The Elements of Style 4ed ---英文写作指南(四)
  17. 怎样使用手机的nfc功能模拟门禁?
  18. 码支付系统 无授权—个人免签约支付系统二维码收款即时到账源码 –
  19. 马尔科夫随机场简单理解
  20. pip安装librosa或audioread长时间无响应

热门文章

  1. webflux + springboot 整合(史上最全)
  2. 小游戏《虎吃羊》java 源码
  3. 龙珠觉醒找不到服务器,龙珠觉醒:新服开7天,百万战已烂大街,这样培养方可养老!...
  4. 服务器解析form中文件,客户端解析服务器响应的multipart/form-data数据
  5. 运行时异常和非运行时异常
  6. 蓝光森林助力企业应对限电,建设绿色节能数据存储模式
  7. lunux 下所有浏览器都提示d代理服务器拒绝连接
  8. 北大青鸟,学生:郜龙飞,作业笔记,第二章变量、常量、算术运算符
  9. Binder的使用方法和源码解析
  10. 海康大华华为宇视等监控摄像头通过GB28181协议接入到LiveGBS流媒体平台如何给监控摄像头加水印...