opengl多个对象,纹理和非纹理,伪像

时间:2013-10-27 07:26:29

标签: c++ opengl textures buffer vao

我正在绘制一个挂着它的钟摆的框架,钟摆有一个纹理,但框架没有纹理。当我显示两个我得到 enter image description here

但是,当我只渲染他们正确绘制的钟摆时,我得到了

enter image description here 我不确定为什么会这样。我把钟摆吹起来,纹理似乎映射到框架的顶点。这是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) );

和显示

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

}

这是维持椎体的问题还是其他问题?

1 个答案:

答案 0 :(得分:0)

我的代码中没有看到glDisableVertexAttribArray次调用。这意味着,还有从texcoord缓冲区读取的纹理坐标。此外,您必须解除纹理绑定或至少使用不从纹理读取的着色器。