Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
80 / 39 / 22
Регистрация: 03.05.2013
Сообщений: 686
1

Window resize и z buffer

18.03.2015, 17:42. Показов 1902. Ответов 15
Метки нет (Все метки)

Подскажите, на экране 2 объекта с разной глубиной , с отображением проблем нету, но как только начинаю изменять размер окна, объекты начинают рябить при этом их размер меняется. Как только отключаю Z буфер, сразу всё начинает работать как надо, кроме отображения на экране в Z плоскости.
Включаю, очищаю
C++
1
2
    glEnable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
В чём может быть причина ?
Window resize и z buffer

Была прямая линия. Так она выглядит при изменении окна.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.03.2015, 17:42
Ответы с готовыми решениями:

resize window
Привет всем зашедшим. В браузере, если зажать ctrl и колесиком перед назад, содержимое сайта будет...

Где ошибка: ClearBuffer(Buffer,sizeof(Buffer)); WRITE(Buffer,test,20,ALL);
Cho ne pravilno v sledyushem code: #define ALL; ........ ClearBuffer(Buffer,sizeof(Buffer));...

Window resize, как сделать чтобы учитывал только ширину
Здраствуйте ! Как сделать чтобы window resize учитывал только изменение окна браузера а высоту не...

How can I resize all controls or just resize the space between them?
Hi. How can I resize all controls or just resize the space between them, when the form is resized...

15
Эксперт GPSS
534 / 401 / 97
Регистрация: 02.07.2010
Сообщений: 1,645
18.03.2015, 20:25 2
проект в студию или код, экстрасенсов нет
0
80 / 39 / 22
Регистрация: 03.05.2013
Сообщений: 686
18.03.2015, 20:48  [ТС] 3
Добавлю сразу в кучу
Вообщем ни чего нету кроме
Инициализация
C++
1
2
3
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 
    glDepthFunc(GL_LEQUAL);
    glEnable(GL_DEPTH_TEST);
Далее РАБОТАЕТ на УРА
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    glBegin(GL_TRIANGLE_STRIP);
        for(int i = 0; i < buffer_size; i++){
            glColor4f(0.0f,0.7f,0.0f, 1.0f);
                        //Какая то фигура, к примеру квадрат
                       glVertex3f( ......................., -1.0f ); 
        }
    glEnd();
 
    glBegin(GL_TRIANGLE_STRIP);
        for(int i = 0; i < buffer_size; i++){
            glColor4f(0.7f,0.7f,0.0f, 1.0f);
                        //Какая то фигура, к примеру квадрат 2
                       glVertex3f( ......................., 0.0f ); 
        }
    glEnd();
Тут всё отлично, Z буфер работает, изменяем окно, всё отлично.
Теперь всё тоже самое только через VBO и Шейдер
C++
1
2
3
4
5
        if(perekluchatel[0] == 1.0){
            gl_Position = vec4(grid_x, grid_y, 1.0, 1.0);
        }else{
            gl_Position = vec4(grid_x, grid_y, 0.0, 1.0);
        }
Сам VBO выкладывать не буду, смысла нету, в этом коде ни каких команд типа glEnable. Дак вот через VBO при изменении размера окна начинает мигать экран, как на скриншоте, а если отрисовать ту же память через glBegin (который выше) проблем нету... Как же так? Можно схитрить , отключить Z буфер и отрисовать VBO далее снова его включить, но тогда нету смысла.
0
Эксперт GPSS
534 / 401 / 97
Регистрация: 02.07.2010
Сообщений: 1,645
18.03.2015, 21:51 4
Цитата Сообщение от zasadadada Посмотреть сообщение
glDepthFunc(GL_LEQUAL);
* * glEnable(GL_DEPTH_TEST);

попробуйте в инициализации с начало включать тест глубины а потом задавать параметры а не наоборот

Прототип:


void glDepthFunc(GLenum func);

Параметры:


func : значение операции сравнения глубины. Поддерживаемые константы GL_NEVER, GL_LESS, GL_EQUAL, GL_LEQUAL,
GL_GREATER, GL_NOTEQUAL, GL_GEQUAL, GL_ALWAYS. Значение по умолчанию GL_LESS.

Описание:


glDepthFunc определяет функцию, используемую для сравнения входящих значений z-буфера со значениями уже
находящимися в z-буфере. Сравнение происходит только при включенной проверке глубины. (Включить/выключить ее можно
функциями glEnable/glDisable с параметром GL_DEPTH_TEST)

func операция сравнения. При прохождении пиксел рисуется.

