2013-01-01 30 views
0

我正在創建Minecraft的noob版本克隆。首先,我想渲染一個立方體並向所有面添加特定紋理以開始。我創建了一個Block類,其中包含來自輸​​入的頂點,並且具有名爲RenderBlock的輸出函數以使用附加的紋理渲染「塊」。OpenGl錯誤。運行時錯誤位置的多維數據集頂點?

這裏是輸入8個數組代表8個塊的8個頂點座標的函數。

void Block::SetVertices(float UL[],float UR[],float ZR[],float ZL[],float UL2[],float   UR2[],float ZR2[],float ZL2[]) 
{ 
    Front_Square[1][1]=UL[1]; 
    Front_Square[1][2]=UL[2]; 
    Front_Square[1][3]=UL[3]; 
    std::cout << "Front Top Left Coordinates" << std::endl;  
    std::cout << Front_Square[1][1] << ","<<Front_Square[1][2] << "," << Front_Square[1][3] << std::endl; 
    Front_Square[2][1]=UR[1]; 
    Front_Square[2][2]=UR[2]; 
    Front_Square[2][3]=UR[3]; 
    std::cout << "Front Top Right Coordinates" << std::endl;  
    std::cout << Front_Square[2][1] << ","<<Front_Square[2][2] << "," << Front_Square[2][3] << std::endl; 
    Front_Square[3][1]=ZR[1]; 
    Front_Square[3][2]=ZR[2]; 
    Front_Square[3][3]=ZR[3]; 
    std::cout << "Front Bottom Right Coordinates" << std::endl;  
    std::cout << Front_Square[3][1] << ","<<Front_Square[3][2] << "," << Front_Square[3][3] << std::endl; 
    Front_Square[4][1]=ZL[1]; 
    Front_Square[4][2]=ZL[2]; 
    Front_Square[4][3]=ZL[3]; 
    std::cout << "Front Bottom Left Coordinates" << std::endl;  
    std::cout << Front_Square[4][1] << ","<<Front_Square[4][2] << "," << Front_Square[4][3] << std::endl; 
    //--------------BACK SQUARE------------------------------------------------------------------------------------------------------------------------// 
    Back_Square[1][1]=UL2[1]; 
    Back_Square[1][2]=UL2[2]; 
    Back_Square[1][3]=UL2[3]; 

    Back_Square[2][1]=UR2[1]; 
    Back_Square[2][2]=UR2[2]; 
    Back_Square[2][3]=UR2[3]; 

    Back_Square[3][1]=ZR2[1]; 
    Back_Square[3][2]=ZR2[2]; 
    Back_Square[3][3]=ZR2[3]; 

    Back_Square[4][1]=ZL2[1]; 
    Back_Square[4][2]=ZL2[2]; 
    Back_Square[4][3]=ZL2[3]; 
}; 

這裏是函數渲染塊。

