glDrawArrays访问不好

时间:2014-04-21 20:53:15

标签: c++ opengl glsl pong

我正在尝试做一个简单的Pong游戏,但我遇到了一些问题。从本质上讲,我有一个带有x和amp的四个点的数组。 y值意味着代表一个硬编码的球,我需要让球正确显示。当我尝试使用glDrawArray时,我一直在崩溃,因为我在最后一个参数中传递的四个(意味着绘制四个顶点)超出了界限。知道为什么吗?

在我的设置中:

//put in vertices for ball
//point 1
ballPosArr[0] = 0.1; //x
ballPosArr[1] = 0.1; //y
//pt 2
ballPosArr[2] = -0.1;
ballPosArr[3] = 0.1;
//pt 3
ballPosArr[4] = 0.1;
ballPosArr[5] = -0.1;
//pt 4
ballPosArr[6] = -0.1;
ballPosArr[7] = 0.1;


//ball position buffer
GLuint buffer;
glGenBuffers( 1, &buffer);
glBindBuffer( GL_ARRAY_BUFFER, buffer);
glBufferData( GL_ARRAY_BUFFER, 8*sizeof(GLuint), ballPosArr, GL_STATIC_DRAW );
_buffers.push_back(buffer); //_buffers is a vector of GLuint's

// Initialize the attributes from the vertex shader
GLuint bPos = glGetAttribLocation(_shaderProgram, "ballPosition" );
glEnableVertexAttribArray(bPos);
glVertexAttribPointer(bPos, 2, GL_FLOAT, GL_FALSE, 0, &ballPosArr[0]);

在我的显示回调中:

GLuint bPos = glGetAttribLocation(_shaderProgram, "ballPosition");
glEnableVertexAttribArray(bPos);

//rebind buffers and send data again
//ball position
glBindBuffer(GL_ARRAY_BUFFER, _buffers[0]);
glVertexAttribPointer(bPos, 2, GL_FLOAT, GL_FALSE, 0, &ballPosArr[0]);
glDrawArrays( GL_POLYGON, 0, 4); //bad access error at 4

在我的vshader.txt中:

attribute vec2 ballPosition;

void main() {

}

1 个答案:

答案 0 :(得分:3)

如果你使用VBO,那么glVertexAttribPointer的最后一个参数是缓冲区的相对偏移量,而不是缓冲区的CPU地址。在您的情况下,为最后一个参数传递0,因为您要使用的顶点数据位于缓冲区的开头。