GL_NEVER : Никогда не проходит.
GL_LESS : Проходит, если входящее значение меньше установленного.
GL_EQUAL : Проходит, если входящее значение равно установленному.
GL_LEQUAL : Проходит, если входящее значение меньше или равно установленного.
GL_GREATER : Проходит, если входящее значение больше установленного.
GL_NOTEQUAL : Проходит, если входящее значение не равно установленному.
GL_GEQUAL : Проходит, если входящее значение больше или равно установленного.
GL_ALWAYS : Проходит всегда.

По умолчанию операция сравнения равна GL_LESS, а тест глубины отключен.

Ошибки:


GL_INVALID_ENUM возникает когда func имеет недопустимое значение.
GL_INVALID_OPERATION возникает при вызове glDepthFunc между парой glBegin/glEnd.

Добавлено через 2 минуты
и если чесно из информации которую написали трудно понять что у вас там вообще за проект))

Добавлено через 8 минут
zasadadada, помогло?
1
80 / 39 / 22
Регистрация: 03.05.2013
Сообщений: 686
19.03.2015, 10:12  [ТС] 5
Частично, пришёл к
C++
1
2
3
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
Теперь происходит странная вещь, в качестве фигуры беру как обычно прямоугольник, рисую через....
C++
1
2
3
4
5
6
7
    #version 430 core
 
    layout(location = 0) in vec2 data;
 
    void main(){
        gl_Position = vec4(data.x, data.y, 0.5, 1.0);
    }
Посылаю
C++
1
2
3
4
5
6
7
8
9
10
    glUseProgram(Program);
        glBindBuffer(GL_ARRAY_BUFFER, *vbo_test);
            glEnableVertexAttribArray(0);
            glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
 
            glDrawArrays(GL_QUADS, 0, 4);
 
            glDisableVertexAttribArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
    glUseProgram(0);
Выходит странная штука при изменении окна:
Оригинал выглядит
Window resize и z buffer

Теперь когда я начинаю изменять размер окна
Window resize и z buffer

Как быть не знаю.
0
80 / 39 / 22
Регистрация: 03.05.2013
Сообщений: 686
19.03.2015, 10:53  [ТС] 6
Добавил 2 картинки
Window resize и z buffer

Window resize и z buffer
0
2479 / 1290 / 215
Регистрация: 26.02.2009
Сообщений: 5,608
Записей в блоге: 5
19.03.2015, 11:01 7
При ресайзе glViewport изменяете?
1
80 / 39 / 22
Регистрация: 03.05.2013
Сообщений: 686
19.03.2015, 11:05  [ТС] 8
Да, конечно, glViewport(0, 0, x, y);
Намёк понял, видимо не надо. Всё в матрицы...
0
2479 / 1290 / 215
Регистрация: 26.02.2009
Сообщений: 5,608
Записей в блоге: 5
19.03.2015, 11:10 9
Фрагментный шейдер какой? И видеокарта поддерживает 4.3 core profile? Поставьте по меньше 3.3
0
80 / 39 / 22
Регистрация: 03.05.2013
Сообщений: 686
19.03.2015, 11:15  [ТС] 10
C++
1
2
3
4
5
    #version 330
 
    void main(){
        gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
    }
Выставил 3.3 Скорее всего просто откажусь от Viewport, добавлю матрицу.
0
2479 / 1290 / 215
Регистрация: 26.02.2009
Сообщений: 5,608
Записей в блоге: 5
19.03.2015, 11:25 11
Лучший ответ Сообщение было отмечено zasadadada как решение

Решение

Цитата Сообщение от zasadadada Посмотреть сообщение
Скорее всего просто откажусь от Viewport, добавлю матрицу.
Этого нельзя делать(отказываться от glViewport). Иначе карта не будет знать какого разрешения выделять буфер цвета и глубины. Кстати, При нинциализации GL сколько бит под Z буффер?

И вообще лучше выложите весь код. А то так по 1 строчке будем долго искать ошибку.

Добавлено через 4 минуты
В конце кадра ещё проверяйте glGetError()
1
80 / 39 / 22
Регистрация: 03.05.2013
Сообщений: 686
19.03.2015, 11:56  [ТС] 12
Постараюсь выложить всю информацию
Кликните здесь для просмотра всего текста

