glDrawArraysInstanced是不是在OpenGL中进行多次绘制调用?

时间:2014-12-16 02:12:03

标签: c++ opengl glsl shader tesselation

我正在尝试绘制两个矩形块(用于曲面细分),我想将它们从0,0绘制到1,1以及从1,0到2,1

我正在使用GL_PATCHES将四边形发送到我的图形管道

齐次坐标中的顶点数据是

float vertices[32] = {
0.0, 0.0, 0.0, 1.0, //1st rec
1.0, 0.0, 0.0, 1.0,
1.0, 1.0, 0.0, 1.0,
0.0, 1.0, 0.0, 1.0,
  1.0, 0.0, 0.0, 1.0, //2nd rec
  2.0, 0.0, 0.0, 1.0,
  2.0, 1.0, 0.0, 1.0,
  1.0, 1.0, 0.0, 1.0
   };

在C ++代码中

glPatchParameteri(GL_PATCH_VERTICES, 4);
glDrawArraysInstanced(GL_PATCHES, 0, 4, 2);

但是我只在屏幕上从0,0到1,1得到一个矩形补丁。我不明白为什么它不绘制第二个矩形

我的镶嵌评估着色器

vec4 vert= vec4(0.0, 0.0, 0.0, 1.0);
vert.x = gl_in[0].gl_Position.x + gl_TessCoord.x;
vert.y = gl_in[0].gl_Position.y + gl_TessCoord.y;

我将此顶点转换为vec4并将其传递给gl_Position

1 个答案:

答案 0 :(得分:1)

glDrawArraysInstanced绘制了指定数据的多个实例。在你的情况下,它绘制两个顶点0到4的两倍,这给你两个四边形位于相同的位置。

我建议你只使用glDrawArrays(GL_PATCHES,0,8)代替,但你也可以根据gl_InstanceID保持你的绘图调用并在顶点着色器中进行翻译。