用于点的直通几何着色器

时间:2011-06-14 20:24:34

标签: opengl glsl geometry-shader

我在为点编写一个简单的传递几何着色器时遇到了一些问题。我认为它应该是这样的:

#version 330
precision highp float;

layout (points) in;
layout (points) out;

void main(void)
{
    gl_Position = gl_in[0].gl_Position;
    EmitVertex();
    EndPrimitive();
}

当我没有指定几何着色器时,我在屏幕上显示了一堆点,但是当我尝试将此着色器链接到我的着色器程序时,没有显示任何点并且没有报告错误。

我正在使用C#和OpenTK,但我不认为这是问题所在。

编辑:人们请求其他着色器,尽管我在不使用几何着色器的情况下测试了这些着色器,并且它们在没有几何着色器的情况下工作正常。

顶点着色器:

void main()
{
    gl_FrontColor = gl_Color;
    gl_Position = ftransform();
}

片段着色器:

void main()
{
    gl_FragColor = gl_Color;
}

1 个答案:

答案 0 :(得分:4)

我不确定(没有几何着色器的实际经验),但是你不必指定最大输出顶点数。在你的情况下它只是一个,所以试试

layout (points, max_vertices=1) out;

也许着色器成功编译,因为你仍然可以通过API指定顶点的数量(至少在兼容性方面,我认为)。

编辑:您使用内置变量gl_FrontColor(并在片段着色器中读取gl_Color),但随后在几何着色器中,您不会将其传播到片段着色器(它不会自动传播)。

这给我们带来了另一个问题。您将新语法(如gl_in)与旧的弃用语法(如ftransform和内置颜色变化)混合使用。也许这不是一个好主意,在这种情况下你会遇到问题,因为如果我没记错的话,gl_in没有gl_Colorgl_FrontColor成员。因此,最好的方法是使用您自己的颜色变量作为顶点和几何着色器的out变量以及几何和片段着色器的in变量(但请记住in具有成为几何着色器中的数组。)