0

スカイボックスにテクスチャを付けようとして、「ImageLoader::createJPG」でテクスチャをうまくロードすると、適切な形式でテクスチャ ファイルがロードされ、すべての表示ループでそれらをロードすると、私のコードはそれをポリゴンにうまくテクスチャリングします (これは明らかにひどいパフォーマンスヒット。)

しかし、init() で同じコードを一度ロードしようとすると、ディスプレイはそれらが存在するとさえ考えません (デフォルトの色の立方体になってしまいます)。

Gluint スカイフロント; #includes の直後のファイルの先頭で、他の何よりも前に宣言されています。

enable または texParameters の量が init() にテクスチャをロードさせないようです。何か案は?

GLuint skyTop;
GLuint skyFront;
GLuint skyBack;
GLuint skyBottom;
GLuint skyLeft;
GLuint skyRight;


void display()                                  
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);

glLoadIdentity();




glTranslatef(0,0,-0.6);
glTranslatef(0, -0.4, -1);        


glPushMatrix(); 
glDisable(GL_DEPTH_TEST);

glDisable(GL_LIGHTING);
glDisable(GL_BLEND);
//glEnable(GL_LIGHT0);
//glTranslatef(camPos.x, camPos.y,camPos.z);
//glDepthMask(GL_FALSE);
glDisable(GL_CULL_FACE);
//draw skybox
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glColor3f(0.0, 1.0, 0.0);
glTranslatef(0.0,-2.0,-20.0);
        GLuint skyTop = ImageLoader::createJPG("../TestModels/top.jpg");
        GLuint skyBottom = ImageLoader::createJPG("../TestModels/bottom.jpg");
        GLuint skyLeft = ImageLoader::createJPG("../TestModels/left.jpg");
        GLuint skyFront = ImageLoader::createJPG("../TestModels/front.jpg");
        GLuint skyRight = ImageLoader::createJPG("../TestModels/right.jpg");
        GLuint skyBack = ImageLoader::createJPG("../TestModels/back.jpg");

        //FRONT
            glBindTexture(GL_TEXTURE_2D, skyFront);
            glBegin(GL_QUADS);
                glTexCoord2f(0, 0); glVertex3f(-SKYBOXSIZE, SKYBOXSIZE, -SKYBOXSIZE);       //A
                glTexCoord2f(0, 1); glVertex3f(-SKYBOXSIZE, -SKYBOXSIZE, -SKYBOXSIZE);      //B
                glTexCoord2f(1, 1); glVertex3f(SKYBOXSIZE, -SKYBOXSIZE, -SKYBOXSIZE);       //C
                glTexCoord2f(1, 0); glVertex3f(SKYBOXSIZE, SKYBOXSIZE, -SKYBOXSIZE);        //D
            glEnd();

            glBindTexture(GL_TEXTURE_2D, skyLeft);
            //LEFT
            glBegin(GL_QUADS);
                glTexCoord2f(1, 1); glVertex3f(SKYBOXSIZE, SKYBOXSIZE, -SKYBOXSIZE);        //D
                glTexCoord2f(0, 1); glVertex3f(SKYBOXSIZE, -SKYBOXSIZE, -SKYBOXSIZE);       //C
                glTexCoord2f(0, 0); glVertex3f(SKYBOXSIZE, -SKYBOXSIZE, SKYBOXSIZE);        //E
                glTexCoord2f(1, 0); glVertex3f(SKYBOXSIZE, SKYBOXSIZE, SKYBOXSIZE);     //F
            glEnd();

などなど

編集:

init() コードは次のようになります。

void init()
{
glewInit()

    GLuint skyFront = ImageLoader::createJPG("../TestModels/front.jpg"); //load the texture, damnit

glClearColor(0.0,0.0,0.0,0.0);                      

glShadeModel(GL_SMOOTH);

//light position and colour
GLfloat light_position[] = { 0.0, 0.0, 20.0,0.0 };
GLfloat white_light[] = {0.8,0.8,0.8,0.0};
GLfloat diff_light[] = {1.0,1.0,1.0,0.0};
GLfloat spec_light[] = {1.0,1.0,1.0,0.0};
glLightfv(GL_LIGHT0, GL_AMBIENT, white_light);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diff_light);
glLightfv(GL_LIGHT0, GL_SPECULAR, spec_light);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);


//ambient light
GLfloat ambient[] = {0.3,0.3,0.3};
glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);

//diffuse material component
GLfloat diff[] = {0.6,0.6,0.6};
glMaterialfv(GL_FRONT, GL_DIFFUSE, diff);

//specular material component
GLfloat WhiteSpec[] = {1,1,1};
glMaterialfv(GL_FRONT, GL_SPECULAR, WhiteSpec);

GLfloat shininess = 50;
glMaterialf(GL_FRONT, GL_SHININESS, shininess);

//ENABLE LIGHTING AND DEPTH TEST
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);




glEnable(GL_DEPTH_TEST);

cout << " loading model " << endl;
if(objLoader.loadModel("../TestModels/hummer.obj", model))//returns true if the model is loaded, puts the model in the model parameter
{
    cout << " model loaded " << endl;       

    //if you want to translate the object to the origin of the screen,
    //first calculate the centre of the object, then move all the vertices
    //back so that the centre is on the origin.
    model.calcCentrePoint();
    model.centreOnZero();


    model.calcVertNormalsUsingOctree();  //the method will construct the octree if it hasn't already been created.


    //turn on VBO by setting useVBO to true in 3dmodel.cpp default constructor - only permitted on 8 series cards and higher
    if(!model.useImmediateMode || model.useVBO)
    {
        model.initDrawElements();
    }
    if(model.useVBO)
    {
        model.initVBO();
        model.deleteVertexFaceData();
    }

}
else
{
    cout << " model failed to load " << endl;
}
}

残りの GL コマンドはすべて実行され、ロードしたモデルも問題なく実行されます。TexPerameters などは ImageLoader で定義されています。

4

1 に答える 1

0

これらはグローバルです:

GLuint skyTop;
GLuint skyFront;
GLuint skyBack;
GLuint skyBottom;
GLuint skyLeft;
GLuint skyRight;

しかし、これはローカルを設定します:

void init()
{
    glewInit()

    GLuint skyFront = ImageLoader::createJPG("../TestModels/front.jpg"); //load the texture, damnit

skyFront 変数を再宣言する必要はなく、代わりにグローバルを使用してください。

于 2012-12-22T09:49:18.860 に答える