#1 18.03.10 21:37
[C++, OpenGL] Проблемы с буфером глубины
При инициализации GL включаю буфер глубины следующим образом:
Код: cpp:
glClearDepth( 1.0f ); // Разрешить очистку буфера глубины glEnable( GL_DEPTH_TEST ); // Разрешить тест глубины glDepthFunc( GL_LEQUAL ); // Тип теста глубины
Так выглядит процедура рисования кадра:
Код: cpp:
/* отрисовка кадра*/ void Display(void) { if (bAutoRotate == true) yrot -= 0.05f; // автовращение /* Очистим буффер цвета и глубины */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* Загрузим единичную матрицу видового преобразования */ glLoadIdentity(); /* сместим относительно экрана */ glTranslatef(xtrans, ytrans, ztrans); /* вращение по оси oX на угол xrot */ glRotatef(xrot, 1.0f, 0, 0); /* вращение по оси oY на угол yrot */ glRotatef(yrot, 0, 1.0f, 0); /* вращение по оси oZ на угол zrot */ glRotatef(zrot, 0, 0, 1.0f); glBegin(GL_TRIANGLES); // Текущим - делаем красный цвет (по RGB) glColor3f(1.0f, 0.0f, 0.0f); // Рисуем первый красный треугольник - задавая координаты трёх // его вершин glVertex3f(-75.0f, 40.0f, -50.0f); glVertex3f(-75.0f, 40.0f, 50.0f); glVertex3f(75.0f, 40.0f, 50.0f); // Текущим - делаем синий цвет (по RGB) glColor3f(0.0f, 0.0f, 1.0f); // Рисуем второй синий треугольник - задавая координаты трёх // его вершин glVertex3f(-75.0f, 0.0f,-50.0f); glVertex3f( 75.0f, 0.0f,-50.0f); glVertex3f( 75.0f, 0.0f, 50.0f); glEnd(); glBegin(GL_LINES); /* ось Х */ glColor3f(1.0f, 1.0f, 0.0f); /* желтый */ glVertex3f( 0.0f, 0.0f, 0.0f ); glVertex3f( 1000.0f, 0.0f, 0.0f); /* ось Y */ glColor3f(1.0f, 1.0f, 1.0f); /* белый */ glVertex3f( 0.0f, 0.0f, 0.0f ); glVertex3f( 0.0f, 1000.0f, 0.0f); /* ось Z */ glColor3f(0.0f, 0.5f, 1.0f); /* голубой */ glVertex3f( 0.0f, 0.0f, 0.0f ); glVertex3f( 0.0f, 0.0f, 1000.0f); glEnd(); /* Сбросить все данные на обработку в конвейер преобразования OpenGL без ожидания завершения предидущих инструкций */ glFlush(); /* Меняем местами задний и передний буферы */ glutSwapBuffers(); }
Собственно рисуются два треугольника красный и синий. Красный находится выше по оси oY.
Собственно суть проблемы:
Задний треугольник отрисовывается поверх переднего.. не знаю что поделать.
Я буфер не правильно включаю, или отрисовываю неправильно.. пфф..
Тут видно что красный треугольник выше

Вращаем так чтобы красный был сверху

Offline
#7 19.03.10 00:04
Re: [C++, OpenGL] Проблемы с буфером глубины
R0mm написал(а):
так и было.
да нет, у тебя как раз разный обход
попробуй местами эти строчки поменять
glVertex3f( 75.0f, 0.0f,-50.0f);
glVertex3f( 75.0f, 0.0f, 50.0f);
У меня где-то валялись лабы и ргр по курсу КиИГ, которые когда-то для брата писал.
Offline
#10 19.03.10 00:15
#11 19.03.10 00:19
Re: [C++, OpenGL] Проблемы с буфером глубины
Это яичко получается 8)
Код::
glBegin(GL_TRIANGLES);
BuildObject(20,4);
glEnd();
void CChildView::BuildObject(double parts, double r)
{
double x,y,z,prev_a=0,prev_b=0;
double step = (2*M_PI)/parts;
for (double a=0;a<= 2*M_PI;a+=step)
{
for(double b=0;b <= 2*M_PI;b+=step)
{
Polar2NormalObject(a,b,r,&x,&y,&z);
glVertex3d(x,z,y);
Polar2NormalObject(prev_a,b,r,&x,&y,&z);
glVertex3d(x,z,y);
Polar2NormalObject(a,prev_b,r,&x,&y,&z);
glVertex3d(x,z,y);
Polar2NormalObject(prev_a,prev_b,r,&x,&y,&z);
glVertex3d(x,z,y);
Polar2NormalObject(prev_a,b,r,&x,&y,&z);
glVertex3d(x,z,y);
Polar2NormalObject(a,prev_b,r,&x,&y,&z);
glVertex3d(x,z,y);
prev_b=b;
}
prev_a = a;
}
}Offline
#12 24.03.10 16:20
#13 25.03.10 00:36
#14 25.03.10 00:45
Re: [C++, OpenGL] Проблемы с буфером глубины
[R0mm,
чокасается твоей траблы была такаяже.
для лечения сделал так
при инициализации opengl
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glEnable(GL_CULL_FACE); //отсечение нивидимых поверхностей
при перерисовки картинки
glClearColor (0.1f, 0.2f, 0.3f, 0.5f); // цвет фона
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
Исправлено Hix (25.03.10 00:47)
Offline
#15 25.03.10 00:50
#16 25.03.10 00:51
#17 25.03.10 00:52
#18 25.03.10 00:56
#19 25.03.10 00:58
#20 25.03.10 01:00
#21 25.03.10 01:02
Re: [C++, OpenGL] Проблемы с буфером глубины
понятно покажи описание формата пиксела
вот урок
static PIXELFORMATDESCRIPTOR pfd= // pfd сообщает Windows каким будет вывод на экран каждого пикселя
{
sizeof(PIXELFORMATDESCRIPTOR), // Размер дескриптора данного формата пикселей
1, // Номер версии
PFD_DRAW_TO_WINDOW | // Формат для Окна
PFD_SUPPORT_OPENGL | // Формат для OpenGL
PFD_DOUBLEBUFFER, // Формат для двойного буфера
PFD_TYPE_RGBA, // Требуется RGBA формат
bits, // Выбирается бит глубины цвета
0, 0, 0, 0, 0, 0, // Игнорирование цветовых битов
0, // Нет буфера прозрачности
0, // Сдвиговый бит игнорируется
0, // Нет буфера накопления
0, 0, 0, 0, // Биты накопления игнорируются
32, // 32 битный Z-буфер (буфер глубины)
0, // Нет буфера трафарета
0, // Нет вспомогательных буферов
PFD_MAIN_PLANE, // Главный слой рисования
0, // Зарезервировано
0, 0, 0 // Маски слоя игнорируются
};
Исправлено Hix (25.03.10 01:03)
Offline
#22 25.03.10 01:03
#23 25.03.10 01:05
#24 25.03.10 01:05
#25 25.03.10 01:07
Re: [C++, OpenGL] Проблемы с буфером глубины
Код: cpp:
#include <GL/glut.h> #include <GL/glu.h> #include <GL/gl.h> #include <stdlib.h> using namespace std; /* начальный размер окна */ int Width = 800, Height = 600; bool first_click = true; bool bAutoRotate(false); GLfloat yrot(-30.0f); GLfloat xrot(30.0f); GLfloat zrot(0.0f); GLfloat xtrans(Width/2.0); GLfloat ytrans(Height/2.0); GLfloat ztrans(0.0f); /* отрисовка кадра*/ void Display(void) { if (bAutoRotate == true) yrot -= 0.05f; // автовращение /* Очистим буффер цвета и глубины */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* Загрузим единичную матрицу видового преобразования */ glLoadIdentity(); glPushMatrix(); /* сместим относительно экрана */ glTranslatef(xtrans, ytrans, ztrans); /* вращение по оси oX на угол xrot */ glRotatef(xrot, 1.0f, 0, 0); /* вращение по оси oY на угол yrot */ glRotatef(yrot, 0, 1.0f, 0); /* вращение по оси oZ на угол zrot */ glRotatef(zrot, 0, 0, 1.0f); glBegin(GL_QUADS); glColor3f(0.0f, 0.0f, 1.0f); // Синий glVertex3f( 100.0f, 100.0f,-100.0f); // Право верх квадрата (Верх) glVertex3f(-100.0f, 100.0f,-100.0f); // Лево верх glVertex3f(-100.0f, 100.0f, 100.0f); // Лево низ glVertex3f( 100.0f, 100.0f, 100.0f); // Право низ glColor3f(1.0f, 0.5f, 0.0f); // Оранжевый glVertex3f( 100.0f,-100.0f, 100.0f); // Верх право квадрата (Низ) glVertex3f(-100.0f,-100.0f, 100.0f); // Верх лево glVertex3f(-100.0f,-100.0f,-100.0f); // Низ лево glVertex3f( 100.0f,-100.0f,-100.0f); // Низ право glColor3f(1.0f, 0.0f, 0.0f); // Красный glVertex3f( 100.0f, 100.0f, 100.0f); // Верх право квадрата (Перед) glVertex3f(-100.0f, 100.0f, 100.0f); // Верх лево glVertex3f(-100.0f,-100.0f, 100.0f); // Низ лево glVertex3f( 100.0f,-100.0f, 100.0f); // Низ право glColor3f(1.0f, 1.0f, 0.0f); // Желтый glVertex3f( 100.0f,-100.0f,-100.0f); // Верх право квадрата (Зад) glVertex3f(-100.0f,-100.0f,-100.0f); // Верх лево glVertex3f(-100.0f, 100.0f,-100.0f); // Низ лево glVertex3f( 100.0f, 100.0f,-100.0f); // Низ право glColor3f(0.0f,0.0f,1.0f); // Синий glVertex3f(-100.0f, 100.0f, 100.0f); // Верх право квадрата (Лево) glVertex3f(-100.0f, 100.0f,-100.0f); // Верх лево glVertex3f(-100.0f,-100.0f,-100.0f); // Низ лево glVertex3f(-100.0f,-100.0f, 100.0f); // Низ право glColor3f(1.0f,0.0f,1.0f); // Фиолетовый glVertex3f( 100.0f, 100.0f,-100.0f); // Верх право квадрата (Право) glVertex3f( 100.0f, 100.0f, 100.0f); // Верх лево glVertex3f( 100.0f,-100.0f, 100.0f); // Низ лево glVertex3f( 100.0f,-100.0f,-100.0f); // Низ право glEnd(); glBegin(GL_LINES); /* ось Х */ glColor3f(1.0f, 1.0f, 0.0f); /* желтый */ glVertex3f( 0.0f, 0.0f, 0.0f ); glVertex3f( 1000.0f, 0.0f, 0.0f); /* ось Y */ glColor3f(1.0f, 1.0f, 1.0f); /* белый */ glVertex3f( 0.0f, 0.0f, 0.0f ); glVertex3f( 0.0f, 1000.0f, 0.0f); /* ось Z */ glColor3f(0.0f, 0.5f, 1.0f); /* голубой */ glVertex3f( 0.0f, 0.0f, 0.0f ); glVertex3f( 0.0f, 0.0f, 1000.0f); glEnd(); glPopMatrix(); /* Сбросить все данные на обработку в конвейер преобразования OpenGL без ожидания завершения предидущих инструкций */ glFlush(); /* Меняем местами задний и передний буферы */ glutSwapBuffers(); } /* изменение размеров окна */ void Reshape(GLint w, GLint h) { Width = w; Height = h; /* Дадим знать OpenGL в какую область будет производиться отрисовка в данном случае: всё окно */ glViewport(0, 0, Width, Height); /* Установим текущую матрицу - матрицу проективного преобразования */ glMatrixMode(GL_PROJECTION); /* Сделаем матрицу проективного преобразования единичной */ glLoadIdentity(); glOrtho(0, Width, 0, Height, -1000.0f, 1000.0f); /* Установим текущей - матрицу видового преобразования, чтобы далее В программе мы могли работать только с ней */ glMatrixMode(GL_MODELVIEW); } /* обработка сообщений клавиатуры */ void Keyboard( unsigned char key, int x, int y ) { #define ESC '\033' switch(key) { case ESC: exit(0); case '6': // просмотр вправ yrot -= 2.5f; // Вращать сцену влево break; case '4': // просмотр влево yrot += 5.5f; // Вращать сцену вправо break; case '8': // просмотр вверх xrot += 2.5f; // Вращать сцену вниз break; case '5': // просмотр вниз xrot -= 2.5f; // Вращать сцену вверх break; case 'w': // вверх ytrans += 5.5f; break; case 's': // вниз ytrans -= 5.5f; break; case 'a': // влево xtrans -= 5.5f; break; case 'd': // вправо xtrans += 5.5f; break; case 'v': // включить/выключить автовращение bAutoRotate = !bAutoRotate; break; } glutPostRedisplay(); } /* обработка сообщений мыши */ void Mouse(int button, int state, int x, int y) { /* левый клик */ if((button==GLUT_RIGHT_BUTTON || button==GLUT_LEFT_BUTTON) && state==GLUT_DOWN) { first_click = true; } } /* обработка движения мыши */ void MouseMove(int x, int y) { static int px, py = -1; static int dx, dy; if ( first_click == true ) { dx = 0; dy = 0; first_click = false; } else { dx = px - x; dy = py - y; } px = x; py = y; xrot += dy*0.25f; yrot -= dx*0.25f; } /* инициализация */ int Init() { glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glEnable(GL_CULL_FACE); //отсечение нивидимых поверхностей /* установка цвета фона */ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); } /* головная функция */ int main(int argc, char* argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutInitWindowSize(Width, Height); glutCreateWindow("Lab2"); glutIdleFunc(Display); glutDisplayFunc(Display); glutReshapeFunc(Reshape); glutKeyboardFunc(Keyboard); glutMouseFunc(Mouse); glutMotionFunc(MouseMove); Init(); glutMainLoop(); }
Offline
#26 25.03.10 01:14
Re: [C++, OpenGL] Проблемы с буфером глубины
Код::
#include "SDL.h"
#include "gl.h"
#include "glu.h"
float xrf, yrf, zrf;
int fps=0;
void DrawGLScene();
Uint32 my_callbackfunc(Uint32 interval, void *param);
void* my_callback_param;
int main(){
if ( SDL_Init(SDL_INIT_TIMER|SDL_INIT_VIDEO) < 0 ){
printf("Unable to init SDL: %s\n", SDL_GetError());
exit(1);
}
atexit(SDL_Quit);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 6);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
if ( SDL_SetVideoMode(640,480,32,SDL_OPENGL) == NULL ){
printf("Unable to set 640x480 video: %s\n", SDL_GetError());
exit(1);
}
glClearColor(0.0f, 0.0f, 0.10f, 0.0f);
glClearDepth(1.0);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,640/480,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
SDL_TimerID my_timer_id = SDL_AddTimer(1000, my_callbackfunc, my_callback_param);
int done=0;
while(done == 0){
SDL_Event event;
while ( SDL_PollEvent(&event) ){
if ( event.type == SDL_QUIT ){
done = 1;
}
if ( event.type == SDL_KEYDOWN ){
if ( event.key.keysym.sym == SDLK_ESCAPE ){
done = 1;
}
}
}
DrawGLScene();
glFlush();
SDL_GL_SwapBuffers();
fps++;
}
return 0;
}
void DrawGLScene(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f,0.0f,-7.0f); // �������� ������ ������
glRotatef(xrf, 1.0f, 0.0f, 0.0f); // �������� ���� �� X, Y & Z
glRotatef(yrf, 0.0f, 1.0f, 0.0f); // �������� ���� �� X, Y & Z
glRotatef(zrf, 0.0f, 0.0f, 1.0f); // �������� ���� �� X, Y & Z
glBegin(GL_QUADS); // ������ ���
glColor3f(0.0f,1.0f,0.0f); // �����
glVertex3f( 1.0f, 1.0f,-1.0f); // ����� ���� �������� (����)
glVertex3f(-1.0f, 1.0f,-1.0f); // ���� ����
glVertex3f(-1.0f, 1.0f, 1.0f); // ���� ���
glVertex3f( 1.0f, 1.0f, 1.0f); // ����� ���
glColor3f(1.0f,0.5f,0.0f); // ���������
glVertex3f( 1.0f,-1.0f, 1.0f); // ���� ����� �������� (���)
glVertex3f(-1.0f,-1.0f, 1.0f); // ���� ����
glVertex3f(-1.0f,-1.0f,-1.0f); // ��� ����
glVertex3f( 1.0f,-1.0f,-1.0f); // ��� �����
glColor3f(1.0f,0.0f,0.0f); // �������
glVertex3f( 1.0f, 1.0f, 1.0f); // ���� ����� �������� (�����)
glVertex3f(-1.0f, 1.0f, 1.0f); // ���� ����
glVertex3f(-1.0f,-1.0f, 1.0f); // ��� ����
glVertex3f( 1.0f,-1.0f, 1.0f); // ��� �����
glColor3f(1.0f,1.0f,0.0f); // ������
glVertex3f( 1.0f,-1.0f,-1.0f); // ���� ����� �������� (���)
glVertex3f(-1.0f,-1.0f,-1.0f); // ���� ����
glVertex3f(-1.0f, 1.0f,-1.0f); // ��� ����
glVertex3f( 1.0f, 1.0f,-1.0f); // ��� �����
glColor3f(0.0f,0.0f,1.0f); // �����
glVertex3f(-1.0f, 1.0f, 1.0f); // ���� ����� �������� (����)
glVertex3f(-1.0f, 1.0f,-1.0f); // ���� ����
glVertex3f(-1.0f,-1.0f,-1.0f); // ��� ����
glVertex3f(-1.0f,-1.0f, 1.0f); // ��� �����
glColor3f(1.0f,0.0f,1.0f); // ����������
glVertex3f( 1.0f, 1.0f,-1.0f); // ���� ����� �������� (�����)
glVertex3f( 1.0f, 1.0f, 1.0f); // ���� ����
glVertex3f( 1.0f,-1.0f, 1.0f); // ��� ����
glVertex3f( 1.0f,-1.0f,-1.0f); // ��� �����
glEnd(); // ��������� ��������
xrf -= 0.15;
yrf -= 0.2;
zrf -= 0.25;
}
Uint32 my_callbackfunc(Uint32 interval, void *param){
printf("FPS = %d\n", fps);
fps=0;
return interval;
}вот пример программы с использованием библиотеки SDL. буфер глубини работает.
В том что привел ты нужно вернуть
glClearDepth(1.0);
Offline
#27 25.03.10 01:18
Re: [C++, OpenGL] Проблемы с буфером глубины
ща погуглил
http://linux.die.net/man/3/glutinitdisplaymode
тут написано что те нада при инициализации укахывать парамерт GLUT_DEPTH
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
Исправлено Hix (25.03.10 01:19)
Offline