void Block::RenderBlock(const char*SideTexture) 
{ 
glEnable(GL_TEXTURE_2D); 
Tex[1]=loadTexture(SideTexture); 
glBindTexture(GL_TEXTURE_2D, Tex[1]); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glBegin(GL_QUADS); 
glTexCoord2f(0.0f, 1.0f); glVertex3f(Front_Square[1][1],Front_Square[1][2],Front_Square[1][3]);//FTL 
glTexCoord2f(1.0f, 1.0f); glVertex3f(Front_Square[2][1],Front_Square[2][2],Front_Square[2][3]);//FTR 
glTexCoord2f(1.0f, 0.0f); glVertex3f(Front_Square[3][1],Front_Square[3][2],Front_Square[3][3]);//FBR 
glTexCoord2f(0.0f, 0.0f); glVertex3f(Front_Square[4][1],Front_Square[4][2],Front_Square[4][3]);//FBL 
    glEnd(); 

    glBindTexture(GL_TEXTURE_2D, Tex[1]); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glBegin(GL_QUADS); 
glTexCoord2f(0.0f, 1.0f); glVertex3f(Back_Square[1][1],Back_Square[1][2],Back_Square[1][3]);//BTL 
glTexCoord2f(1.0f, 1.0f); glVertex3f(Back_Square[2][1],Back_Square[2][2],Back_Square[2][3]);//BTR 
glTexCoord2f(1.0f, 0.0f); glVertex3f(Back_Square[3][1],Back_Square[3][2],Back_Square[3][3]);//BBR 
glTexCoord2f(0.0f, 0.0f); glVertex3f(Back_Square[4][1],Back_Square[4][2],Back_Square[4][3]);//BBL 
    glEnd(); 


    glBindTexture(GL_TEXTURE_2D, Tex[1]); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glBegin(GL_QUADS); 
glTexCoord2f(0.0f, 1.0f); glVertex3f(Back_Square[1][1],Back_Square[1][2],Back_Square[1][3]);//BTL 
glTexCoord2f(1.0f, 1.0f); glVertex3f(Front_Square[1][1],Front_Square[1][2],Front_Square[1][3]);//FTL 
glTexCoord2f(1.0f, 0.0f); glVertex3f(Front_Square[4][1],Front_Square[4][2],Front_Square[4][3]);//FBL 
glTexCoord2f(0.0f, 0.0f); glVertex3f(Back_Square[4][1],Back_Square[4][2],Back_Square[4][3]);//BBL 
    glEnd(); 

    glBindTexture(GL_TEXTURE_2D, Tex[1]); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glBegin(GL_QUADS); 
glTexCoord2f(0.0f, 1.0f); glVertex3f(Back_Square[2][1],Back_Square[2][2],Back_Square[2][3]);//BTR 
glTexCoord2f(1.0f, 1.0f); glVertex3f(Front_Square[2][1],Front_Square[2][2],Front_Square[2][3]);//FTR 
glTexCoord2f(1.0f, 0.0f); glVertex3f(Front_Square[3][1],Front_Square[3][2],Front_Square[3][3]);//FBR 
glTexCoord2f(0.0f, 0.0f); glVertex3f(Back_Square[3][1],Back_Square[3][2],Back_Square[3][3]);//BBR 
    glEnd(); 

    glBindTexture(GL_TEXTURE_2D, Tex[1]); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glBegin(GL_QUADS); 
glTexCoord2f(0.0f, 1.0f); glVertex3f(Back_Square[4][1],Back_Square[4][2],Back_Square[4][3]);//BBL 
glTexCoord2f(1.0f, 1.0f); glVertex3f(Back_Square[3][1],Back_Square[3][2],Back_Square[3][3]);//BBR 
glTexCoord2f(1.0f, 0.0f); glVertex3f(Front_Square[3][1],Front_Square[3][2],Front_Square[3][3]);//FBR 
glTexCoord2f(0.0f, 0.0f); glVertex3f(Front_Square[4][1],Front_Square[4][2],Front_Square[4][3]);//FBL 
    glEnd(); 

    glBindTexture(GL_TEXTURE_2D, Tex[1]); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glBegin(GL_QUADS); 
glTexCoord2f(0.0f, 1.0f); glVertex3f(Back_Square[1][1],Back_Square[1][2],Back_Square[1][3]);//BTL 
glTexCoord2f(1.0f, 1.0f); glVertex3f(Back_Square[2][1],Back_Square[2][2],Back_Square[2][3]);//BTR 
glTexCoord2f(1.0f, 0.0f); glVertex3f(Front_Square[2][1],Front_Square[2][2],Front_Square[2][3]);//FTR 
glTexCoord2f(0.0f, 0.0f); glVertex3f(Front_Square[1][1],Front_Square[1][2],Front_Square[1][3]);//FTL 
    glEnd(); 
    glDisable(GL_TEXTURE_2D); 
    }; 

2陣列爲塊的污垢和草 污垢

float TL[] = {0.0f,-1.0f,1.0f,0.0f}; 
float TR[] = {0.0f,1.0f,1.0f,0.0f}; 
float BR[] = {0.0f,1.0f,-1.0f,0.0f}; 
float BL[] = {0.0f,-1.0f,-1.0f,0.0f}; 
float TL2[] = {0.0f,-1.0f,1.0f,-2.0f}; 
float TR2[] = {0.0f,1.0f,1.0f,-2.0f}; 
float BR2[] = {0.0f,1.0f,-1.0f,-2.0f}; 
float BL2[] = {0.0f,-1.0f,-1.0f,-2.0f} 

float DTL[] = {0.0f,-1.0f,1.0f+Grass_XChan,0.0f}; 
float DTR[] = {0.0f,1.0f,1.0f+Grass_XChan,0.0f}; 
float DBR[] = {0.0f,1.0f,-1.0f+Grass_XChan,0.0f}; 
float DBL[] = {0.0f,-1.0f,-1.0f+Grass_XChan,0.0f}; 
float DTL2[] = {0.0f,-1.0f,1.0f+Grass_XChan,-2.0f}; 
float DTR2[] = {0.0f,1.0f,1.0f+Grass_XChan,-2.0f}; 
float DBR2[] = {0.0f,1.0f,-1.0f+Grass_XChan,-2.0f}; 
float DBL2[] = {0.0f,-1.0f,-1.0f+Grass_XChan,-2.0f}; 

對不起長碼。這裏是Main.cpp,如果你想看到它。

#include <GL/glut.h> 
#include <iostream> 
#include <assert.h> 
#include <fstream> 
#include "block.h" 
using namespace std; 
float positionX = 0.0f; 
float positionY = 0.0f; 
float positionZ = -4.0f; 
float angle = 0.0f; 
float RotX=0.01f; 
float RotY=0.0f; 
float RotZ=0.0f; 
float Grass_XChan=2.0f; 
float Grass_ZChan=-2.0f; 
bool Render = true; 
Block Dirt; 
Block Grass; 
float TL[] = {0.0f,-1.0f,1.0f,0.0f}; 
float TR[] = {0.0f,1.0f,1.0f,0.0f}; 
float BR[] = {0.0f,1.0f,-1.0f,0.0f}; 
float BL[] = {0.0f,-1.0f,-1.0f,0.0f}; 
float TL2[] = {0.0f,-1.0f,1.0f,-2.0f}; 
float TR2[] = {0.0f,1.0f,1.0f,-2.0f}; 
float BR2[] = {0.0f,1.0f,-1.0f,-2.0f}; 
float BL2[] = {0.0f,-1.0f,-1.0f,-2.0f}; 

