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);
}
Проблемы с проверкой глубины в OpenGL
После включения GL_DEPTH_TEST на многих углах камеры часть таких паралеллипипедов не отображается.
Освещение у сцены есть. Пробовал и составлять фигуры по граням, и заменить их на глутовские конусы, эффект один и тот же.
Буду признателен, если кто подскажет, в чем может быть дело.
До сих пор во всех статьях, которые я видел, обнаруживал лишь что при включеной проверке глуины и своеврменном очищении соответствующего буфера все должно быть нормально. :confused:
Вариантов - есть. Но чтобы не гадать, хорошо бы увидеть функцию отрисовки. Настройку рендеринга и очистку буферов - тоже не лишне.
Вот код. Кривоватый, правда. Полученное изображение загоняется в текстуру, которая потом и лепится на элемент управления.
Проблема разрешилась. gluLookAt надо было применять к модельно-видовой матрице. Тему можно закрывать.