список отображения не работает должным образом - PullRequest
0 голосов
/ 12 апреля 2011

Я уже закодировал список отображения ... и когда я открыл его снова на следующий день -> ушел ... я подумал ... я потратил часы впустую, и следующая проблема ... я не могу получитьэто работает больше, список отображения фактически работает, но не так, как должен .. текстуры растягиваются как-то

я получаю свой мир из текстового файла .. каждая платформа определяется начальным количеством x .. конечным количеством xy количество нижней части платформы .. 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 и весь мир, потому что они влияют на мой список отображения ... iМне пришлось переписать эту часть кода, и я просто не знаю, где я допустил ошибку. Первый цикл предназначен для создания платформ, а второй - для блоков. Каждая платформа состоит из нескольких блоков 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;
}
}

список отображения компилируется во время инициализации непосредственно перед включением двухмерных текстур, так я его называю во время фактического кода

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 Ответ

1 голос
/ 13 февраля 2012

В вашем коде:

quad[0]=glGenLists(numblocks);

создает списки отображения numblocks, но вы получаете только первый идентификатор списка отображения, и он сохраняется в quad [0]. Позже вы используете:

glNewList(quad[loop],GL_COMPILE);

где quad [loop] не определено для loop! = 0. Вместо этого вы можете использовать:

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

Поскольку идентификаторы для списков отображения являются смежными, начиная со значения quad [0]. Вам также нужно изменить код рендеринга на:

glCallList(quad[0] + i);

По той же причине ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...