0

顶点着色器处理后我需要得到 4 个顶点。具有目标的原始(四边形)绘图:GL_TRIANGLE_STRIP。

我的代码:

layout(lines_adjacency) in;
layout(triangle_strip, max_vertices = 4) out;

in vs_output
{
   vec4 color;
} gs_in[];

out gs_output
{
   vec2 st   ;
   vec4 color;
} gs_out;

void main()
{
   gl_Position  = gl_in[0].gl_Position;
   gs_out.st    = vec2(0.0f, 0.0f);
   gs_out.color = gs_in[0].color;
   EmitVertex();

   gl_Position  = gl_in[1].gl_Position;
   gs_out.st    = vec2(0.0f, 1.0f);
   gs_out.color = gs_in[1].color;
   EmitVertex();

   gl_Position  = gl_in[2].gl_Position;
   gs_out.st    = vec2(1.0f, 0.0f);
   gs_out.color = gs_in[2].color;
   EmitVertex();

   gl_Position  = gl_in[3].gl_Position;
   gs_out.st    = vec2(1.0f, 1.0f);
   gs_out.color = gs_in[3].color;
   EmitVertex();

   EndPrimitive();
}

编译器抛出错误:“数组索引超出范围”

我如何在几何着色器上获得 4 个顶点?

4

1 回答 1

2

具有目标的原始(四边形)绘图:GL_TRIANGLE_STRIP。

原始类型必须与您的输入原始类型匹配。只需用 绘制GL_LINES_ADJACENCY,每 4 个顶点为一个独立的四边形。

更好的是,不要再用几何着色器破坏你的表现了。最好将纹理坐标作为输入传递。或者,如果做不到这一点,请在顶点着色器中执行此操作:

out vec2 st;
const vec2 texCoords[4] = vec2[4](
  vec2(0.0f, 0.0f),
  vec2(0.0f, 1.0f),
  vec2(1.0f, 0.0f),
  vec2(1.0f, 1.0f)
);

void main()
{
  ...

  st = texCoords[gl_VertexID % 4];

  ...
}

假设您使用glDrawArrays而不是glDrawElements.

于 2013-04-04T12:29:03.100 回答