glDrawArrays奇怪地绘制数组

时间:2016-07-22 09:42:03

标签: c++ opengl

当我尝试使用glDrawArrays绘制圆圈时,它会显示circle

的四分之一

由代码生成的VBO是正确的。 BTW没有像0,0,0这样的坐标。 它似乎只绘制正顶点,但如果我将顶点乘以-1,glDrawArrays将它绘制在屏幕的另一侧。 这是我的代码:

uint un_vertexArraySize = 20;
float f_radius = 1.0f;
float f_degrees = 0;
GLfloat f_vert[un_vertexArraySize*3];
// Generate circle vertices
for (int i=0; i<un_vertexArraySize*3; i+=3)
{
    f_vert[i] = cos(f_degrees*M_PI/180)*f_radius;
    f_vert[i+1] = sin(f_degrees*M_PI/180)*f_radius;
    f_vert[i+2] = 0.0f;
    f_degrees += (360/un_vertexArraySize);
}
// Do buffer stuff
GLuint vbo;
glGenBuffers(1, &vbo);
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, un_vertexArraySize*3,
             f_vert, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0); // unbind VBO
glBindVertexArray(0); // unbind VAO

// Start loop
    glClearColor(0.0,0.0,0.0,0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    shader.Use();
    glBindBuffer(GL_ARRAY_BUFFER, vao);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glDrawArrays(GL_LINE_STRIP, 0, un_vertexArraySize*3);
    glDisableVertexAttribArray(0);
    shader.UnUse();
// End loop

Frag shader:

#version 130
void main(void)
{
    gl_FragColor[0] = gl_FragCoord.x/640.0;
    gl_FragColor[1] = gl_FragCoord.y/480.0;
    gl_FragColor[2] = 0.2;
    gl_FragColor[3] = 1.0f;
}

垂直着色器:

#version 130
attribute vec3 coord3d;

void main(void)
{
    vec4 temp = vec4(coord3d, 1.0f);
    gl_Position = temp;
}

我试图谷歌搜索或在stackoverflow上找到,但没有。

1 个答案:

答案 0 :(得分:2)

我现在无法对此进行测试,但是在glBufferData中你使用的是un_vertexArraySize * 3,即元素的数量,但我认为你错过了乘以4(每个浮点数的字节数),因此大小以字节为单位指定。这可以解释为什么你只画了四分之一的圆圈