Тест глубины в opengl

Моя программа отказывается проводить глубинное тестирование. Два сферных объекта всегда рисуются в порядке их создания, а не в соответствии с их положением. Альфа-сфера расположена в (0, 0, 1), а бета-сфера расположена в (0, 0, -10), но OpenGL все еще рисует бета поверх альфы. Я включил тест глубины в моей программе.

Ничто не похоже на работу. Я хочу, чтобы OpenGL автоматически проверял глубину на любых объектах, нарисованных в окне. Любая помощь или совет будет принята с благодарностью. Вот полный код.

#include "GL/freeglut.h"#include "GL/gl.h"#include "GL/glu.h"
const int SPHERE_RES = 200;
double Z_INIT = -28.0;
double RADIUS = 2;
double Red[3] = {1, 0, 0};
double Blue[3] = {0, 0, 1};

using namespace std;/*
* Method handles resize of the window
*/

void handleResize (int w, int h) {

glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
double ratio = (float)w/ (float)h;
gluPerspective(45.0, ratio, 1.0, 100.0);
}/*
* Color and depth is enabled and in this method
*/

void configureColor(void)
{

glClearColor(1.0f, 1.0f, 1.0f, 0.0f); //Set background to white
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// Clear window.
glDepthFunc(GL_ALWAYS);
glEnable(GL_DEPTH_TEST);

glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

}

void display (void) {

configureColor();

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();GLfloat sun_direction[] = { 0.0, 0.0, -1.0, 0.0};
glLightfv(GL_LIGHT0, GL_POSITION, sun_direction);
GLUquadric* quad =  gluNewQuadric();

//first sphere is drawn
glColor3f(Red[0], Red[1], Red[2]);
glPushMatrix();
glLoadIdentity();
glTranslatef(0, 0, Z_INIT);
glTranslatef(0, 0, 1.0);
gluSphere(quad, RADIUS, SPHERE_RES, SPHERE_RES);
glPopMatrix();

//second sphere is supposed to be drawn behind it,
//but it is drawn on top.
glColor3f(Blue[0], Blue[1], Blue[2]);
glPushMatrix();
glLoadIdentity();
glTranslatef(0, 0, Z_INIT);
glTranslatef(0, 0, -10.0);
gluSphere(quad, RADIUS, SPHERE_RES, SPHERE_RES);
glPopMatrix();

free(quad);
glFlush();
}

int main(int argc, char** argv)
{

glutInit(&argc, argv); //initializes the GLUT
glutInitDisplayMode(GLUT_SINGLE);
glutInitWindowSize(600,600);
glutInitWindowPosition(100,100);
glutCreateWindow("OpenGL - First window demo");
glutReshapeFunc(handleResize);
glutDisplayFunc(display);

glutMainLoop();
return 0;
}

Я использую операционную систему Ubuntu 14.04.

0

Решение

glDepthFunc(GL_ALWAYS);

Вот почему вы видите сферы в том порядке, в котором они нарисованы. Настройка функция глубины в GL_ALWAYS просто означает, что все тесты глубины всегда проходят, для любого фрагмента, будь то ближе или дальше.

Тебе нужно GL_LESS за результат, который вы хотите. Фрагмент, имеющий глубину меньше, чем в буфере кадра победы; чем ближе (меньше z) побеждает более дальний (больше z).

Вы можете позвонить glDepthFunc(GL_LESS) или закомментировать glDepthFunc(GL_ALWAYS) поскольку GL_LESS по умолчанию.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]