Создание окна
C++
1
CreateWindowEx(0, class_name, "test", WS_CHILD | WS_VISIBLE,  0, 0, x, y, main_window, NULL, (HINSTANCE)hInstance, NULL);
Настройка пикселя
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    PIXELFORMATDESCRIPTOR pfd =
    {
        sizeof(PIXELFORMATDESCRIPTOR),
        1,
        PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,    //Flags
        PFD_TYPE_RGBA,            //The kind of framebuffer. RGBA or palette.
        32,                        //Colordepth of the framebuffer.
        0, 0, 0, 0, 0, 0,
        0,
        0,
        0,
        0, 0, 0, 0,
        16,                        //Number of bits for the depthbuffer
        8,                        //Number of bits for the stencilbuffer
        0,                        //Number of Aux buffers in the framebuffer.
        PFD_MAIN_PLANE,
        0,
        0, 0, 0
    };
Resize
C++
1
2
            MoveWindow(child_window, 0, 0, x, y, FALSE);
            glViewport(0, 0, x, y);
Init
C++
1
2
3
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
Рисуем кубики
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    glColor3f(1,0,0);
    glBegin(GL_QUADS);
            glVertex3d( -1,0, -0.8 ); 
            glVertex3d( -1,1, -0.8 ); 
            glVertex3d( 0,1, -0.8 ); 
            glVertex3d( 0,0, -0.8 ); 
    glEnd();
 
    glColor3f(0,1,0);
    glBegin(GL_QUADS);
            glVertex3d( 0,0, -0.9 ); 
            glVertex3d( 0,1, -0.9 ); 
            glVertex3d( 1,1, -0.9 ); 
            glVertex3d( 1,0, -0.9 ); 
    glEnd();
 
    glColor3f(0,0,1);
    glBegin(GL_QUADS);
            glVertex3d( 0-0.5,0, -1.0 ); 
            glVertex3d( 0-0.5,1, -1.0 ); 
            glVertex3d( 1-0.5,1, -1.0 ); 
            glVertex3d( 1-0.5,0, -1.0 ); 
    glEnd();
Рисую на glBegin
Эффект тот же, как на картинке

Вроде ни чего не забыл, если что добавлю...

C++
1
2
3
4
5
6
7
8
9
10
        draw();
 
        char input[32];
        GLenum err;
        while ((err = glGetError()) != GL_NO_ERROR) {
            sprintf(input, "error: " "%d"  , err);
            MessageBox(NULL, input, NULL, NULL);
        }
 
        SwapBuffers(hDC);
Ошибок нету...

Ребята, кажется разобрался, статус разобрался Beta
Дело в том, что сначала надо glViewport
C++
1
2
            glViewport(0, 0, x, y); 
            MoveWindow(child_window, 0, 0, x, y, FALSE);
0
2479 / 1290 / 215
Регистрация: 26.02.2009
Сообщений: 5,608
Записей в блоге: 5
19.03.2015, 11:58 13
Zбуфера нет!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PIXELFORMATDESCRIPTOR pfd =
    {
        sizeof(PIXELFORMATDESCRIPTOR),
        1,
        PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,    //Flags
        PFD_TYPE_RGBA,            //The kind of framebuffer. RGBA or palette.
        32,                        //Colordepth of the framebuffer.
        0, 0, 0, 0, 0, 0,
        0,
        0,
        0,
        0, 0, 0, 0,
        16,                        //Number of bits for the depthbuffer
        8,                        //Number of bits for the stencilbuffer
        0,                        //Number of Aux buffers in the framebuffer.
        PFD_MAIN_PLANE,
        0,
        0, 0, 0
    };
32 - глубина colorbuffer
0 - глубина zbuffer
0
80 / 39 / 22
Регистрация: 03.05.2013
Сообщений: 686
19.03.2015, 11:59  [ТС] 14
16, //Number of bits for the depthbuffer
Вроде как оно же?
0
2479 / 1290 / 215
Регистрация: 26.02.2009
Сообщений: 5,608
Записей в блоге: 5
19.03.2015, 12:01 15
А нет
0
80 / 39 / 22
Регистрация: 03.05.2013
Сообщений: 686
19.03.2015, 12:04  [ТС] 16
Всем спасибо всех заплюсовал.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.03.2015, 12:04

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Fwrite (buffer , sizeof(char), sizeof(buffer), pFile)
как записать часть массива чаров? допустим у нас arr; мне надо записать с позиции массива 500 до...

Вызов Window.ShowDialog() срабатывает как Window.Show(), т.е. я могу нажимать на другие окна
Здравствуйте, уважаемые форумчане. Столкнулся с проблемой. У меня есть окно, которое выполняет...

Window является свойством глобального объекта Window
если объект window является свойством глобального объекта Window, то почему запись: Window.window...

Почему в Opera v12.0 координаты окна браузера относительно экрана window.screenX или window.screenY выдает 0?
Здравствуйте, подскажите пожалуйста почему в Opera v 12.0, координаты окна браузера относительно...


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

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

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