显示列表无法正常工作

时间:2011-04-12 11:27:00

标签: c++ list opengl

我已经编码了显示列表..当我第二天再次打开它时 - >走了.. niiice我想..我浪费了几个小时 而下一个问题是......我再也无法让它工作了 显示列表实际上有效但不应该如何...纹理以某种方式拉伸

我从一个文本文件中获取我的世界..每个平台由x的起始量定义。结束量为x 平台底部的y量... 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文件和世界,因为它们影响我的显示列表...我不得不重写这部分代码,我只是不知道我在哪里犯了错误.. 第一个循环用于创建平台,第二个循环用于块。每个平台由多个2x2块组成,紧挨着彼此

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()函数中,但我不确定了..

这是我的屏幕截图的链接..因为你看到纹理看起来很奇怪出于某种原因 http://www.grenzlandzocker.de/test.png

1 个答案:

答案 0 :(得分:1)

在您的代码中:

quad[0]=glGenLists(numblocks);

创建numblocks显示列表,但是你只获得第一个显示列表id,它存储在quad [0]中。之后,您使用:

glNewList(quad[loop],GL_COMPILE);

其中quad [loop]未定义为循环!= 0.您可以使用:

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

因为显示列表的id是连续的,所以从quad [0]的值开始。您还需要将渲染代码修改为:

glCallList(quad[0] + i);

出于同样的原因......