Este es el trato. Si dejo el código con glGenBuffers(1, vertexBuffers), el código se compila obras. Pero, pensé que debería ser 2, ya que vertexBuffers es de tamaño dos.

Que me estoy perdiendo algo?

Código de abajo:

-(void)drawRect:(NSRect)dirtyRect
{    
//get program ID for shader program
GLuint programID = [self loadShaders];
//get new dimensions
NSSize dim = [self frame].size;
//clear the background with color
glClearColor(0.0, 0.0, 0.0, 0.4);
glDepthRange(0.1, 100.0);
glViewport(0, 0, dim.width, dim.height);
glClear(GL_COLOR_BUFFER_BIT);
//vertex data
GLfloat vertexPositionData[] = { -dim.width/2, -dim.height/2, 0.0, 5.0,
dim.width/2, -dim.height/2, 0.0, 5.0,
0.0, dim.height/2, 0.0, 5.0};
GLfloat vertexColorData[] = {1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.5, 0.0, 0.0, 1.0, 0.5};
GLfloat scaleMatrixData[] = {1/(dim.width/2), 0.0, 0.0, 0.0,
0.0, 1/(dim.height/2), 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0};
GLint scaleMatrixUniform = glGetUniformLocation(programID, "scaleMatrix");
//generate a buffer for our triangle
glGenBuffers(1, vertexBuffers);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffers[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositionData), vertexPositionData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffers[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexColorData), vertexColorData, GL_STATIC_DRAW);
//glBindBuffer(GL_ARRAY_BUFFER, 0);
glUseProgram(programID);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffers[0]);
glEnableVertexAttribArray(VERTEX_POS_INDEX);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffers[1]);
glEnableVertexAttribArray(VERTEX_COLOR_INDEX);
glVertexAttribPointer(VERTEX_POS_INDEX, VERTEX_POS_SIZE, GL_FLOAT, GL_FALSE, 0, vertexPositionData);
glVertexAttribPointer(VERTEX_COLOR_INDEX, VERTEX_COLOR_SIZE, GL_FLOAT, GL_FALSE, 0, vertexColorData);
glUniformMatrix4fv(scaleMatrixUniform, 1, GL_FALSE, scaleMatrixData);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glUseProgram(0);
//flush buffer
glFlush();
[[self openGLContext] flushBuffer];
}
¿Cuál es la declaración de vertexBuffers?
Menciono que vertexBuffers es de tamaño dos de la matriz.

OriginalEl autor xBACP | 2012-08-24

3 Comentarios

  1. 20

    glGenBuffers no funciona exactamente como lo que usted espera. Cuando llame glGenBuffers, que en realidad no crear nada. Sólo devuelve una lista de enteros que no son actualmente se utiliza como buffer de nombres.

    La real ‘objeto’ no se crea hasta que llame glBindBuffer. Por lo que sólo puede hacer cualquier número entero te gusta y pasarla a glBindBuffer y un documento de búfer en la que se crearán índice. glGenBuffers en realidad no es necesario en absoluto, simplemente están ahí como una función de conveniencia para darle un boleto entero.

    Así que si usted acaba de crear una matriz de enteros aleatorios, siempre y cuando ninguno de ellos se superponen, puede utilizar la lista de buffers sin llamar glGenBuffers. Es por eso que el código funciona si usted diga glGenBuffers para crear 1 o 2 buffers. Mientras usted tiene dos búferes con dos nombres diferentes, no importa donde el entero vino.

    Una pequeña demostración:

    int buf;
    glGenBuffers(1, &buf);
    glIsBuffer(buf); //FALSE - buffer has not been created yet
    glBindBuffer(GL_ARRAY_BUFFER, buf);
    glIsBuffer(buf); //TRUE - buffer created on bind
    En la más reciente OpenGL glGenBuffers es necesario afaik.
    También, IsBuffer debe devolver true no de acuerdo a las especificaciones: returns TRUE if buffer is the name of an buffer object. If buffer is zero, or if buffer is a non-zero value that is not the name of an buffer object, IsBuffer returns FALSE.
    Especificaciones acerca de glGenBuffers requisito: An INVALID_OPERATION error is generated if buffer is not zero or a name returned from a previous call to GenBuffers, or if such a name has since been deleted with DeleteBuffers
    Hmm, yo no era consciente de que había cambiado. Mirando en la página de manual de glIsBuffer, veo A name returned by glGenBuffers, but not yet associated with a buffer object by calling glBindBuffer, is not the name of a buffer object. , que parece estar en desacuerdo con los demás estados.
    Parece que esto podría haber cambiado en la versión 3.2, para el núcleo de perfil. Gracias por traer a mi atención. Changelog: fix BindBuffer (section 2.9.1), BeginQuery (section 2.15), and BindTexture (section 3.8.1) to only generate errors for user generated names in the core profile

    OriginalEl autor Tim

  2. 8

    Suponiendo que vertexBuffers se declara como algo como:

    GLuint vertexBuffers[2];

    entonces el código es, probablemente, no se muy bien haciendo lo que usted piensa. El primer argumento para glGenBuffers() es el número de buffers que se desea generar, y el segundo argumento es un puntero a un array de que muchos de los buffers. Así, usted probablemente querrá hacer:

    glGenBuffers (2, vertexBuffers);

    Este le dice a OpenGL para generar 2 búfer de nombres y almacenarlos en 2 lugares contiguos en memoria comenzando en la dirección de vertexBuffers.

    Entiendo tu comentario. Sin embargo, vertexBuffers es de tamaño 2, pero en mi código tengo este: glGenBuffers(1, vertexBuffers) y el programa funciona. Si puedo cambiar el 1 a 2, ya no muestra el triángulo.
    Si usted mira de Tim respuesta a continuación, se explica por qué funciona incluso cuando no generar tanto de los buffers. Es un capricho de cómo OpenGL funciona, pero probablemente no es lo que pretende.

    OriginalEl autor user1118321

  3. 2

    Me di cuenta de esto ayer, tengo que hacer un glBindBuffer(GL_ARRAY_BUFFER, 0) después de cada uno de los glBufferData(…).

    OriginalEl autor xBACP

Dejar respuesta

Please enter your comment!
Please enter your name here