GLSL几何着色器和通用顶点属性

时间:2011-06-30 13:26:57

标签: glsl geometry-shader

所以我现在已经尝试了一段时间,将顶点属性数组传递给几何着色器。它是一个float数组(其中每个顶点的属性只是一个浮点值)

现在,当我把它放在几何着色器中时:

attribute float nodesizes;

着色器编译器抱怨:

OpenGL requires geometry inputs to be arrays

我如何完全传递它?

此外,这是我的顶点attrib的代码:

glBindAttribLocation(programid, 1, "nodesizes");
glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, 0, array);
glEnableVertexAttribArray(1);

我做错了吗?

2 个答案:

答案 0 :(得分:8)

几何着色器不会获取属性。顶点着色器得到attribute s并输出varying s(用旧语法说)。然后可以在几何着色器中读取它们,但是作为数组,一个几何着色器调用遵循多个顶点着色器调用。像这样:

顶点着色器:

attribute float nodesize;
varying float vNodesize;

void main() {
    ...
    vNodesize = nodesize;
    ...
}

几何着色器:

varying float vNodesize[];

void main() {
    ...vNodesize[i]...
}

名称是任意的,但当然两个着色器中的变化名称必须匹配。我希望你不要搞乱顶点着色器和几何着色器这两个术语。

答案 1 :(得分:-1)

您使用的是哪个开放版本?

来自Open GL语言规范(4.10.6)

  

在几何处理器上单次调用几何着色器可执行文件将在a上运行   声明的输入基元具有固定数量的顶点。这个单一的调用可以发出一个变量   组合成声明的输出基元类型的基元并传递给的顶点数   后续的管道阶段。

这意味着您需要指定几何体所假设的基本类型(点,线,三角形,四边形)。

如果我理解正确,您希望geom着色器为每个顶点发射一个立方体。因此,您应该将几何输入类型设置为point。

作为一个结果,geom着色器代码应该像这样开始:

varying float vNodesize[];

void main() {
    ...vNodesize[i]...
}

其中 i = 0 ,对于行数= 1,等等。