2016-07-22 58 views
2

当尝试使用绘制圆调用glDrawArrays它显示的circle调用glDrawArrays古怪绘制阵列

的VBO季度,由代码生成的是正确的。顺便说一句,没有像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 

破片着色器:

#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; 
} 

我试图谷歌,或找到计算器,但一无所获。

回答

2

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

+1

就像一个注释:而不是乘以'4',我会乘以sizeof(GLfloat)',因为那么它会更清晰地与该值相乘。 –

+0

我不好意思提这件事,那是一个更好的方法 –