float DTL[] = {0.0f,-1.0f,1.0f+Grass_XChan,0.0f}; 
float DTR[] = {0.0f,1.0f,1.0f+Grass_XChan,0.0f}; 
float DBR[] = {0.0f,1.0f,-1.0f+Grass_XChan,0.0f}; 
float DBL[] = {0.0f,-1.0f,-1.0f+Grass_XChan,0.0f}; 
float DTL2[] = {0.0f,-1.0f,1.0f+Grass_XChan,-2.0f}; 
float DTR2[] = {0.0f,1.0f,1.0f+Grass_XChan,-2.0f}; 
float DBR2[] = {0.0f,1.0f,-1.0f+Grass_XChan,-2.0f}; 
float DBL2[] = {0.0f,-1.0f,-1.0f+Grass_XChan,-2.0f}; 
void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glTranslatef(positionX, positionY, positionZ); 
    glPushMatrix(); 
    glRotatef(angle,RotX,RotY,RotZ); 
    Dirt.RenderBlock("C:/Users/Progr_Anim/Desktop/textures/DirtBottom.bmp"); 
    Grass.RenderBlock("C:/Users/Progr_Anim/Desktop/textures/GrassTop.bmp"); 

    glPopMatrix(); 
    glutSwapBuffers(); 
    } 
    //------------------------------------------------------------------------------------------------------------------------------------------- 
    void HandleResize(int w, int h) { 
glViewport(0, 0, w, h); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(45.0, (float)w/(float)h, 1.0, 200.0); 
    } 
    void Camera(unsigned char key,int x,int y) 
    { 
    switch(key) 
{ 
    case 'w': 
     positionZ += 0.08f; 
     break; 
    case 's': 
     positionZ -= 0.08f; 
     break; 
    case 'a': 
     positionX += 0.08f; 
     break; 
    case 'd': 
     positionX -= 0.08f; 
     break; 
    case 'c': 
     if(angle>=360.0f) 
     { 
     angle=0.0f;     
     } 
     angle+=5.0f; 
     break; 
    case '1': 
     angle = 0.0f; 
     RotX=1.0f; 
     RotY=0.0f; 
     RotZ=0.0f; 
     break; 
    case '2': 
     angle = 0.0f; 
     RotX=0.0f; 
     RotY=1.0f; 
     RotZ=0.0f; 
     break; 
    case '3': 
     angle = 0.0f; 
     RotX=0.0f; 
     RotY=0.0f; 
     RotZ=1.0f; 
     break; 
    case 'q': 
     exit(0); 
     break; 
    }  
    } 
int main(int argc, char** argv) 
{ 
    Dirt.SetVertices(TL,TR,BR,BL,TL2,TR2,BR2,BL2); 
    Grass.SetVertices(DTL,DTR,DBR,DBL,DTL2,DTR2,DBR2,DBL2); 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); 
    //Create Window 
    glutInitWindowSize(640,480); 
    glutCreateWindow("Love"); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_COLOR_MATERIAL); 
    glutDisplayFunc(display); 
    glutReshapeFunc(HandleResize); 
    glutKeyboardFunc(Camera); 
    glutIdleFunc(display); 
    glutMainLoop(); 
    return 0; 
    } 

這裏是旋轉立方體的視頻,其中Grass塊位於頂部,Dirt塊位於底部。 Link

+0

你弄糟了你的頂點位置。我不打算分析代碼,看看你出錯的地方,但那肯定是出了什麼問題。只需重新制作頂點位置/紋理座標,希望您能夠做到。 – Aaron

+0

我不知道哪個雖然.... –

+1

它可能會更快,只是重做它,然後找到並糾正錯誤的頂點。 – Aaron

回答

1

我打算在這裏找個答案,因爲我不認爲帖子中有足夠的信息。

該代碼中的數組正在使用,就好像第0個元素不存在一樣,並且所用數組的定義在前面有一個額外的零作爲填充。

但是有些數組在這裏的代碼中沒有定義,並且必須在其他地方聲明,可能是使用大小。我會猜測這個大小對於1索引數組是錯誤的。

back_squarefront_square很可能宣佈類似:

float back_square[4][3]; 

而不是:

float back_square[5][4]; 

是如何被使用它們。

結果將是未定義的行爲,在這種情況下可能會覆蓋頂點,摺疊立方體的一個角落。無論哪種方式,我強烈推薦而不是使用這種方式的數組,並習慣從零開始的事情。

+0

您已解決我的問題。我全心全意地感謝你。再次感謝。 –