有效的方法绘制带有实心形状的带衬里边框

时间:2013-09-25 03:00:20

标签: c++ opengl glsl

我目前有如下布局的顶点数据(金字塔):

float4 vertexData[ 18 ] =
{
    // front

    { 1.0f, 0.0f, 1.0f, 1.0f },  // front right
    { 0.0f, 1.0f, 0.0f, 1.0f },  // top
    { -1.0, 0.0f, 1.0f, 1.0f },  // front left


    // right

    { 1.0f, 0.0f, 1.0f, 1.0f },   // right front
    { 0.0f, 1.0f, 0.0f, 1.0f },   // top
    { 1.0f, 0.0f, -1.0f, 1.0f },  // right back


    // back

    { 1.0f, 0.0f, -1.0f, 1.0f },  // back right
    { 0.0f, 1.0f, 0.0f, 1.0f },   // top
    { -1.0, 0.0f, -1.0f, 1.0f },  // back left


    // left

    { -1.0f, 0.0f, -1.0f, 1.0f },  // left back
    { 0.0f, 1.0f, 0.0f, 1.0f },    // top
    { -1.0f, 0.0f, 1.0f, 1.0f },   // left front

    // bottom back major

    { -1.0f, 0.0f, 1.0f, 1.0f },   // bottom left front
    { -1.0f, 0.0f, -1.0f, 1.0f },  // bottom left back
    { 1.0f, 0.0f, -1.0f, 1.0f },   // bottom right back

    // bottom front major

    { 1.0f, 0.0f, -1.0f, 1.0f },   // bottom right back
    { 1.0f, 0.0f, 1.0f, 1.0f },    // bottom right front
    { -1.0f, 0.0f, 1.0f, 1.0f },   // bottom left front

};

我想基本上采用我的金字塔,并使用着色器(如果可能)计算两个顶点之间的边缘,然后将各种类型的“线”发送到片段着色器。

我知道我可能只是使用“GL_LINES”,并设置一个新的统一颜色,但我认为这不会非常有效。也许我错了?

无论哪种方式,我最初认为着色器的主要原因是因为它们是一个很酷的方法:我可以编写一个程序,可以为边框添加一些有趣的效果。但是,通过一个着色器程序如何做到这一点,我完全被难倒了。

对此采取良好做法的任何想法?

2 个答案:

答案 0 :(得分:3)

你所说的是细胞阴影。其中一个最受欢迎的教程可以在这里找到:http://nehe.gamedev.net/tutorial/cel_shading/25001/

使用GL_LINES效率不高。使用VBO将顶点数据存储在GPU上,然后可以绘制几次。您甚至可以使用自定义着色器绘制GL_LINES。在教程中,它基本上以相同的方式完成。要使轮廓不渗透到实体对象背景中,您需要一个小的深度偏移(避免z缓冲区对抗)。

答案 1 :(得分:1)

它与卡通(单元格)着色明确相关。

有几种方法可以做到: