2011-04-12 73 views
0

我已经编码显示列表..当我第二天再次打开它 - >去.. niiice我想..我浪费了小时没有 和接下来的问题是..我不能得到它的工作 显示列表实际工作,但不是它应该如何..纹理拉伸某种程度显示列表不正常工作

我从文本文件得到我的世界..每个平台定义开始金额x ..结束金额× 平台底部的金额.. u和v(我不用)和过滤器来选择纹理。 setupworld是从文本文件读取并将我的变量写入结构中的函数。 哦,numblocks是平台的数量来显示

void setupworld(){ 
float xstart,xend,ystart,u,v; 
unsigned int filter; 
FILE *filein; 
char oneline[255]; 
filein=fopen("data/world.txt","rt"); 

readstr(filein,oneline); 
sscanf(oneline, "Anzahl %d\n",&numblocks); 

for (int loop=0;loop<numblocks; loop++) 
{ 
     readstr(filein,oneline); 
     sscanf(oneline,"%f %f %f %f %f %d",&xstart,&xend,&ystart,&u,&v,&filter); 
     block.data[loop].xstart=xstart; 
     block.data[loop].xend=xend; 
     block.data[loop].ystart=ystart; 
     block.data[loop].u=u; 
     block.data[loop].v=v; 
     block.data[loop].filter=filter; 
} 
fclose(filein); 
return;} 

BuildLists()创建我的显示列表,但首先加载PNG文件和世界,因为他们影响我的显示列表...我有重写这部分代码,我只是不知道我犯了什么错误。 第一个循环用于创建平台和第二个用于块..每个平台由多个2×2块组成,简单地彼此相邻

GLvoid BuildLists(){ 

texture[0]=LoadPNG("data/rock_gnd.png"); 
texture[1]=LoadPNG("data/rock_wall2.png"); 
texture[2]=LoadPNG("data/pilz_test.png"); 
setupworld(); 
quad[0]=glGenLists(numblocks); 

for(int loop=0;loop<numblocks;loop++) 
{ 
    GLfloat xstart,xend,ystart,u,v; 
    xstart=block.data[loop].xstart; 
    xend=block.data[loop].xend; 
    ystart=block.data[loop].ystart; 
    u=block.data[loop].u; 
    v=block.data[loop].v; 
    GLuint filter=block.data[loop].filter; 
    GLfloat blocks=(xend-xstart)/2.0f; 

    glNewList(quad[loop],GL_COMPILE); 
    glBindTexture(GL_TEXTURE_2D, texture[filter]); 

     for(int y=0;y<blocks;y++) 
     { 
      glBegin(GL_QUADS); 
       glTexCoord2f(0.0f,0.0f); 
       glVertex3f(xstart,ystart,-1.0f); 
       glTexCoord2f(1.0f,0.0f); 
       glVertex3f(xstart+((y+1)*2.0f),ystart,-1.0f); 
       glTexCoord2f(1.0f,1.0f); 
       glVertex3f(xstart+((y+1)*2.0f),ystart+2.0f,-1.0f); 
       glTexCoord2f(0.0f,1.0f); 
       glVertex3f(xstart,ystart+2.0f,-1.0f); 
      glEnd();         
     } 

    glEndList(); 
    quad[loop+1]=quad[loop]+1; 
} 
} 

显示列表只是使2D纹理 这就是我称之为我的实际代码中

int DrawWorld(GLvoid){ 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   

GLfloat camtrans=-xpos; 
glTranslatef(camtrans,0,0); 

glPushMatrix(); 

for(int i=0;i<numblocks;i++) 
{ 

    glCallList(quad[i]); 
} 
glPopMatrix(); 
return TRUE; } 

所以这是它..我认为错误是在BuildLists前初始化期间编制()功能,但我不知道了..

这里是链接到我的截图..如u看到纹理看起来很怪异出于某种原因 http://www.grenzlandzocker.de/test.png

+2

请您上传截图?乍一看,代码看起来很好,但图像可以胜过千言万语。另外,我可以问你,为什么你使用显示列表?它们自OpenGL-3以来已弃用,不应在新代码中使用。改为使用顶点缓冲区对象。 – datenwolf 2011-04-12 11:37:24

+0

numblocks有哪些数字?也许你打破了极限。 – 2011-04-12 11:46:28

+0

每次opengl调用之后使用glGetError,看看是否所有的都正确传递。 – 2011-04-12 11:50:14

回答

1

在您的代码:

quad[0]=glGenLists(numblocks); 

创建numblocks显示列表,但您只获取第一个显示列表id,并将其存储在quad [0]中。然后,您使用:

glNewList(quad[loop],GL_COMPILE); 

其中四[循环]是未定义循环= 0。您可以改用:

glNewList(quad[0] + loop,GL_COMPILE); 

由于对显示列表的ID是连续的,从价值quad [0]。您还需要修改你的渲染代码:

glCallList(quad[0] + i); 

出于同样的原因...