0 / 0 / 0
Регистрация: 20.09.2022
Сообщений: 39
1

software triangles clipping

13.09.2023, 13:46. Показов 801. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
изучаю ретро графику, и библиотеке растеризации glide3 столкнулся с проблемой "мусора", когда треугольники выходят за near_z.
Хотел поинтересоваться какие алгоритмы для отсечения невидимой части треугольников использовали в старых движках?
Мало информации нашел по этому вопросу.

software triangles clipping

software triangles clipping
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.09.2023, 13:46
Ответы с готовыми решениями:

Clipping при очень большом масштабе
Рисую глобус. Контуры материков и стран строю по координатам, получаемым из открытых карт (т.е. из...

Uv, verticles и triangles у mesh
Есть объект, у которого нет меша. Есть алгоритм, который подсчитывает значения вершин, uv и...

CMA Bosch WAS20762TR/07-FD9007 display software required, Two modules kill software
Hello friends This screen is loaded incorrectly and only 0000 output is very effort but no...

Press-Clipping
Hello, World! I'm looking for a remote employer on the topic of the press-clipping:rtfm: ...

8
1823 / 731 / 99
Регистрация: 01.10.2012
Сообщений: 3,738
17.09.2023, 14:37 2
Не видел ничего особенного, чисто базовая геометрия "пересечение отрезка с плоскостью". В результате получается довольно мерзкий "трапезоид" для растеризации
0
0 / 0 / 0
Регистрация: 20.09.2022
Сообщений: 39
18.09.2023, 05:11  [ТС] 3
Спасибо. я нашел что есть какой-то алгоритм Sutherland-Hodgeman который в древние времена использовали.
первый шаг я так понимаю мне из матрицы проекции (mvp) надо получить плоскости которые ее образуют (6шт)
glm_frustum_planes(mvp, planes) и потом посчитать расстояние каждой вершины до этой плоскости? если расстояние больше чем w они вне фруструма?
0
1823 / 731 / 99
Регистрация: 01.10.2012
Сообщений: 3,738
19.09.2023, 13:57 4
На мой взгляд здесь проще самому написать чем тратить время на изучение. Впрочем это дело вкуса. В любом случае результат = в общем случае многоугольник до 6 вершин которые все лежат во фрустуме. Что Вы собираетесь дальше с ними делать - не знаю
0
0 / 0 / 0
Регистрация: 20.09.2022
Сообщений: 39
06.10.2023, 15:01  [ТС] 5
Цитата Сообщение от Igor3D Посмотреть сообщение
Что Вы собираетесь дальше с ними делать - не знаю
выводить на экран. для каждой плоскости прогнать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void manual_geometry::draw()
{
    
    vec4 planes[6] = { 0 };
    glm_frustum_planes(model_view_projection, planes);
    
    for (int planeIndex = 0; planeIndex < 6; planeIndex++)
        clip_triangle(m_verts_transformed, planes[planeIndex]);
 
    //clip_triangle(m_verts_transformed, g_plane);
 
    int vertexes_count = m_verts_transformed.size();
    if (vertexes_count) {
        for (int vertex_index = 0; vertex_index < vertexes_count; vertex_index += 3) {
            //if (clip_triangle(model_view_projection, m_verts_transformed[vertex_index], m_verts_transformed[vertex_index + 1], m_verts_transformed[vertex_index + 2]))
            {
                grDrawTriangle(&m_verts_transformed[vertex_index], &m_verts_transformed[vertex_index + 1], &m_verts_transformed[vertex_index + 2]);
            }
        }
    }
 
    //grDrawVertexArray(m_gr_primitive_type, m_verts_transformed.size(), &m_verts_transformed);
    //guDrawTriangleWithClip // glideutl.h
и выводить.
правда, так как оказалось, мало просто клипать треугольники надо еще и интерполировать все данные которые я туда записал.
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
typedef struct {
    union
    {
        vec2 st;
        struct { float  s; float  t; };
    };
}  GrTmuVertex;
 
typedef struct
{
    union 
    { 
        FxU8 v[4];
        FxU32 value;
        struct { FxU8 a, r, g, b; };
    };
} GrColor;
 
typedef struct
{
    union {
        vec4 pos;
        struct { FxFloat x, y, z, w; };
    };
    //FxU32 rgba;
    GrColor color;
    GrTmuVertex  tmuvtx[GLIDE_NUM_TMU];
} GrVertex;
 
void SetupVertexLayout(void);
иначе фигня получается - текстуры тянутся в полоски и вертекс цвета ведут себя странно.
0
1823 / 731 / 99
Регистрация: 01.10.2012
Сообщений: 3,738
06.10.2023, 17:36 6
Цитата Сообщение от homeworld Посмотреть сообщение
выводить на экран. для каждой плоскости прогнать
C++
1
2
3
4
...
for (int planeIndex = 0; planeIndex < 6; planeIndex++)
        clip_triangle(m_verts_transformed, planes[planeIndex]);
...
Не так просто
Только знаешь, Игорек, это значительно страшнее
Кстати недавно создавал об этом тему в разделе "Геометрия", научный форум это не заинтересовало, но можем продолжить обсуждение там

Цитата Сообщение от homeworld Посмотреть сообщение
правда, так как оказалось, мало просто клипать треугольники надо еще и интерполировать все данные которые я туда записал.
Это наименьшая из всех проблем
0
0 / 0 / 0
Регистрация: 20.09.2022
Сообщений: 39
06.10.2023, 20:38  [ТС] 7
Цитата Сообщение от Igor3D Посмотреть сообщение
Не так просто
да вы правы, матрицу mvp вообще не надо брать.
у меня по сути все вершины уже трансформированы mvp и все что "нужно видеть" так или иначе лежит в пределах [-1..1] (клип пространства)
поэтому просто задаем 6 плоскостей и ими отсекаем все лишнее.
C++
1
2
3
4
5
6
7
    //plane definition = vec4{vec3=normal, distance}
    vec4 planes[6] = {  {1.0f, 0.0f, 0.0f, 1.0f}, // left plane
                        {-1.0f, 0.0f, 0.0f, 1.0f}, // right    
                        {0.0f, 1.0f, 0.0f, 1.0f}, // top plane
                        {0.0f, -1.0f, 0.0f, 1.0f}, // bottom plane
                        {0.0f, 0.0f, 1.0f, 1.0f},
                        {0.0f, 0.0f, -1.0f, 1.0f}};
клипаем все-так же по ним
C++
1
2
    for (int planeIndex = 0; planeIndex < 6; planeIndex++)
        clip_triangle(m_verts_transformed, planes[planeIndex]);
и выводим все что осталось.

вроде работает ...

Добавлено через 39 секунд
Цитата Сообщение от Igor3D Посмотреть сообщение
Это наименьшая из всех проблем
а какие еще есть? будут?)
0
1823 / 731 / 99
Регистрация: 01.10.2012
Сообщений: 3,738
07.10.2023, 13:05 8
Цитата Сообщение от homeworld Посмотреть сообщение
клипаем все-так же по ним
...
и выводим все что осталось.
Вот есть "большой" полигон что заполняет весь экран. Все его 3 точки вне фрустума. Как Вы решаете этот случай?

Добавлено через 4 минуты
Цитата Сообщение от homeworld Посмотреть сообщение
у меня по сути все вершины уже трансформированы mvp и все что "нужно видеть" так или иначе лежит в пределах [-1..1] (клип пространства)
Популярная ошибка. После домножения на MVP все лежит в пределах [-w..w], "clipped coordinates". И только после выполнения перспективного деления получаются NDC [-1..1]. Но отсечка должна выполняться до деления
0
0 / 0 / 0
Регистрация: 20.09.2022
Сообщений: 39
07.10.2023, 14:21  [ТС] 9
Цитата Сообщение от Igor3D Посмотреть сообщение
Популярная ошибка. После домножения на MVP все лежит в пределах [-w..w], "clipped coordinates". И только после выполнения перспективного деления получаются NDC [-1..1]. Но отсечка должна выполняться до деления
я почему то думал сlipped coordinates это [-1...1]
а ndc = [0..1] так как оно нормализировано вроде

так или иначе, в ближайших планах добавить камере возможность вращаться и летать по сцене (Flying actor), добавить чуть больше моделей и посмотреть как оно себя все ведет
0
07.10.2023, 14:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2023, 14:21
Помогаю со студенческими работами здесь

Clipping cursor
Привет всем. У меня есть проблема. В моем приложении действует захват курсора (ClipCursor), из...

не работает Clipping в NGUI
Всем привет ! У меня есть два NGUI интерфейса в виде списка из кнопок, этот список можно листать...

Software Testing Tools In Software Engineering
Programming testing can be performed either physically or utilizing mechanized testing devices. In...

Алгоритм отсечения "Fast Clipping"
помогите пожалуйста разобраться в этом алгоритме, я никак не могу понять зачем вообще мне нужны эти...

Software Developer,Senior Software Developer(C++)
В Ваши обязанности будет входить разработка и реализация программных компонентов под различные...

Software Engineer, C/C++
Должностные обязанности: - Разработка ПО под Linux; - исследования в области embedded...


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

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

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