«Выделение» Лица /Кромки /Уголки

Как бы я «выделил» грани /края /углы? Я бы предпочел объяснение OpenGL, если возможно.

Вот пример:

 введите описание изображения здесь>> </a> </p></body></html>

4 голоса | спросил Type 10 23 rdEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 23 Sep 2016 13:06:04 +0300 2016, 13:06:04

1 ответ


1

В зависимости от уровня вашего навыка прочный wireframes может быть вариантом.

(изображение, заимствованное из связанной бумаги NVIDIA) введите описание изображения здесь

Изображения в примере на NVIDIA показывают выделение краев треугольников, но это то, над чем вы можете работать.

Вы можете использовать геометрический шейдер для создания барицентрических координат, а затем проверить их в своем шейдере фрагмента, чтобы определить расстояние от фрагмента от края.

Если расстояние падает ниже некоторого порога, установите цвет фрагмента на нужный цвет «провод» и верните его. В противном случае, тень как обычно.

Другой вариант - сделать вашу модель заполненной, а затем визуализировать ее снова, поскольку каркас с детекцией глубины отключен. Однако, в отличие от сплошных каркасов, для этого требуется второй проход, и он просто чувствует себя неэлегантным. Кроме того, рендеринг в режиме каркаса значительно медленнее, чем рендеринг заполненных примитивов.

Или вы можете просто визуализировать текстуру с хорошей границей, но это будет выглядеть как дерьмо, если вы не настроите свои координаты текстуры в пиксельном /фрагментном шейдере.

Вот фрагмент из одного из моих геометрических шейдеров, который выполняет основную работу:

void EmitTriangle(vec3 v0, vec3 v1, vec3 v2)
{
    // float a[5] = float[](3.4, 4.2, 5.0, 5.2, 1.1);
    vec3 verts[] = vec3[]( v0, v1, v2 );

    for (int i = 0; i < 3; ++i)
    {
        vec4 p = vec4(verts[i], 1);

        gl_Position = Projection * View * World * p;
        gOut.ObjectPosition = p;
        gOut.WorldPosition = World * p;
        gOut.Color = vec4(1, 0, 1, 1);
        gOut.BaryPosition = vec3(i == 0, i == 1, i == 2);
        //gOut.BaryPosition.rgb = vec3(1.0f);



        EmitVertex();
    }

    EndPrimitive();
}

и связанный с фрагментами фрагментарный шейдер:

const float wireDistance = 0.05f;

/// check interpolated BaryPosition to determine distance to edge.
bool showWire = (gOut.BaryPosition.x < wireDistance
                || gOut.BaryPosition.y < wireDistance
                || gOut.BaryPosition.z < wireDistance)
                ;

if (showWire) { // return the desired wire color }

Вероятно, вы можете заменить '||' триплет с любым (gOut.BaryPosition & ltd wireDistance), но у меня нет времени попробовать его и запомнить, что шейдерный компилятор немного невнимателен к этому.

ответил 3Dave 23 rdEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 23 Sep 2016 20:27:48 +0300 2016, 20:27:48

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132