【问题标题】:Pass-through geometry shader for points点的直通几何着色器
【发布时间】:2011-06-16 05:20:49
【问题描述】:

我在为点编写简单的直通几何着色器时遇到了一些问题。我想应该是这样的:

#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;
}

【问题讨论】:

  • 这可能与this 问题有关,因为我正在ATI 显卡上进行测试。
  • 您能发布附加到该程序的其他着色器吗?
  • @Nocturne 也许将新语法(如layout(points))与旧的弃用语法(如ftransform 或固定函数变化)混合并不是一个好主意。但我刚刚发现了另一件事,会更新我的答案。

标签: opengl glsl geometry-shader


【解决方案1】:

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

layout (points, max_vertices=1) out;

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

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

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

【讨论】:

  • 你说得对,我确实忘记了,但遗憾的是积分仍然没有显示出来。
  • 非常感谢,我设法让它工作了。目前我真的不需要颜色,所以我刚刚将片段着色器替换为 'gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);'。不过,我可能应该清理所有那些已弃用的语法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多