所以我现在已经尝试了一段时间,将顶点属性数组传递给几何着色器。它是一个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);
我做错了吗?
答案 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,等等。