Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
15 / 15 / 3
Регистрация: 18.03.2012
Сообщений: 91
1

Артефакты при отрисовке прозрачного куба

30.11.2016, 12:41. Показов 1595. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Столкнулся со следующей проблемой: при отрисовке прозрачного куба возникают неожиданные пропажи некоторых его частей при взгляде под определенными углами. Пример артефактов я приложил. При небольших поворотах или приближениях проблема исчезает. Причем неожиданно то, что пропадают именно такие кусочки: модель куба состоит из 12 прямоугольных треугольников (по 2 на каждую грань).
Рендерится куб следующим образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
glGenBuffers(1, &VB_tmp);
glBindBuffer(GL_ARRAY_BUFFER, VB_tmp);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vertex), vertices.data(), GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, VB_tmp);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)20);
glDrawArrays(GL_TRIANGLES, 0, vertices.size());
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(2);
glDeleteBuffers(1, &VB_tmp);
Настройки такие:
C++
1
2
3
4
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Я новичок в OpenGL, поэтому если честно даже не представляю из-за чего такое может происходить и что делать. Заранее спасибо за помощь!
Изображения
  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.11.2016, 12:41
Ответы с готовыми решениями:

Помощь при отрисовке
Есть программа скринмейт, программа нарезает изображения и тп, но когда заходит на второй круг, то...

Пропадание прозрачного фона при плавном перемещении объекта
на форме с фоновой картинкой есть pictureBox, который на клик плавно по событию таймера...

Прозрачность модели при отрисовке
Есть модель острова в формате fbx: http://s018.***********/i509/1303/80/8f954f7d4f60t.jpg Вот...

Задержка при отрисовке квадрата
Здравствуйте, дорогие форумчане! Нужна Ваша помощь. Написал код, который рисует прямоугольник, а...

5
656 / 237 / 46
Регистрация: 24.01.2013
Сообщений: 726
30.11.2016, 13:12 2
Доя прозрачных объектов нужно сортировать грани по расстоянию от камеры и рисовать от дальних к ближним.
0
15 / 15 / 3
Регистрация: 18.03.2012
Сообщений: 91
30.11.2016, 13:20  [ТС] 3
Да, я ровно так и делал. Но как видно на картинке - проблемы даже не с порядком треугольников, пропадают именно какие-то кусочки
0
3420 / 1607 / 236
Регистрация: 26.02.2009
Сообщений: 7,858
Записей в блоге: 5
30.11.2016, 16:44 4
C++
1
2
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)20);
А у вас точно атрибуты 0 и 2(первый параметр)?
Шейдер покажите?
0
15 / 15 / 3
Регистрация: 18.03.2012
Сообщений: 91
30.11.2016, 19:34  [ТС] 5
Вершинный
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#version 330
 
layout (location = 0) in vec3 Position;
layout (location = 2) in vec3 Normal;
 
out vec3 WorldPos0;
out vec3 Normal0;
 
uniform mat4 gWorld;
uniform mat4 gCamera;
uniform mat4 gProjection;
 
void main()
{
    gl_Position = gProjection * gCamera * gWorld * vec4(Position, 1.0);
    Normal0 = (gWorld * vec4(Normal, 0.0)).xyz;
    WorldPos0   = (gWorld * vec4(Position, 1.0)).xyz;
}
Фрагментарный
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
#version 330
 
out vec4 FragColor;
 
uniform vec3 gEyeWorldPos;
uniform vec3 gLightWorldPos;
 
in vec3 WorldPos0;
in vec3 Normal0;
 
void main (void)
{
    const vec4  diffColor = vec4 ( 0.0, 0.0, 0.8, 1.0 );
    const vec4  specColor = vec4 ( 0.7, 0.7, 0.0, 1.0 );
    const float specPower = 50.0;
    const vec4 ambientColor = vec4(0.0, 0.0, 0.8, 1.0);
    const float ambientIntensity = 0.5;
    
    vec4 amb = ambientColor * ambientIntensity;
 
    vec3 n2 = normalize(Normal0);
    vec3 l2 = normalize(gLightWorldPos - WorldPos0);
    vec3 v2 = normalize(gEyeWorldPos - WorldPos0);
 
    vec3 r    = reflect ( -v2, n2 );
    vec4 diff = diffColor * max ( dot ( n2, l2 ), 0.0 );
    vec4 spec = specColor * pow ( max ( dot ( l2, r ), 0.0 ), specPower );
 
    gl_FragColor = diff + spec + amb;
    gl_FragColor.a = 0.3;
}
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,748
01.12.2016, 08:03 6
Цитата Сообщение от stanis-morozov Посмотреть сообщение
Да, я ровно так и делал
Значит меняли порядок вертексов т.к. выводите glDrawArrays. Я бы начал с распечатки тр-ков (по 3 вертекса в строке)
0
01.12.2016, 08:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.12.2016, 08:03
Помогаю со студенческими работами здесь

Ошибка при отрисовке линии
Добрый день гении! Пытаюсь разобраться с QPainter, QPaintEvent для того, чтобы рисовать собственно...

Пробелы при отрисовке текста
Текст рисуется с пробелами - рис. слева (исп. System.Drawing.Graphics: DrawText и MeasureString)....

Зависание при отрисовке квадратов
Здравствуйте, дорогие форумчане! Проблема заключается в следующем: программа - отрисовывет...

Мерцание при отрисовке объекта
Вечер добрый! Собственно, в моей программе при круговом движении эллипса наблюдается мерцание на...


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

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