0

I am drawing a frame with pendulums hanging off of it, the pendulums have a texture applied but the frame has no textures. When I display both i get enter image description here

But when i render only the pendulums they draw correctly and i get

enter image description here I'm unsure of why this is. I blew the pendulums up and the textures seem to be mapping to the vertices from the frame. Here is the vao decleration

    // Create a vertex array object
glGenVertexArrays( 1, &vao );
glBindVertexArray( vao );

// Create and initialize two buffer objects
glGenBuffers( 2, buffers);

//one buffer for the vertices and colours
glBindBuffer( GL_ARRAY_BUFFER, buffers[0]);
glBufferData( GL_ARRAY_BUFFER, numFPointBytes + numVertexColourBytes,NULL, GL_STATIC_DRAW );
glBufferSubData( GL_ARRAY_BUFFER, 0, numFPointBytes, fPoints );
glBufferSubData( GL_ARRAY_BUFFER, numVertexPositionBytes, numVertexColourBytes, frameVertexColours);

//one buffer for the indices
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, buffers[1]);
glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof(frameIndices),frameIndices, GL_STATIC_DRAW );

// set up vertex arrays
GLuint fVPosition = glGetAttribLocation( program, "vPosition" );
glEnableVertexAttribArray( fVPosition );
glVertexAttribPointer( fVPosition, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0) );

GLuint fVColor = glGetAttribLocation( program, "vColor" );
glEnableVertexAttribArray( fVColor );
glVertexAttribPointer( fVColor, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(numVertexPositionBytes) );

glBindVertexArray(0);



glGenVertexArrays( 2, &pVao );
glBindVertexArray( pVao );

// Create and initialize two buffer objects
glGenBuffers( 1, pBuffers);

//glBufferSubData( GL_ARRAY_BUFFER, numPVertexPositionBytes, numPVertexColourBytes, pCols);

glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, pBuffers[0]);
glEnableVertexAttribArray(0);
glBufferData( GL_ELEMENT_ARRAY_BUFFER,numPVertexPositionBytes+ numPVertexColourBytes+numTexCoordBytes, NULL, GL_STATIC_DRAW );
glBufferSubData( GL_ARRAY_BUFFER, 0, numPVertexPositionBytes, pendulumVertexPos );
glBufferSubData( GL_ARRAY_BUFFER, numPVertexPositionBytes, numPVertexColourBytes, pCols);
glBufferSubData( GL_ARRAY_BUFFER, numPVertexPositionBytes+numPVertexColourBytes, numTexCoordBytes, texCoords);

// set up vertex arrays
  GLuint pVPosition = glGetAttribLocation( program, "vPosition" );
  glEnableVertexAttribArray( pVPosition );
  glVertexAttribPointer( pVPosition, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0) );
  GLuint pVColor = glGetAttribLocation( program, "vColor" );
  glEnableVertexAttribArray( pVColor );
  glVertexAttribPointer( pVColor, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(numPVertexPositionBytes) );
  GLuint vTexCoord = glGetAttribLocation( program, "vTexCoord" );
  glEnableVertexAttribArray(vTexCoord);
  glVertexAttribPointer( vTexCoord, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(numPVertexPositionBytes+numPVertexColourBytes) );

and the display

void
display( void )
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );


modelViewStack.loadIdentity();
modelViewStack.pushMatrix();
glDisable(GL_TEXTURE_2D);


modelViewStack.lookAt(radius*sin(theta)*cos(phi),
                        radius*sin(theta)*sin(phi),
                        radius*cos(theta),
                        0.0,0.0,0.0,
                        0.0,1.0,0.0);
modelViewStack.rotatef(rotate,0.0,1.0,0.0);

glUniformMatrix4fv(modelView, 1, GL_FALSE, modelViewStack.getMatrixf());

glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
glBufferSubData(GL_ARRAY_BUFFER, 0, numVertexPositionBytes, frameVertexPositions );
glBufferSubData( GL_ARRAY_BUFFER, numVertexPositionBytes, numVertexColourBytes, frameVertexColours);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]);
//Indexing into vertices we need to use glDrawElements
glDrawElements(GL_TRIANGLES, NumFIndices, GL_UNSIGNED_BYTE, 0);

modelViewStack.popMatrix();

lineScale = 1.0/8.0;
pendulumScale = 1.0/8.0;


for(int i = 0; i<NumPendulums; i++){
    if(!active[i]){
        currentTheta[i] = 0.0;
    }
    modelViewStack.loadIdentity();
    modelViewStack.pushMatrix();
    glEnable(GL_TEXTURE_2D);

    modelViewStack.lookAt(radius*sin(theta)*cos(phi),
                            radius*sin(theta)*sin(phi),
                            radius*cos(theta),
                            0.0,0.0,0.0,
                            0.0,1.0,0.0);

    modelViewStack.scalef(pendulumScale,pendulumScale,pendulumScale);
    modelViewStack.rotatef(currentTheta[i],0.0,0.0,1.0);
    modelViewStack.rotatef(rotate,0.0,1.0,0.0);
    modelViewStack.translatef(dhVals[i][1],dhVals[i][4],0.0);

    glUniformMatrix4fv(modelView, 1, GL_FALSE, modelViewStack.getMatrixf());


    glBindVertexArray(pVao);
    glBindBuffer(GL_ARRAY_BUFFER, pBuffers[0]);
    glDrawArrays(GL_TRIANGLES,0,NumPVertices);


    glBindVertexArray(0);
    glDisable(GL_TEXTURE_2D);
    modelViewStack.popMatrix();


    modelViewStack.loadIdentity();
    modelViewStack.pushMatrix();
    modelViewStack.lookAt(radius*sin(theta)*cos(phi),
                            radius*sin(theta)*sin(phi),
                            radius*cos(theta),
                            0.0,0.0,0.0,
                            0.0,1.0,0.0);
    modelViewStack.rotatef(currentTheta[i],0.0,0.0,1.0);
    modelViewStack.rotatef(rotate,0.0,1.0,0.0);
    modelViewStack.scalef(pendulumScale,lineScale,pendulumScale);
    modelViewStack.translatef(dhVals[i][1],0.0,0.0);


    glUniformMatrix4fv(modelView, 1, GL_FALSE, modelViewStack.getMatrixf());

    glEnableVertexAttribArray(0);
    glBindVertexArray(lineVao);
    glDrawArrays(GL_LINES,0,NumLVertices);

    glBindVertexArray(0);
    modelViewStack.popMatrix();

    float temp = changeAngle(currentTheta[i], dhVals[i][5], dhVals[i][6], dhVals[i][7], i);
    currentTheta[i] = temp;
    lineScale+=0.09;

}


    projectionStack.loadIdentity();
    projectionStack.ortho(-20.0,20.0,-20.0,10.0,-20.0,20.0);

    calculateLighting(fPoints,frameVertexColours,NumFSides,6);
    calculateLighting(pPoints,pCols,NumPSides,6);


    glUniformMatrix4fv(projection, 1, GL_FALSE, projectionStack.getMatrixf());

glutSwapBuffers();

}

Is this a problem with maintaining verteces or is it something else?

user2755996
  • 103
  • 2
  • 6

1 Answers1

0

I don't see glDisableVertexAttribArray calls in your code. Which would mean, that there's still texture coordinates read from the texcoord buffer. Also you'll have to either unbind the texture or at least use a shader that doesn't read from the texture.

datenwolf
  • 149,702
  • 12
  • 167
  • 273