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

Ваш аккаунт

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

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

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

Проблемы с проверкой глубины в OpenGL

53K
06 ноября 2009 года
Emoticon
3 / / 06.11.2009
Задача следующая - есть фотонная карта в виде таблицы (координата x, координата y, интенсивность). Ее отображают в 3D, рисуя в соответствующих точках параллепипед с высотой, равной интенсивности.
После включения GL_DEPTH_TEST на многих углах камеры часть таких паралеллипипедов не отображается.
Освещение у сцены есть. Пробовал и составлять фигуры по граням, и заменить их на глутовские конусы, эффект один и тот же.
Буду признателен, если кто подскажет, в чем может быть дело.
До сих пор во всех статьях, которые я видел, обнаруживал лишь что при включеной проверке глуины и своеврменном очищении соответствующего буфера все должно быть нормально. :confused:
9
06 ноября 2009 года
Lerkin
3.0K / / 25.03.2003
Вариантов - есть. Но чтобы не гадать, хорошо бы увидеть функцию отрисовки. Настройку рендеринга и очистку буферов - тоже не лишне.
53K
06 ноября 2009 года
Emoticon
3 / / 06.11.2009
Вот код. Кривоватый, правда. Полученное изображение загоняется в текстуру, которая потом и лепится на элемент управления.

Код:
void GL_Widget::DrawBuffer( void )
{
    int x,y;
    int currentColor;
    int prevColor = 0;
    unsigned int min, value;

    if(m_PBufferSupport == false)  return;
    pbuffer->makeCurrent();
    initPbuffer();

    //Очищаем окно
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   
    min = max_photons_point / (pal_size-1);
   
    glEnable(GL_DEPTH_TEST);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(30, 1, 0, 10);
    gluLookAt(0.5, 0.5, 4.0 + cdist,  1.0, 1.0, 0.0 + cdist,  0, 1, 0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
       
    glEnable(GL_LIGHTING);
    GLfloat ambientLight[] = {0.75f, 0.75f, 0.75f, 1.0f};
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);
    glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 0.7f);
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT);

    //light sources
    GLfloat light0[] = {0.3f, 0.3f, 0.3f, 1.0f};
    GLfloat lpos0[] = {0.5f, 0.5f, 1.0f, 0.0f};
    glLightfv(GL_LIGHT0, GL_AMBIENT, light0);
    glLightfv(GL_LIGHT0, GL_POSITION, lpos0);
    //glEnable(GL_LIGHT0);

    //view translations and rotations
    glPushMatrix();

    glRotated(phi, 0, 1, 0);
    glRotated(theta, -1, 0, 0);
   
    for(y=0;y<500;y++)
    {
        for(x=0;x<500;x++)
        {
            value = photons_array[y*512+x];
            if( value > min )
            {
                currentColor = (int)(((float) pal_size - 1.0) * value / max_photons_point);
                if (currentColor < pal_lb && currentColor != 0) currentColor = pal_lb;
                if (currentColor > pal_ub && currentColor != 0) currentColor = pal_ub;
           
                double intens = (double) value / max_photons_point;
                if (intens < vcbar->getLowerBound() || intens > vcbar->getUpperBound())
                {
                    currentColor = 0;
                    if (REMOVE_PHOTONS_CUT) photons_array[y*512 + x] = 0;
                }
                if (currentColor == 0) continue;
                if (currentColor != prevColor)
                {
                    int r, g, b;
                    getRGBFromBar(currentColor, &r, &g, &b);
                    glColor3ub(r, g, b);
                    prevColor = currentColor;
                }
                draw3Dstripe(x, y, value);
            }
        }
    }
    glPopMatrix();
    glDisable(GL_LIGHT0);
    glDisable(GL_LIGHT1);
    glDisable(GL_LIGHTING);
    glDisable(GL_COLOR_MATERIAL);
    glDisable(GL_DEPTH_TEST);
    pbuffer->updateDynamicTexture(dynamicTexture);
}


void GL_Widget::draw3Dstripe(int x, int y, int val)
{
    float ht = float (val) / max_photons_point;
    float sz = 0.002f;

    float xp = (float)(4.0f + x)/500.0f + sz;
    float yp = (float)(506.0f - y)/500.0f + sz;

    glPushMatrix();
    glTranslatef(xp, yp, ht/2);
    glScaled(sz, sz, ht);
    glutSolidCube(1);
    glPopMatrix();
}

void GL_Widget::initPbuffer( void )
{

    if(pbuffer == NULL) return;

    pbuffer->makeCurrent();
    glClearColor(1.0f,1.0f,1.0f,1.0f);

    glViewport(0,0,1000,1000);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glTranslatef(-1.0f, -1.0f, 0.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    if(dynamicTexture == 0) {
        // generate a texture that has the same size/format as the pbuffer
        dynamicTexture = pbuffer->generateDynamicTexture();
    }
    // bind the dynamic texture to the pbuffer
    pbuffer->bindToDynamicTexture(dynamicTexture);
    glDisable(GL_TEXTURE_2D);
}
53K
20 ноября 2009 года
Emoticon
3 / / 06.11.2009
Проблема разрешилась. gluLookAt надо было применять к модельно-видовой матрице. Тему можно закрывать.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог