Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ под Linux
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Ignatferum
3 / 3 / 1
Регистрация: 01.05.2017
Сообщений: 37
1

Некорректное отображение блока C++ OpenGL (Debian 9)

17.12.2017, 07:27. Просмотров 1409. Ответов 26

Установлена библиотека libsfml-dev 2.4.1

Написал программу по первому примеру с видео на YouTube (Создание 3d игр на C++: Minecraft)

Стороны блока отображаются неправильно - те, что находятся дальше отрисовывются перед теми, что находятся ближе:
Некорректное отображение блока C++ OpenGL (Debian 9)


Исходный код:
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <SFML/Graphics.hpp>
#include <SFML/OpenGL.hpp>
#include <iostream>
#include <GL/gl.h>
#include <GL/glu.h>
 
using namespace sf;
 
int main(){
    RenderWindow window(VideoMode(1280,900), "Mineisland");
 
    GLfloat xrot;
    GLfloat yrot;
    GLfloat zrot; 
 
    Texture t;
    t.loadFromFile("/home/denis/C++/MineIsland/resources/bg.jpg");
    Sprite bg(t);
 
    GLuint texture = 0;
    {
        Image image;
        image.loadFromFile("/home/denis/C++/MineIsland/resources/Blocks/dirt.jpg");
 
        glGenTextures(1, &texture);
        glBindTexture(GL_TEXTURE_2D, texture);
        gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, image.getSize().x, image.getSize().y, GL_RGBA, GL_UNSIGNED_BYTE, image.getPixelsPtr());
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
    }
 
    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);
    glClearDepth(10.f);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(90.f, 1.f, 1.f, 500.f);
    glEnable(GL_TEXTURE_2D);
 
    Clock clock;
 
    while (window.isOpen())
    {
        Event event;
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
        }
        float time = clock.getElapsedTime().asSeconds() * 100;
        float size = 10.f;
 
        window.pushGLStates();
        window.draw(bg);
        window.popGLStates();
 
        glClear(GL_DEPTH_BUFFER_BIT);
 
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslatef(0, 0, -40);
 
        glRotatef(xrot,1.0f,0.0f,0.0f);
                glRotatef(yrot,0.0f,1.0f,0.0f);
                glRotatef(zrot,0.0f,0.0f,1.0f);
 
        glBindTexture(GL_TEXTURE_2D, texture);
        glBegin(GL_QUADS);
 
            //back
            glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
            glTexCoord2f(1, 0); glVertex3f(size, -size, -size);
            glTexCoord2f(1, 1); glVertex3f(size, size, -size);
            glTexCoord2f(0, 1); glVertex3f(-size, size, -size);
 
            //front
            glTexCoord2f(0, 0); glVertex3f(size, -size, size);
            glTexCoord2f(1, 0); glVertex3f(-size, -size, size);
            glTexCoord2f(1, 1); glVertex3f(-size, size, size);
            glTexCoord2f(0, 1); glVertex3f(size, size, size);
 
            //left
            glTexCoord2f(0, 0); glVertex3f(-size, -size, size);
            glTexCoord2f(1, 0); glVertex3f(-size, -size, -size);
            glTexCoord2f(1, 1); glVertex3f(-size, size, -size);
            glTexCoord2f(0, 1); glVertex3f(-size, size, size);
 
            //right
            glTexCoord2f(0, 0); glVertex3f(size, -size, -size);
            glTexCoord2f(1, 0); glVertex3f(size, -size, size);
            glTexCoord2f(1, 1); glVertex3f(size, size, size);
            glTexCoord2f(0, 1); glVertex3f(size, size, -size);
 
            //bottom
            glTexCoord2f(0, 0); glVertex3f(-size, -size, size);
            glTexCoord2f(1, 0); glVertex3f(size, -size, size);
            glTexCoord2f(1, 1); glVertex3f(size, -size, -size);
            glTexCoord2f(0, 1); glVertex3f(-size, -size, -size);
 
            //top
            glTexCoord2f(0, 0); glVertex3f(-size, size, -size);
            glTexCoord2f(1, 0); glVertex3f(size, size, -size);
            glTexCoord2f(1, 1); glVertex3f(size, size, size);
            glTexCoord2f(0, 1); glVertex3f(-size, size, size);
 
        glEnd();
 
            xrot+=0.3f;
            yrot+=0.2f;
            zrot+=0.4f;
 
            window.display();
    }
 
    glDeleteTextures(1, &texture);
 
    return 0;
}
Для компиляции использую команды в терминале:
Bash
1
2
3
g++ -c /home/denis/C++/MineIsland/main.cpp
g++ main.o -o main -lsfml-graphics -lsfml-window -lsfml-system -lGLU -lGL
./main
Я много экспериментировал с изменением кода, пытался все переделать абсолютно по другому, но выходило всегда одно и то же.
Заранее спасибо за помощь
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2017, 07:27
Ответы с готовыми решениями:

