73 / 19 / 0
Регистрация: 26.04.2012
Сообщений: 233
1

Буфер глубины

19.06.2012, 13:09. Показов 8601. Ответов 40
Метки нет (Все метки)

Почему то не работает скрытие задних граней и т.д.Нарисовал пирамиду с помощью двух вееров треугольника.А задние стороны не удаляются и показываются=\Вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <math.h>
#include <stdlib.h>
#define GL_PI 3.1415f
 
void draw(){
        glPushMatrix();
    glRotatef(-20.0f,1.0f,0.0f,0.0f);
    glRotatef(10.0f,0.0f,1.0f,0.0f);
            glColor4f(1.0f, 1.0f, 0.0f,0.0f);
                glBegin(GL_TRIANGLE_FAN);
                    glVertex3f(25.0f,25.0f,25.0f);
                    glVertex3f(0.0f,0.0f,0.0f);
                    glVertex3f(50.0f,0.0f,0.0f);
                            glColor4f(1.0f, 0.0f, 0.23f,0.0f);
                    glVertex3f(50.0f,0.0f,50.0f);
                    
                    glVertex3f(25.0f,25.0f,25.0f);
                    glVertex3f(0.0f,0.0f,0.0f);
                    glVertex3f(0.0f,0.0f,50.0f);
                            glColor4f(1.0f, 1.0f, 0.23f,0.0f);
                    glVertex3f(50.0f,0.0f,50.0f);
                glEnd();
            lColor4f(0.0f, 0.0f, 1.0f,0.0f);
                 glBegin(GL_LINES);
                    glVertex3f(0.0f,0.0f,0.0f);
                    glVertex3f(0.0f,0.0f,100.0f);
                    
                    glVertex3f(0.0f,0.0f,0.0f);
                    glVertex3f(100.0f,0.0f,0.0f);
                    
                    glVertex3f(0.0f,0.0f,0.0f);
                    glVertex3f(0.0f,100.0f,0.0f);
              
                    
                    glVertex3f(0.0f,0.0f,0.0f);
                    glVertex3f(-100.0f,0.0f,0.0f);
                    
                    glVertex3f(0.0f,0.0f,0.0f);
                    glVertex3f(0.0f,-100.0f,0.0f);
                    
                glEnd();
        glPopMatrix();
    }
    
        void redraw()
{   
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
draw();
    glXSwapBuffers(dpDisplay, win); 
}
 
void resize(unsigned int width, unsigned int height)
{
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-100.0, 100.0, -100.0, 100.0, -100.0, 100.0);
    glMatrixMode(GL_MODELVIEW);
}
Добавлено через 2 часа 42 минуты
А может быть это связано с тем какие атрибуты графич.контекста я задаю при создании окна?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.06.2012, 13:09
Ответы с готовыми решениями:

Qt Буфер глубины
Всем здрасьте. У меня какие то необъяснимые проблемы с буфером глубины. А может и не с ним.. В...

Буфер глубины (Qt)
почему glEnable(GL_DEPTH_TEST) работает только с выпуклыми фигурами?

Линейный буфер глубины
Как бы эту штуку сделать по умному? Сейчас делаю так: В вершинном шейдере: camSpacePosition...

Не работает буфер глубины
Не могу понять почему не работает буфер глубины. Часть треугольника которая должна углубиться по...

