几何图形通过着色器不显示任何内容,但是只使用frag和vert着色器会显示我正在绘制的内容

时间:2016-07-09 13:44:08

标签: c# opengl geometry shader opentk

这是我制作的几何着色器,根据我的理解应该简单地将3个顶点传递给frag着色器?当我删除geom着色器并将值直接传递给frag着色器时,它会工作并显示我想要的内容。 我用三角形绘制地形,每个绘制调用通过6个顶点(2个三角形),也许这与它有关但是我无法弄清楚是什么

#version 330

layout(triangles) in;
layout(triangle_strip, max_vertices = 3)out;


in float gHeight;
in vec4 gSurfacePosition;
in float gTerrainHeight;
in vec2 gTexCoords[3];
in vec4 gNormal[3];


out float oTerrainHeight;
out float oHeight;
out vec4 oNormal;
out vec4 oSurfacePosition;
out vec2 oTexCoords;


void main()
{

    oSurfacePosition=gSurfacePosition;
    oHeight=gHeight;
    oTerrainHeight=gTerrainHeight;

    for(int i = 0; i < 3; i++)
    {
        gl_Position = gl_in[i].gl_Position;

        oNormal = gNormal[i];
        oTexCoords = gTexCoords[i];

        EmitVertex();

    }
}

1 个答案:

答案 0 :(得分:1)

in float gHeight;
in vec4 gSurfacePosition;
in float gTerrainHeight;

这不应该编译。要么您没有正确检查错误,要么您的实施在报告错误方面非常松懈。

这不应该编译的原因是因为所有GS inputs must be arrayed。您在基元中获得一个输入值每个顶点。您的GS将triangles作为输入,因此它将每个输入值作为3个值的数组。你为一些输入做了这个,但你没有为所有做这些。

oSurfacePosition=gSurfacePosition;
oHeight=gHeight;
oTerrainHeight=gTerrainHeight;

这并不是你认为它做的。每当您致电EmitVertex时,value of all out variables becomes undefined。因此,每次要发出新顶点时,必须再次设置out个变量。即使您想要写相同的值,也必须每次都设置它。