2013-10-27 56 views
0

我正在繪製一個框架與鐘擺懸掛它,鐘擺有紋理應用,但框架沒有紋理。當我同時顯示我得到 enter image description hereopengl多個對象,紋理和非紋理,artifacting

但是,當我只渲染擺錘他們正確繪製和我得到

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

}

這是保持verteces問題還是別的什麼?

回答

0

我在代碼中看不到​​調用。這意味着,仍然有紋理座標從texcoord緩衝區讀取。此外,您必須解除綁定紋理,或者至少使用不從紋理中讀取的着色器。