opengl несколько объектов, текстурированные и нетекстурированные, артефакты

Я рисую рамку с висящими на ней маятниками, к маятникам применена текстура, а к рамке текстур нет. Когда я показываю оба, я получаю введите описание изображения здесь

Но когда я визуализирую только маятники, они рисуют правильно, и я получаю

введите здесь описание изображенияЯ не знаю, почему это так. Я взорвал маятники, и текстуры, кажется, отображаются на вершины из кадра. Вот декларация вао

    // 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) );

и дисплей

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();

}

Это проблема с поддержкой вершин или что-то еще?


person user2755996    schedule 27.10.2013    source источник


Ответы (1)


Я не вижу glDisableVertexAttribArray вызовов в вашем коде. Это означало бы, что координаты текстуры все еще считываются из буфера texcoord. Также вам придется либо отвязать текстуру, либо, по крайней мере, использовать шейдер, который не читает текстуру.

person datenwolf    schedule 27.10.2013