Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблемы с Z-буффером в OpenGL

11K
13 апреля 2007 года
Mosca Bianca
6 / / 06.07.2005
Возникла странная проблема: OpenGL (+GLUT) не обрабатывает z-буффер, т.е. при активированном буффере дальние грани прорисовываются поверх ближних Странно то, что не помогает даже примитивная реализация "алгоритма художника" (просто сначала рисую дальние пов-сти, затем - ближние).
Т.к. проблема возникает не только на моем компе, подозреваю свою криворукость, но ошибку найти не могу.
Конкретнее: рисую поверхность с бортиками, затем кубик.
Но при этом кубик полностью перекрывает поверхность (хотя должен был бы быть виден лишь наполовину).
Вот код:
Код:
#include <windows.h>
#include <tchar.h>
#include <gl/glut.h>
#include <math.h>
#include "bmp_loader.cpp"
#include "material.h"
#include "classes.h"

const unsigned int MainSurface = 16;
const unsigned int Borders = 17;
MATERIAL MainSurfaceMaterial, BorderMaterial;
CUBE cube(0,0,0,1.5,"materials//stones.mpm");
void CreateBaseLists(float, float);

void Reshape(int w, int h)
{
    if(h > 0) {
        glViewport(0,0,w,h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(45.0,w/(GLdouble)h,-20,0);
        glMatrixMode(GL_MODELVIEW);
        gluLookAt(0,1,-20,0,0,0,0,1,0);
    }
}

void Display(void)
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    //glMatrixMode(GL_MODELVIEW);
    //glLoadIdentity();
    glTranslated(0,0,0);
    glRotated(0.05, 0, 1, 0);
    glCallList(MainSurface);
    glCallList(Borders);
    cube.Draw();
    glFlush();
    glutSwapBuffers();
}


int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode( GLUT_RGB );
    glutInitDisplayMode( GLUT_DEPTH );
    glutInitDisplayMode( GLUT_SINGLE );
    glutInitWindowSize(800,600);
    glutCreateWindow("Oil&Fire");
    glutSetWindowTitle("Hello!");
   
    glutDisplayFunc(Display);
    glutIdleFunc(Display);
    glutReshapeFunc(Reshape);

    glClearColor(0.6,0,1,1);
   
    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);
    glDepthFunc(GL_LEQUAL);
    glEnable(GL_BLEND);
    glEnable(GL_TEXTURE_2D);
    glPolygonMode(GL_FRONT,GL_FILL);
    glPolygonMode(GL_BACK,GL_LINE);
    //glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
    CreateBaseLists(11,0.5);
    glutMainLoop();
    return 0;          
}

void CreateBaseLists(float falsedesk_w, float falsedesk_h)
{
    MainSurfaceMaterial.LoadFile("materials//stones.mpm");
    //Дисплейный список для поверхности "стола"
    glNewList(MainSurface, GL_COMPILE);
        glColor3d(1,1,1);
        MainSurfaceMaterial.SetMaterial();
        glBegin(GL_QUADS);
            glTexCoord2d(0,0); glVertex3d(-5,0,-5);
            glTexCoord2d(0,1); glVertex3d(-5,0,5);
            glTexCoord2d(1,1); glVertex3d(5,0,5);
            glTexCoord2d(1,0); glVertex3d(5,0,-5);
        glEnd();
    glEndList();
    //Дисплейный список для бортиков
    BorderMaterial.LoadFile("materials//borders.mpm");
    glNewList(Borders, GL_COMPILE);
        glColor3d(1,1,1);
        BorderMaterial.SetMaterial();
        glBegin(GL_QUADS);
            /*glTexCoord2d(0,0); glVertex3d(-falsedesk_w/2, falsedesk_h, -falsedesk_w/2);
            glTexCoord2d(1,0); glVertex3d(falsedesk_w/2, falsedesk_h, -falsedesk_w/2);
            glTexCoord2d(1,1); glVertex3d(5, 0, -5);
            glTexCoord2d(0,1); glVertex3d(-5, 0, -5);
            *///первый бортик (нижний)
            glTexCoord2d(0,0); glVertex3d(-falsedesk_w/2, falsedesk_h, falsedesk_w/2);
            glTexCoord2d(1,0); glVertex3d(falsedesk_w/2, falsedesk_h, falsedesk_w/2);
            glTexCoord2d(1,1); glVertex3d(5, 0, 5);
            glTexCoord2d(0,1); glVertex3d(-5, 0, 5);
            //второй бортик (верхний)
            glTexCoord2d(0,0); glVertex3d(-falsedesk_w/2, falsedesk_h, -falsedesk_w/2);
            glTexCoord2d(0,1); glVertex3d(-falsedesk_w/2, falsedesk_h, falsedesk_w/2);
            glTexCoord2d(1,1); glVertex3d(-5, 0, 5);
            glTexCoord2d(1,0); glVertex3d(-5, 0, -5);
            //третий бортик (правый)
            glTexCoord2d(0,0); glVertex3d(falsedesk_w/2, falsedesk_h, -falsedesk_w/2);
            glTexCoord2d(1,0); glVertex3d(5, 0, -5);
            glTexCoord2d(1,1); glVertex3d(5, 0, 5);
            glTexCoord2d(0,1); glVertex3d(falsedesk_w/2, falsedesk_h, falsedesk_w/2);
            //четвертый (левый)
        glEnd();
    glEndList();
}


