如何在GLSL中的几何着色器上获得少量顶点

时间:2013-04-03 16:55:26

标签: opengl glsl shader geometry-shader

我需要在顶点着色器处理后得到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();
}

compiller throw错误:“数组索引越界”

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

1 个答案:

答案 0 :(得分: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呈现此内容。