0

振り子がぶら下がっているフレームを描いています。振り子にはテクスチャが適用されていますが、フレームにはテクスチャがありません。両方を表示すると、 ここに画像の説明を入力

しかし、振り子だけをレンダリングすると、振り子は正しく描画され、

ここに画像の説明を入力 これがなぜなのかわかりません。振り子を爆破すると、テクスチャがフレームから頂点にマッピングされているように見えます。これがvao宣言です

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

}

これは頂点の維持に関する問題ですか、それとも別の問題ですか?

4

1 に答える 1

0

glDisableVertexAttribArrayコードに呼び出しが表示されません。つまり、texcoord バッファから読み取ったテクスチャ座標がまだ残っているということです。また、テクスチャのバインドを解除するか、少なくともテクスチャから読み取らないシェーダーを使用する必要があります。

于 2013-10-27T12:57:00.027 に答える