几何着色器 Opengl Geometry Shaders 笔记

版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/,未经本作者允许不得转载。 https://blog.csdn.net/kenden23/article/details/78713917

Geometry Shaders (简称:GS)笔记

这个应该翻译为几何着色器吧,这个Shader可以做很多特效,这里先记录,并记熟一些要点,然后在用来做一些特效。
这个属于Opengl - 主要是shaders,的学习性笔记了,记录的比较随意,并非tutorial式的东西。

1. A geometry shader has access to all of the vertices in a primitive. GS是每个primitirve就出发一次的shader,故此一个GS(每次触发的GS)可以访问一个primitive中的所有vertices(顶点);GS可以改变primitive的类型,可以创建和销毁primitives。
One Primitive 对应(触发) One Geometry shader.

最简单GS例子:
#version 450 core
layout (triangles) in;
layout(triangle_strip) out;
layout (max_vertices = 3) out;
void main()
{
    int i;
    int n = gl_in.length();
    for (i = 0; i < n; ++i)
    {
        gl_Position = gl_in[i].gl_Position;
        EmitVertex();
    }
    EndPrimitive();
}

layout (triangles) in;  标明了输入GS的是什么primitive, 这里表示是triangles;GS的primitive输入类型必须和VS或者TS,即GS的上一个shader的输出类型一致,否则不正常工作。
layout (triangle_strip) out; 表明GS输出是什么primitive,这里是triangle_strip;GS的输出类型必须是什么strip的,否则没有图像输出。
layout (max_vertices = 3) out; 表明GS输出最大是多少个vertices,这个值如果需要增加vertices的时候,可以是max_vertices > triangle_strip(vertices number),也就是说GS可以增加渲染顶点。

EmitVertex() 是一个发出vertex的函数,就是告诉Opengl,已经设置了这个vertex相关数值了,请保持这个vertex;
EndPrimitive()函数是最终等所有primitive的vertex数值都已经设置好了,告诉Opengl这个primitive已经设置好了,请保存好。下一步发给fragment shader。
如果最终primitive的的vertex数量少于应有的数量,比如这里输出shi triangle_strip那么数量不应该少于3,如果少于3,那么这个primitive就不会被渲染;
如果多3个,那么就是增加了顶点,会继续渲染多于一个primitive。
这两个函数的特征就决定 了GS可以销毁顶点,也可以增加primitive,当然也可以修改vertex,从而修改primitive。
加上layout (triangle_strip) out;这个设置,GS也可以修改输出primitive类型。
所有总结起来GS有四大功能:
1 销毁顶点 -- 从而销毁primitive
2 增加primitive
3 修改verte -- 从而修改primitive
4 修改primitive类型
也就是说GS的功能十分强大,发挥我们的想象力,可以创建很多强大的特效,比如:
1. 模型直接爆炸,三角形碎片往外飞
2. 画出模型的三角形法线
3. 模型变形
4. GS隐藏一些模型,背面剪切,这些功能也可以在GS中做,或者OpenGL自动背面剪切了,不过不知道在GS中做,会不会提高运行速度,这点我需要继续调查一下。当然,如果一定要使用到GS,那么在GS中做这些优化,效果肯定是提升的。根据KlayGE引擎提到“不争气的geometry shader”  http://www.klayge.org/2011/07/26/%E4%B8%8D%E4%BA%89%E6%B0%94%E7%9A%84geometry-shader/ ,打开gs就会有一定性能损耗,不过到现在Opengl又经过这么多版本迭代之后,性能肯定更加强大了。

这些效果,我后面会慢慢实现,并贴上来。

本文主要参照:opengl superbible 和opengl wiki


猜你喜欢

转载自blog.csdn.net/kenden23/article/details/78713917
今日推荐