DirectX11 - Цветная интерполяция вдоль квадратной диагоналиФилипсовая геометрия с OpenGL в Qt appHow для анимации облаков в плоскости Почему мой персонаж прыгает только наполовину так же высоко? Как определить, является ли игрок между двумя точками? Как я могу нарисовать «конус зрения», камеры в плоской 2D-мини-карте? Почему мой спрайт в клон-маори Марио обрезается, когда я пытаюсь изменить его? Как я могу управлять ресурсами в памяти и удалять их в соответствующее время с помощью структуры Ashley? AI не так, чтобы скользить кусочки для слайд-головоломки для android (libgdx) Как перемещать спрайт, как если бы он не поворачивался при повороте на 90 градусов? Как перенести переменную из сценария в другую в GodotWhat является правильным способом преобразования метров в пиксели при использовании Box2D? Как определить тело между двумя точками в игровом искусстве и ресурсах LibGDX2D, размер и разрешение эскиза /чертежа для ПК-консоли 1080P? Как я могу нарисовать 500 миллионов треугольников с OpenGL? Можете ли вы сравнить параметр с другим параметром er с помощью ChoiceFormat? Остановка отражающего raycast /linerender laserRendering 2D тени в альтернативе shaderGLSL ES 2.0 для dFdxFineHow для обнаружения и предотвращения разрешения поддельных столкновений? Как сохранить мировой шаг, рулон или рыскание дочерних объектов? Как использовать камеру в Google VR SDK 1.50 для Unity? График в Java JPEG /PNG для простой карты. Каковы шаблоны и как их использовать? (Othello /Chess ...) Является ли механизм ранжирования рангов рангом эвристики или статистики? Сколько матриц мне нужно представлять прямоугольную фигуру и переводить ее? Нужна определенная информация о сетчатой ​​триангуляции и геодезических сферах

Представьте, что мы имеем структуру вершин, которая выглядит так:

struct Vertex
{
    XMFLOAT3 position;
    XMFLOAT4 color;
};

Вершинный шейдер выглядит следующим образом:

cbuffer MatrixBuffer
{
    matrix world;
    matrix view;
    matrix projection;
};

struct VertexInput
{
    float4 position : POSITION;
    float4 color    : COLOR;
};

struct PixelInput
{
    float4 position : SV_POSITION;
    float4 color    : COLOR;
};

PixelInput main(VertexInput input)
{
    PixelInput output;

    input.position.w = 1.0f;

    output.position = mul(input.position,  world);
    output.position = mul(output.position, view);
    output.position = mul(output.position, projection);

    output.color = input.color;

    return output;
}

И пиксельный шейдер выглядит следующим образом:

struct PixelInput
{
    float4 position : SV_POSITION;
    float4 color    : COLOR;
};

float4 main(PixelInput input) : SV_TARGET
{
    return input.color;
}

Теперь создадим квадрант, состоящий из 2 треугольников и вершин A, B, C и D:

// Vertex A.
vertices[0].position = XMFLOAT3(-1.0f,  1.0f,  0.0f);
vertices[0].color    = XMFLOAT4( 0.5f,  0.5f,  0.5f,  1.0f);

// Vertex B.
vertices[1].position = XMFLOAT3( 1.0f,  1.0f,  0.0f);
vertices[1].color    = XMFLOAT4( 0.5f,  0.5f,  0.5f,  1.0f);

// Vertex C.
vertices[2].position = XMFLOAT3(-1.0f, -1.0f,  0.0f);
vertices[2].color    = XMFLOAT4( 0.5f,  0.5f,  0.5f,  1.0f);

// Vertex D.
vertices[3].position = XMFLOAT3( 1.0f, -1.0f,  0.0f);
vertices[3].color    = XMFLOAT4( 0.5f,  0.5f,  0.5f,  1.0f);

// 1st triangle.
indices[0] = 0; // Vertex A.
indices[1] = 3; // Vertex D.
indices[2] = 2; // Vertex C.

// 2nd triangle.
indices[3] = 0; // Vertex A.
indices[4] = 1; // Vertex B.
indices[5] = 3; // Vertex D.

Это приведет к появлению серого квадратика, как показано на рисунке ниже. Я выделил края красного цвета, чтобы лучше проиллюстрировать треугольники:

Теперь представьте, что мы хотим, чтобы наш квадрат имел другой цвет в вершине A:

// Vertex A.
vertices[0].position = XMFLOAT3(-1.0f, 1.0f, 0.0f);
vertices[0].color    = XMFLOAT4( 0.0f, 0.0f, 0.0f, 1.0f);

Это работает так, как ожидается, так как теперь есть интерполяция между черным цветом в вершине A и серым цветом в вершинах B, C и D. Вернемся к изменениям previum и вместо этого изменим цвет вершины C:

// Vertex C.
vertices[2].position = XMFLOAT3(-1.0f, -1.0f, 0.0f);
vertices[2].color    = XMFLOAT4( 0.0f,  0.0f, 0.0f, 1.0f);

Как вы можете видеть, интерполяция выполняется только половину пути по первому треугольнику, а не по всему квадрату. Это связано с тем, что между вершиной C и вершиной B нет ребра.

Что подводит нас к моему вопросу:

Я хочу, чтобы интерполяция проходила через весь квад, а не только через треугольник. Поэтому, независимо от того, какую вершину мы решили изменить цвет, интерполяция цвета всегда должна пересекать весь квад. Есть ли эффективный способ достижения этого, не добавляя больше вершин и треугольников?

Иллюстрация того, что я пытаюсь достичь, показана на изображении ниже:


Фон

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

Я пытаюсь текстурировать сетку рельефа в DirectX11. Он работает, но я немного недоволен результатом. При изменении текстуры ландшафта одной вершины интерполяция с другими вершинами приводит к форме шестиугольника вместо квадрата:

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

0 голосов | спросил MattOzymasCygonCooperSoulstorm89DerryLizardStdduri 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 15 Sep 2017 00:53:16 +0300 2017, 00:53:16

2 ответа


1

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

К сожалению, я не знаю Direct X или HLSL, но вот как это будет выглядеть в glsl. Я думаю, это похоже на HLSL. (Кроме того, это не в моей голове, непроверено.) Здесь я предполагаю, что ваши координаты текстуры идут от 0-1 в обоих направлениях.

uniform vec2 chosenCornerCoord;

void main()
{
    vec2 diff = gl_TexCoord[0].xy - chosenCornerCoord;
    float dist = sqrt(dot(diff, diff));
    gl_FragColor = vec4(dist, dist, dist, 1.0);
}

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

В приведенном выше примере gl_TexCoord[0] - это координата текстуры для текущего фрагмента. chosenCornerCoord - координата текстуры угла, на который вы хотите измерить расстояние. (Опять же, предполагая, что текстурные координаты от 0 до 1.)

ответил user1118321 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 15 Sep 2017 08:36:16 +0300 2017, 08:36:16
0

Вероятно, это не то, что вы хотите услышать, но вы считали, что используете текстуру эталонной смеси, а не то, что вы ограничены в настоящее время через текущую интерполяцию, ограниченную геометрией.

ответил ErnieDingo 22 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 22 Sep 2017 00:54:26 +0300 2017, 00:54:26

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

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

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