1

我在通过我的着色器传递数据时遇到了一些问题,尤其是几何着色器。我以前从未使用过几何着色器,所以我在理解它传递数据的方式时遇到了一些麻烦。

基本上,在几何着色器之前,我会使用输入/输出限定符将数据从顶点着色器传递到片段。就像我有:

顶点着色器!

out vec3 worldNormal;
out vec3 worldView;

片段着色器:

in vec3 ex_worldNorm;
in vec3 ex_worldView;

那么,对于几何着色器,我是否必须做这样的事情来传递数据?

in vec3 ex_worldNorm[];
in vec3 ex_worldView[];

out vec3 ex_worldNorm[];
out vec3 ex_worldNorm[];

我的问题是,如何在每个着色器之间正确传递数据?就像,这是这样做的方法吗?(因为它不适合我!)

4

1 回答 1

2

输入的无界数组对于几何着色器是正确的(大小将由布局限定符中的输入类型确定),但输出不能是数组。

通过将值写入所有输出变量然后调用EmitVertex (...). 在调用之间未写入的任何输出变量都EmitVertex (...)将是未定义的。


这是一个非常简单的示例几何着色器,它可以满足您的需求:

#version 330


layout (triangles) in; // This will automatically size your two arrays to 3, and also
                       //   defines the value of `gl_in.length ()`

in vec3 worldNormal [];
in vec3 worldView   [];

// ^^^ Names match up with Vertex Shader output


layout (triangle_strip, max_vertices = 3) out;

out vec3 ex_worldNorm;
out vec3 ex_worldView;

// ^^^ Names match up with Fragment Shader input


void main (void)
{
  // For each input vertex, spit one out
  for (int i = 0; i < gl_in.length (); i++) {
    ex_worldNorm = worldNormal [i];
    ex_worldView = worldView   [i];
    EmitVertex ();
  }
}
于 2014-11-06T22:33:44.373 回答