0

そのため、openGL クラスの SOIL をいじっていましたが、プロジェクトで奇妙な問題が発生しています。それぞれ 3 つのビューポートを含む 2 つのウィンドウを表示し、テクスチャ付きの立方体または楕円体を描画して、奥行きと面のカリングについての理解を示します。形状はすべて正しく描画され、個別にテストすると、期待どおりに見えますが、両方のウィンドウを同時に有効にするとすぐに、ウィンドウ 1 でテクスチャリングが無効になります。以前に同様の質問を投稿したので、明確にするために、ウィンドウ 2 を無効にするか、ウィンドウ 2 でウィンドウ 1 の描画機能を使用すると、テクスチャリングが機能します。問題が発生するのは、両方のウィンドウが同時に表示される場合のみです。レンダリングされた形状の色も変更できましたが、

これは、初期化を伴う私のメイン コードです。 void main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

    glutInitWindowSize(750, 250);

    #pragma region WINDOW ONE INITIALISATION
    glutInitWindowPosition(0, 50);

    windowID[1] = glutCreateWindow("cubes");

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-400, 400, -400, 400, -500, 500);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glutDisplayFunc(DrawWindowOne);
    #pragma endregion 

    #pragma region WINDOW TWO INITIALISATION
    glutInitWindowPosition(0, 450);
    windowID[1] = glutCreateWindow("ellipsoids");

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-60, 60, -60, 60, 60, 200);
    gluLookAt(0, 0, 120, 0, 0, 0, 0, 1, 0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glutDisplayFunc(DrawWindowTwo);
    #pragma endregion

    LoadTextures(); // Handles the SOIL_load_OGL_Texture() lines. Works 100%

    gluQuadricTexture(quad, GL_TRUE);
}

これらは2つのウィンドウ描画関数です

void DrawWindowOne()
{
    glClearColor(0.0, 0.0, 0.0, 0.0);    
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

#pragma region Viewport One 

    glViewport(0, 0, 250, 250);                     

    glMatrixMode(GL_MODELVIEW);         

    DrawCubes();

#pragma endregion
#pragma region Viewport Two 

    glViewport(250, 0, 250, 250);   

    glMatrixMode(GL_MODELVIEW);     

    glEnable(GL_CULL_FACE);
    DrawCubes();
    glDisable(GL_CULL_FACE);

#pragma endregion
#pragma region Viewport Three   

    glViewport(500, 0, 250, 250);

    glMatrixMode(GL_MODELVIEW);

    glEnable(GL_DEPTH_TEST);
    DrawCubes();
    glDisable(GL_DEPTH_TEST);

#pragma endregion

    glFlush();
    glutSwapBuffers();
}

void DrawWindowTwo()
{
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     

    #pragma region Viewport One 

    glViewport(0, 0, 250, 250); 

    glMatrixMode(GL_MODELVIEW); 
    DrawEllipsoids();

    #pragma endregion
    #pragma region Viewport Two 

    glViewport(250, 0, 250, 250);   

    glMatrixMode(GL_MODELVIEW); 

    glEnable(GL_CULL_FACE);
    DrawEllipsoids();
    glDisable(GL_CULL_FACE);

    #pragma endregion
    #pragma region Viewport Three   

    glViewport(500, 0, 250, 250);   

    glMatrixMode(GL_MODELVIEW);     

    glEnable(GL_DEPTH_TEST);
    DrawEllipsoids();
    glDisable(GL_DEPTH_TEST);

    #pragma endregion

    glFlush();
    glutSwapBuffers();
}

これは私のオブジェクト描画コードのほんの一部です。私はそれをかなり取り除いた。立方体の 1 つの面のみを描画します (すべてのビューポートが 1 つの面を描画する場合、同じ問題が発生することを確認しました)。

void DrawCubes()
{
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);   
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);   
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, textureID[0]);

    glBegin(GL_QUADS);
    glNormal3f(0.0, 0.0, -1.0); // front face
    glTexCoord2f(0.0, 0.0); glVertex3f(-a,-a,-a);
    glTexCoord2f(0.0, 1.0); glVertex3f(-a, a,-a);
    glTexCoord2f(1.0, 1.0); glVertex3f( a, a,-a);
    glTexCoord2f(1.0, 0.0); glVertex3f( a,-a,-a);
    glEnd()
    glDisable(GL_TEXTURE_2D);
}
4

1 に答える 1