Некорректное отображение диалогового окна. Win32API, OpenGL
Добрый вечер. Я пытаюсь сделать так, чтобы по нажатии кнопки меню появлялось модальное...

Некорректное отображения блока div
Здравствуйте всем. Делаю шаблон на joomla. Ну здесь только будет вопрос по css. Не могу понять...

Некорректное отображения блока div на движке Joomla 3
Здравствуйте всем. Делаю шаблон на joomla 3. С индексного файла шаблона protostar удалил весь html,...

Некорректное отображение
Всем привет, помоги пожалуйста советом. У меня есть сайт http://www.mia-luce.ru/ , во всех...

Некорректное отображение
Подскажите, пожалуйста, как решить проблему. Баннер, состоящий из 4 частей, отображается на...

26
8Observer8
3438 / 1868 / 327
Регистрация: 05.10.2013
Сообщений: 5,665
Записей в блоге: 140
18.12.2017, 08:27 21
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
С чего бы? Установка цвета очистки задается glClearColor()
Покажу на практике, что я описал. Задаю цвет очистки тёмно-зелёный:
C++
1
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
Очищаю буфер глубины (буфер цвета не очищаю)
glClear(GL_DEPTH_BUFFER_BIT);
Вместо тёмно-зелёного фон закрашивается чёрным, игнорируя цвет заданный с помощью glClearColor:
C++
1
glClear(GL_DEPTH_BUFFER_BIT);
Некорректное отображение блока C++ OpenGL (Debian 9)
0
8Observer8
3438 / 1868 / 327
Регистрация: 05.10.2013
Сообщений: 5,665
Записей в блоге: 140
18.12.2017, 08:47 22
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Там они только изменяются, но не инициализируются. Но если повезло и начальное значение не слишком велико, будет работать нормально, ведь там не важно какой угол был в начале.
Это плохая практика надеяться на то что повезёт. Проблема в том, что из Visual Studio этот код не будет работать нормально. Точнее, он вообще не будет работать. VS просто отказывается запускать такую программу, где локальные переменные используются до их инициализации.

Добавлено через 16 минут
Ignatferum, вот здесь в документации есть пример типичной программы на SFML для OpenGL: https://www.sfml-dev.org/tutorials/2.4/window-opengl.php

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

Попробуйте добавить два параметра:

C++
1
RenderWindow window(VideoMode(1280, 900), "Mineisland", Style::Default, ContextSettings(32));
0
Ignatferum
3 / 3 / 1
Регистрация: 01.05.2017
Сообщений: 37
18.12.2017, 10:41  [ТС] 23
Прошу прощения за мой косяк, программа, что вы мне сбросили с созданием шахматной доски прекрасно работает, просто я допустил ошибку в команде.
Некорректное отображение блока C++ OpenGL (Debian 9)

А добавление этих двух параметров ничего не изменило:
C++
1
RenderWindow window(VideoMode(1280, 900), "Mineisland", Style::Default, ContextSettings(32));
1
8Observer8
3438 / 1868 / 327
Регистрация: 05.10.2013
Сообщений: 5,665
Записей в блоге: 140
18.12.2017, 11:01 24
Лучший ответ Сообщение было отмечено Ignatferum как решение

Решение

Я перед тем как написать у себя проверял, у меня работает:

Некорректное отображение блока C++ OpenGL (Debian 9)


Попробуйте скопировать тот вариант, который я запускаю:

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <SFML/Graphics.hpp>
#include <SFML/OpenGL.hpp>
#include <iostream>
#include <GL/gl.h>
#include <GL/glu.h>
 
using namespace sf;
 
int main()
{
    RenderWindow window(VideoMode(500, 500), "Mineisland", Style::Default, ContextSettings(32));
 
    GLfloat xrot = 0.0f;
    GLfloat yrot = 0.0f;
    GLfloat zrot = 0.0f;
 
    Texture t;
    t.loadFromFile("Textures/bg.jpg");
    Sprite bg(t);
 
    GLuint texture = 0;
    {
        Image image;
        image.loadFromFile("Textures/dirt.jpg");
 
        glGenTextures(1, &texture);
        glBindTexture(GL_TEXTURE_2D, texture);
        gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, image.getSize().x, image.getSize().y, GL_RGBA, GL_UNSIGNED_BYTE, image.getPixelsPtr());
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
    }
 
    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);
    glClearDepth(10.f);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(90.f, 1.f, 1.f, 500.f);
    glEnable(GL_TEXTURE_2D);
 
    Clock clock;
 
    while (window.isOpen())
    {
        Event event;
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
        }
        float time = clock.getElapsedTime().asSeconds() * 100;
        float size = 10.f;
 
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
        window.pushGLStates();
        window.draw(bg);
        window.popGLStates();
 
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslatef(0, 0, -40);
 
        glRotatef(xrot, 1.0f, 0.0f, 0.0f);
        glRotatef(yrot, 0.0f, 1.0f, 0.0f);
        glRotatef(zrot, 0.0f, 0.0f, 1.0f);
 
        glBindTexture(GL_TEXTURE_2D, texture);
        glBegin(GL_QUADS);
 
        //back
        glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
        glTexCoord2f(1, 0); glVertex3f(size, -size, -size);
        glTexCoord2f(1, 1); glVertex3f(size, size, -size);
        glTexCoord2f(0, 1); glVertex3f(-size, size, -size);
 
        //front
        glTexCoord2f(0, 0); glVertex3f(size, -size, size);
        glTexCoord2f(1, 0); glVertex3f(-size, -size, size);
        glTexCoord2f(1, 1); glVertex3f(-size, size, size);
        glTexCoord2f(0, 1); glVertex3f(size, size, size);
 
        //left
        glTexCoord2f(0, 0); glVertex3f(-size, -size, size);
        glTexCoord2f(1, 0); glVertex3f(-size, -size, -size);
        glTexCoord2f(1, 1); glVertex3f(-size, size, -size);
        glTexCoord2f(0, 1); glVertex3f(-size, size, size);
 
        ////right
        glTexCoord2f(0, 0); glVertex3f(size, -size, -size);
        glTexCoord2f(1, 0); glVertex3f(size, -size, size);
        glTexCoord2f(1, 1); glVertex3f(size, size, size);
        glTexCoord2f(0, 1); glVertex3f(size, size, -size);
 
        ////bottom
        glTexCoord2f(0, 0); glVertex3f(-size, -size, size);
        glTexCoord2f(1, 0); glVertex3f(size, -size, size);
        glTexCoord2f(1, 1); glVertex3f(size, -size, -size);
        glTexCoord2f(0, 1); glVertex3f(-size, -size, -size);
 
        ////top
        glTexCoord2f(0, 0); glVertex3f(-size, size, -size);
        glTexCoord2f(1, 0); glVertex3f(size, size, -size);
        glTexCoord2f(1, 1); glVertex3f(size, size, size);
        glTexCoord2f(0, 1); glVertex3f(-size, size, size);
 
        glEnd();
 
        xrot += 0.03f;
        yrot += 0.2f;
        zrot += 0.04f;
 
        window.display();
    }
 
    glDeleteTextures(1, &texture);
 
    return 0;
}
1
18.12.2017, 11:01
8Observer8
3438 / 1868 / 327
Регистрация: 05.10.2013
Сообщений: 5,665
Записей в блоге: 140
18.12.2017, 11:15 25
Давайте попробуем создать, как в документации Window, вместо RenderWindow и добавим window.setActive(true)
C++
1
2
    Window window(VideoMode(500, 500), "Mineisland", Style::Default, ContextSettings(32));
    window.setActive(true);
Я картинку с фоном временно закомментировал, потому что у Window нет такой команды.

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <SFML/Graphics.hpp>
#include <SFML/OpenGL.hpp>
#include <iostream>
#include <GL/gl.h>
#include <GL/glu.h>
 
using namespace sf;
 
int main()
{
    Window window(VideoMode(500, 500), "Mineisland", Style::Default, ContextSettings(32));
    window.setActive(true);
 
    GLfloat xrot = 0.0f;
    GLfloat yrot = 0.0f;
    GLfloat zrot = 0.0f;
 
    Texture t;
    t.loadFromFile("Textures/bg.jpg");
    Sprite bg(t);
 
    GLuint texture = 0;
    {
        Image image;
        image.loadFromFile("Textures/dirt.jpg");
 
        glGenTextures(1, &texture);
        glBindTexture(GL_TEXTURE_2D, texture);
        gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, image.getSize().x, image.getSize().y, GL_RGBA, GL_UNSIGNED_BYTE, image.getPixelsPtr());
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
    }
 
    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);
    glClearDepth(10.f);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(90.f, 1.f, 1.f, 500.f);
    glEnable(GL_TEXTURE_2D);
 
    Clock clock;
 
    while (window.isOpen())
    {
        Event event;
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
        }
        float time = clock.getElapsedTime().asSeconds() * 100;
        float size = 10.f;
 
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
        //window.pushGLStates();
        //window.draw(bg);
        //window.popGLStates();
 
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslatef(0, 0, -40);
 
        glRotatef(xrot, 1.0f, 0.0f, 0.0f);
        glRotatef(yrot, 0.0f, 1.0f, 0.0f);
        glRotatef(zrot, 0.0f, 0.0f, 1.0f);
 
        glBindTexture(GL_TEXTURE_2D, texture);
        glBegin(GL_QUADS);
 
        //back
        glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
        glTexCoord2f(1, 0); glVertex3f(size, -size, -size);
        glTexCoord2f(1, 1); glVertex3f(size, size, -size);
        glTexCoord2f(0, 1); glVertex3f(-size, size, -size);
 
        //front
        glTexCoord2f(0, 0); glVertex3f(size, -size, size);
        glTexCoord2f(1, 0); glVertex3f(-size, -size, size);
        glTexCoord2f(1, 1); glVertex3f(-size, size, size);
        glTexCoord2f(0, 1); glVertex3f(size, size, size);
 
        //left
        glTexCoord2f(0, 0); glVertex3f(-size, -size, size);
        glTexCoord2f(1, 0); glVertex3f(-size, -size, -size);
        glTexCoord2f(1, 1); glVertex3f(-size, size, -size);
        glTexCoord2f(0, 1); glVertex3f(-size, size, size);
 
        ////right
        glTexCoord2f(0, 0); glVertex3f(size, -size, -size);
        glTexCoord2f(1, 0); glVertex3f(size, -size, size);
        glTexCoord2f(1, 1); glVertex3f(size, size, size);
        glTexCoord2f(0, 1); glVertex3f(size, size, -size);
 
        ////bottom
        glTexCoord2f(0, 0); glVertex3f(-size, -size, size);
        glTexCoord2f(1, 0); glVertex3f(size, -size, size);
        glTexCoord2f(1, 1); glVertex3f(size, -size, -size);
        glTexCoord2f(0, 1); glVertex3f(-size, -size, -size);
 
        ////top
        glTexCoord2f(0, 0); glVertex3f(-size, size, -size);
        glTexCoord2f(1, 0); glVertex3f(size, size, -size);
        glTexCoord2f(1, 1); glVertex3f(size, size, size);
        glTexCoord2f(0, 1); glVertex3f(-size, size, size);
 
        glEnd();
 
        xrot += 0.03f;
        yrot += 0.2f;
        zrot += 0.04f;
 
        window.display();
    }
 
    glDeleteTextures(1, &texture);
 
    return 0;
}
1
Ignatferum
3 / 3 / 1
Регистрация: 01.05.2017
Сообщений: 37
18.12.2017, 11:44  [ТС] 26
Да! Этот вариант прекрасно работает, но я не пойму никак, я же добавлял уже эти два параметра в RenderWindow, но заработало только после того, как я скопировал именно ваш код, а если снова убираю эти параметры, то куб снова не работает. Вообщем, спасибо большое! Убил кучу времени из-за одного простого кубика
1
8Observer8
3438 / 1868 / 327
Регистрация: 05.10.2013
Сообщений: 5,665
Записей в блоге: 140
18.12.2017, 12:04 27
Ignatferum, я очень рад! Я вам сделаю сегодня или завтра точно такой же пример на актуальном OpenGL 3. Может вам сейчас этот пример не нужен будет, потому что может быть вы настроены пока изучать decprecated/legacy OpenGL. Но скорее всего, потом вы поймёте насколько гибкий шейдерный OpenGL, что по нему быстрее помогают (большинство переключилось на шейдерный и забывают старый), много туториалов по шейдерному и вы найдёте свою тему и может вам это пример поможет. А мне польза в упражнении. Я не так давно начал серьёзно изучать шейдерный и от начинающего неделеко ушёл. Хочу сделать прямоугольник с фоном в ортогональной проекции с переключением на перспективную проекцию. GUI элементы тоже так выводят, поэтому это в любом случае будет полезно.
0
18.12.2017, 12:04
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2017, 12:04

Некорректное отображение
Помогите, пожалуйста, с проблемой. Есть какой той каркас.Макет будет фиксированным. Я задаю...

Некорректное отображение в ИЕ
Добрый день! Как исправить некорректное отображение в ИЕ сайта advokatlogika.ru

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


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

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

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