40
2061 / 617 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
19.06.2012, 14:02 2
C++
1
glEnable(GL_DEPTH);
0
73 / 19 / 0
Регистрация: 26.04.2012
Сообщений: 233
19.06.2012, 14:48  [ТС] 3
Не помогло(((

Добавлено через 43 минуты
Эм,у меня что то перспективная проекция тоже не работает...мб это связано с библиотеками.Я скачал пакеты из синаптика(ubuntu)
0
2061 / 617 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
19.06.2012, 14:56 4
Покажите вашу функцию glClear(...);
0
73 / 19 / 0
Регистрация: 26.04.2012
Сообщений: 233
19.06.2012, 14:58  [ТС] 5
Цитата Сообщение от Justix Посмотреть сообщение
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
Так вот же)
0
2061 / 617 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
19.06.2012, 15:09 6
glEnable(GL_DEPTH_TEST);
0
73 / 19 / 0
Регистрация: 26.04.2012
Сообщений: 233
19.06.2012, 15:20  [ТС] 7
Извините,но я для кого код выложил...
void redraw()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
draw();
glXSwapBuffers(dpDisplay, win);
}
0
Псевдослучайный
1942 / 1142 / 97
Регистрация: 13.09.2011
Сообщений: 3,213
19.06.2012, 15:43 8
Задние в смысле обратные стороны полигонов? Тогда glEnable(GL_CULL_FACE);
0
73 / 19 / 0
Регистрация: 26.04.2012
Сообщений: 233
19.06.2012, 16:20  [ТС] 9
Нет,не то,поймите,мне просто нужно сделать чтобы объект отображался нормально.Не работает проверка глубины поэтому показываются задние стороны(не обязательно объекта,а вообще сцена,мы же не видим что находиться за объектом?нет.ну вот а тут всё видно)должна исправлять проверка глубина(то есть сравниваются z-ы пикселей)и показывается тот пиксель чей z ближе к наблюдателю.
0
Псевдослучайный
1942 / 1142 / 97
Регистрация: 13.09.2011
Сообщений: 3,213
19.06.2012, 16:34 10
А в инициализации контекста буфер глубины запрошен?
0
73 / 19 / 0
Регистрация: 26.04.2012
Сообщений: 233
19.06.2012, 16:40  [ТС] 11
вроде как да:
C++
1
2
3
4
5
6
7
int Attr[] = {  GLX_RGBA,
                GLX_RED_SIZE, 1,
                GLX_GREEN_SIZE, 1,
                GLX_BLUE_SIZE, 1,
                GLX_DEPTH_SIZE, 16,
                GLX_DOUBLEBUFFER,
                None};
Добавлено через 50 секунд
Вот вся инициализация:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <X11/keysym.h>
#include <GL/gl.h>
#include <GL/glx.h>
#include <GL/glut.h>
#include <stdio.h>
 
 
 
 
#ifndef WINDOW_H
#define WINDOW_H
 
 
int Attr[] = {  GLX_RGBA,
                GLX_RED_SIZE, 1,
                GLX_GREEN_SIZE, 1,
                GLX_BLUE_SIZE, 1,
                GLX_DEPTH_SIZE, 16,
                GLX_DOUBLEBUFFER,
                None};
 
XVisualInfo             *xvVisualInfo;
Colormap                cmColorMap;
XSetWindowAttributes    winAttr;
GLXContext              glXContext;
Display                 *dpDisplay;
Window                  win;
 
 
 
 
int openwindow()
{
 
    dpDisplay = XOpenDisplay(NULL);
    if(dpDisplay == NULL) return 0; 
 
 
    if(!glXQueryExtension(dpDisplay, NULL, NULL)) return 0; 
 
 
    xvVisualInfo = glXChooseVisual(dpDisplay, DefaultScreen(dpDisplay)/*Получаем номер экрана*/, Attr);
    if(xvVisualInfo == NULL) return 0; 
 
 
    cmColorMap = XCreateColormap(dpDisplay, RootWindow(dpDisplay, xvVisualInfo->screen), xvVisualInfo->visual, AllocNone);
    winAttr.colormap = cmColorMap;
    winAttr.border_pixel = 0;
    winAttr.background_pixel = 0;
    winAttr.event_mask = ExposureMask | ButtonPressMask | StructureNotifyMask | KeyPressMask;
 
 
    win = XCreateWindow(dpDisplay, RootWindow(dpDisplay, xvVisualInfo->screen),
                        0, 0,
                        1280, 960, 
                        0,
                        xvVisualInfo->depth, 
                        InputOutput,
                        xvVisualInfo->visual,
                        CWBorderPixel | CWColormap | CWEventMask,
                        &winAttr);
 
 
    glXContext = glXCreateContext(dpDisplay, xvVisualInfo, None, True);
    if(glXContext == NULL) return 0; 
 
 
    glXMakeCurrent(dpDisplay, win, glXContext);
 
    
    XMapWindow(dpDisplay, win);
    
 
    return 0;
}
#endif
Добавлено через 2 минуты
Мне кажется именно в инициализации проблема,ибо в пример где окно создаётся посредством глута и всё делается с помощью глута там всё работает.
0
2061 / 617 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
19.06.2012, 16:55 12
Напишите это сразу после инициализация ГЛ
C++
1
2
3
4
    glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
    glDepthFunc(GL_LEQUAL);
    glDepthRange(0.0, 1.0);
    glEnable(GL_DEPTH_TEST);
0
73 / 19 / 0
Регистрация: 26.04.2012
Сообщений: 233
19.06.2012, 16:59  [ТС] 13
добавил в самом конце инициализации,перед return 0...ничего...='(
0
73 / 19 / 0
Регистрация: 26.04.2012
Сообщений: 233
19.06.2012, 17:04  [ТС] 14
Вот так вот получается(
Миниатюры
Буфер глубины  
0
2061 / 617 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
19.06.2012, 17:16 15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
glViewport(0, 0, ширина окна, высота окна);
glMatrixMode(GL_PROJECTION);
 
gluPerspective(45.0f, (float)ширина окна/(float)высота окна, 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glDepthFunc(GL_LEQUAL);
glDepthRange(0.0, 1.0);
glEnable(GL_DEPTH_TEST);
 
//начало цикла
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); /// Что-то не заметила у вас!
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 
draw();
 
glXSwapBuffers(dpDisplay, win);
//конец цикла
0
73 / 19 / 0
Регистрация: 26.04.2012
Сообщений: 233
19.06.2012, 17:21  [ТС] 16
Эм,нууу,ничего=\при проекции опять же всё исчезает,убрал её.Глубина так же не работает=\
А вот что значит Начало конец цикла,это что ли в цикл нужно поместить?
0
73 / 19 / 0
Регистрация: 26.04.2012
Сообщений: 233
19.06.2012, 18:44  [ТС] 17
Сделал так:
C++
1
2
3
4
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glEnable(GL_CULL_FACE); //отсечение нивидимых поверхностей
Вот что вышло(
Миниатюры
Буфер глубины  
0
73 / 19 / 0
Регистрация: 26.04.2012
Сообщений: 233
19.06.2012, 18:51  [ТС] 18
Не обращайте внимания на одну сторону,это я неправильно порядок вершин сделал(щас всё исправил)Суть в том что так же ничего не рабит(
0
73 / 19 / 0
Регистрация: 26.04.2012
Сообщений: 233
19.06.2012, 19:03  [ТС] 19
При таком раскладе
C++
1
2
3
4
5
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
 glEnable(GL_CULL_FACE);//отсечение нивидимых поверхностей
glClearDepth(1.0f);
Получается вот что,тобишь ничего;
А без glEnable(GL_CULL_FACE); второе
Миниатюры
Буфер глубины   Буфер глубины  
0
73 / 19 / 0
Регистрация: 26.04.2012
Сообщений: 233
19.06.2012, 19:15  [ТС] 20
Нарисовал куб,и тут вроде как даже скрывается что то,но по-моему должно скрываться наоборот в прямом смысле
Миниатюры
Буфер глубины  
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.06.2012, 19:15

Opengl SFML C++ буфер глубины
Opengl SFML C++ Помогите. Не могу разобраться, что не так. Не отображается нормально объект....

Проблема с FBO: не рендерится буфер глубины
Всем привет. Возникла проблема с рендером буфера глубины. Вот код создания буфера: void...

Буфер глубины. С++ (Что я делаю не так?)
Вместо изображение &quot;карты высот&quot; получаю стабильно просто белую текстуру, вне зависимости от...

OpenGL WinAPI C++ не работает буфер глубины
Написал маленький код на OpenGL WinAPI C++ В инете прочесал не один сайт с примером по глубине с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.