2012-12-06 31 views
3
圖像正道

(我已經更新代碼的新更好的)顯示用C++用OpenGL

http://www.flickr.com/photos/pkerkm/8251188947/in/photostream 好的方向

http://www.flickr.com/photos/pkerkm/8252258464/in/photostream 壞的方向

我們正在使用土壤庫 C++ openGL

我們在顯示的圖像之一上繪製了N,S,W,E的符號,因爲我們認爲圖像翻轉或顯示不正確。我們是對的,但不知道爲什麼以及如何解決它。我們的W向上,E向下,S向右,N向左。這意味着符號N位於左側,它應該位於最上面的位置。

這裏是我們生成3 dimmentional陣列和我們的圖片的代碼。

void genTex(){ 
texture[0]=SOIL_load_OGL_texture // load an image file directly as a new OpenGL  texture 
    (
     "C:\\Users\\Pkerkm\\Documents\\Visual Studio 2010\\Projects\\files\\gameprojecgraphics\\bloodwall2.png", 
     SOIL_LOAD_AUTO, 
     SOIL_CREATE_NEW_ID, 
     SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT 
    ); 
glBindTexture(GL_TEXTURE_2D, texture[0]); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
//glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
//glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
} 

void /*GraphicsEngine::*/generateMap(){ 
    int i, k, j; 
    double coordinates[8][3]; 
    for(i=0; i<MAPWIDTH; i++){ 
    for(j=0; j<MAPHEIGHT; j++){ 
     for(k=0; k<MAPDEPTH; k++){ 
    if(stage[i][j][k]==0){ 
     //do nothing 
    } 
    else if (stage[i][j][k]==1){ 
     getWallCoordinates(coordinates, i, j, k); 
    if(j==0 || stage[i][j-1][k]==0){ 
     drawWall(coordinates[0],coordinates[1],coordinates[2],coordinates[3],true); 
    } 
     if(j<MAPHEIGHT-1 && stage[i][j+1][k]==0){drawWall(coordinates[7],coordinates[6],coordinates[5],coordinates[4],false); 
    } 
    if(i==0 || stage[i-1][j][k]==0){drawWall(coordinates[7],coordinates[4],coordinates[0],coordinates[3],false); 
    } 
    if(k==MAPDEPTH-1 || stage[i][j][k+1]==0){drawWall(coordinates[7],coordinates[3],coordinates[2],coordinates[6],false); 
    } 
    if(i==MAPWIDTH-1 || stage[i+1][j][k]==0){drawWall(coordinates[6],coordinates[2],coordinates[1],coordinates[5],false); 
    } 
    if(k==0 || stage[i][j][k-1]==0){drawWall(coordinates[5],coordinates[1],coordinates[0],coordinates[4],false); 
} 
    } 
    } 
    } 
} 
} 
void /*GraphicsEngine::*/drawWall(double a[3],double b[3], double c[3], double d[3], bool floor){ 
//glColor3f(1.0,0.0,1.0); 


if(floor){ 
    glBindTexture(GL_TEXTURE_2D, texture[1]); 
}else{ 
    glBindTexture(GL_TEXTURE_2D, texture[0]); 
} 
//GLuint tex; 
//glGenTextures(1, &tex); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE); 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
//glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
//glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

//glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

//glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 

//tex = LoadTexture("wallsprite.png"); 
//glBindTexture(GL_TEXTURE_2D, tex); 
glEnable(GL_TEXTURE_2D); 
glBegin(GL_QUADS); 
    //glNormal3f(0, 1, 0); 
    glTexCoord2d(0.0,0.0); 
    glVertex3dv(a); 
    glTexCoord2d(-1.0,0.0); 
    //glVertex3dv(b); 
    glVertex3dv(d); 
    glTexCoord2d(-1.0,-1.0); 
    glVertex3dv(c); 
    glTexCoord2d(0.0,-1.0); 
    //glVertex3iv(d); 
    glVertex3dv(b); 
glEnd(); 
/*glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0); 
    glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0); 
    glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0); 
    glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -1.0, 0.0);*/ 
glDisable(GL_TEXTURE_2D); 
} 

}

我想這個問題是在這裏,但不知道如何解決它

void /*GraphicsEngine::*/getWallCoordinates(double coordinates[8][3], double x, double y, double z){ 
int i; 
for(i=0;i<8; i++){ 
    if((i/4)>=1){ 
     coordinates[i][1]=BLOCKHEIGHT*(y+1); 
    }else{ 
     coordinates[i][1]=BLOCKHEIGHT*y; 
    } 
    if((i/2)%2==0){ 
     coordinates[i][2]=BLOCKDEPTH*z; 
    }else{ 
     coordinates[i][2]=BLOCKDEPTH*(z+1); 
    } 
    if((i%4)%3==0){ 
     coordinates[i][0]=BLOCKWIDTH*x; 
    }else{ 
     coordinates[i][0]=BLOCKWIDTH*(x+1); 
    } 
} 

}

+2

opengl紋理使用左下角爲(0,0),其中大多數其他應用程序或普通圖像使用左上角作爲(0,0),這會導致圖像在未讀取時顛倒顯示以正確的方式。我不知道爲什麼你的圖像翻轉x和y,但它可能與你如何讀取你的圖像 – Fonix

+0

我已經修好了一些東西,但現在我有一個牆,其中N是左,W是下。還有沒有辦法在這裏發佈圖片?或沒有。 – Pkerkm

+0

圖片與鏈接完全相同,但是它們前面有一個感嘆號:![圖片文字](網站鏈接到圖片) – Fonix

回答

2

簡單地切換圍繞glTexCoord2f指令旋轉紋理90度。

+0

好吧,現在一切都朝着正確的方向,現在的問題是座標無形的牆在1,1,19和29,1,19。第三個數字增加,你穿過牆。所以想象一個盒子,x,y和z。牆壁繪製正確,但z牆太早繪製,其中1,1,19和29,1,19。那裏有一堵牆。牆壁應該在29,1,29和1,1,29。任何意見? – Pkerkm