Рисование кубика:
Код:
void CUBE::Draw()
{
    material.SetMaterial();
    glColor4d(1,1,1,1.0);
    glBegin(GL_QUADS);
        glTexCoord2d(0,0); glVertex3d(x-size/2, y-size/2, z-size/2);
        glTexCoord2d(1,0); glVertex3d(x-size/2, y+size/2, z-size/2);
        glTexCoord2d(1,1); glVertex3d(x+size/2, y+size/2, z-size/2);
        glTexCoord2d(0,1); glVertex3d(x+size/2, y-size/2, z-size/2);
        //передняя грань
        glTexCoord2d(0,0); glVertex3d(x+size/2, y-size/2, z-size/2);
        glTexCoord2d(1,0); glVertex3d(x+size/2, y+size/2, z-size/2);
        glTexCoord2d(1,1); glVertex3d(x+size/2, y+size/2, z+size/2);
        glTexCoord2d(0,1); glVertex3d(x+size/2, y-size/2, z+size/2);
        //правая боковая грань
        glTexCoord2d(0,0); glVertex3d(x-size/2, y+size/2, z+size/2);
        glTexCoord2d(1,0); glVertex3d(x-size/2, y+size/2, z-size/2);
        glTexCoord2d(1,1); glVertex3d(x-size/2, y-size/2, z-size/2);
        glTexCoord2d(0,1); glVertex3d(x-size/2, y-size/2, z+size/2);
        //левая боковая грань
        glTexCoord2d(0,0); glVertex3d(x-size/2, y-size/2, z+size/2);
        glTexCoord2d(1,0); glVertex3d(x+size/2, y-size/2, z+size/2);
        glTexCoord2d(1,1); glVertex3d(x+size/2, y+size/2, z+size/2);
        glTexCoord2d(0,1); glVertex3d(x-size/2, y+size/2, z+size/2);
        //задняя грань
        glTexCoord2d(0,0); glVertex3d(x-size/2, y+size/2, z-size/2);
        glTexCoord2d(1,0); glVertex3d(x-size/2, y+size/2, z+size/2);
        glTexCoord2d(1,1); glVertex3d(x+size/2, y+size/2, z+size/2);
        glTexCoord2d(0,1); glVertex3d(x+size/2, y+size/2, z-size/2);
        //верхняя грань.
        //Т.к. нижняя грань никогда не будет видна - нет смысла и рисовать ее (ис соображений оптимизации)
    glEnd();
}


Очень прошу Вашего совета: что здесь нужно исправить и вообще - действительно ли это просто некорректная моя работа с z-буффером?
11K
13 апреля 2007 года
Mosca Bianca
6 / / 06.07.2005
Прошу прощения, просто запутался в параметрах матрицы проекции. Все уже исправил. Тысячу извинений.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог