Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
1 / 1 / 2
Регистрация: 22.04.2015
Сообщений: 27
1

Неправильная отрисовка текстур в OpenGL

27.09.2016, 19:33. Показов 1277. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго дня, недавно начал изучать как работать с графикой и решил повторить пример из урока, а именно - вращающийся кубик. Но столкнулся с такой проблемой: некоторые текстуры, расположенные дальше(глубже) самых ближних, отрисовываются поверх них.

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
#include <SFML/Graphics.hpp>
#include <SFML/OpenGl.hpp>
#include <glut.h>
using namespace sf;
 
int main()
{
    RenderWindow window(VideoMode(800, 600), "SFML OpenGL");
 
    Texture back;
    back.loadFromFile("resourses/background.jpg");
 
    Sprite background(back);
 
    GLuint texture = 0;
    {
        Image image;
        image.loadFromFile("resourses/texture.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_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    }
 
    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);
    glClearDepth(1.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 = 20.f;
 
        window.pushGLStates();
        window.draw(background);
        window.popGLStates();
 
        glClear(GL_DEPTH_BUFFER_BIT);
        glEnable(GL_DEPTH_TEST);
 
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslatef(0, 0, -100);
        glRotatef(time, 50, 50, 0);
 
        glBindTexture(GL_TEXTURE_2D, texture);
 
        glBegin(GL_QUADS);
 
        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);
 
        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);
 
        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);
 
        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);
 
        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);
 
        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();
 
        window.display();
    }
 
    glDeleteTextures(1, &texture);
 
    return 0;
}
Миниатюры
Неправильная отрисовка текстур в OpenGL  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.09.2016, 19:33
Ответы с готовыми решениями:

Неправильная отрисовка 3д модели
Я начал осваивать SFML и OpenGL. Я решил написать программу которая выводит и текстурирует простой...

Удаление текстур OpenGL
Ребята подскажите как удалить текстуру? Через метод glDeleteTextures, если да то какие параметры...

Неправильная отрисовка QGraphicsView
Доброго времени суток. Столкнулся со следующей проблемой. В конструкторе MainWindow создаю объекты...

Неправильная отрисовка линии
Проблема с отрисовкой нулевой линии при чтении линии графика из массива. Нулевая линия рисуется тем...

2
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
27.09.2016, 19:35 2
https://www.cyberforum.ru/opengl/
0
1 / 1 / 2
Регистрация: 22.04.2015
Сообщений: 27
27.09.2016, 21:00  [ТС] 3

Не по теме:

Спасибо, за ссылку, буду в следующий раз сначала смотреть там (хотя в этот раз, даже найдя похожую тему, решить проблему сразу не удалось).



Переписал сам координаты вершин квадратов-сторон по прикрепленной картинке, и добавив glEnable(GL_CULL_FACE); добился необходимого результата.

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
glEnable(GL_CULL_FACE);  
 
        glBegin(GL_QUADS);
 
        glTexCoord2f(0, 0); glVertex3f(0,    0,    0);   //передняя
        glTexCoord2f(1, 0); glVertex3f(size, 0,    0);
        glTexCoord2f(1, 1); glVertex3f(size, 0,    size);
        glTexCoord2f(0, 1); glVertex3f(0,    0,    size);
 
        glTexCoord2f(0, 0); glVertex3f(0,    size, 0);   //левая
        glTexCoord2f(1, 0); glVertex3f(0,    0,    0);
        glTexCoord2f(1, 1); glVertex3f(0,    0,    size);
        glTexCoord2f(0, 1); glVertex3f(0,    size, size);
 
        glTexCoord2f(0, 0); glVertex3f(size, size, 0);   //задняя
        glTexCoord2f(1, 0); glVertex3f(0,    size, 0);
        glTexCoord2f(1, 1); glVertex3f(0,    size, size);
        glTexCoord2f(0, 1); glVertex3f(size, size, size);
 
        glTexCoord2f(0, 0); glVertex3f(size, 0,    0);   //правая
        glTexCoord2f(1, 0); glVertex3f(size, size, 0);
        glTexCoord2f(1, 1); glVertex3f(size, size, size);
        glTexCoord2f(0, 1); glVertex3f(size, 0,    size);
 
        glTexCoord2f(0, 0); glVertex3f(0,    0,    size);   //верхняя
        glTexCoord2f(1, 0); glVertex3f(size, 0,    size);
        glTexCoord2f(1, 1); glVertex3f(size, size, size);
        glTexCoord2f(0, 1); glVertex3f(0,    size, size);
 
        glTexCoord2f(0, 0); glVertex3f(0,    size, 0);   //нижняя
        glTexCoord2f(1, 0); glVertex3f(size, size, 0);
        glTexCoord2f(1, 1); glVertex3f(size, 0,    0);
        glTexCoord2f(0, 1); glVertex3f(0,    0,    0);
 
        glEnd();
Хотя по прежнему остается загадкой: почему у автора урока работало без этих изменений...
Миниатюры
Неправильная отрисовка текстур в OpenGL   Неправильная отрисовка текстур в OpenGL  
0
27.09.2016, 21:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.09.2016, 21:00
Помогаю со студенческими работами здесь

Неправильная отрисовка фигур
Доброй ночи! Прошу помочь разобраться с ошибкой в работе программы-рисовалки (WPF). &lt;InkCanvas...

Неправильная отрисовка Stroke у RoundedRect
Подскажите, пожалуйста, с чем связана непавильная отрисовка strok-а у адобовского RoundRect. Дело в...

Нанесение текстур в OpenGL
Помогите создать текстуру и нанести на объект. Раньше пользовался библиотекой &quot;glaux.h&quot;, через...

Наложение текстур в OpenGL
Пытаюсь начать писать 3D игру с помощью OpenGL, но вот ни одного тутора по наложению текстур для...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru