DirectX Clip текстурные координаты - PullRequest
5 голосов
/ 24 февраля 2012

Хорошо, сначала я использую:

  • DirectX 10
  • C ++

Ладно, это немного странно для меня, яОбычно я не задаю вопрос, но я был вынужден обстоятельствами.У меня есть два треугольника (не по четырем по причинам, в которые я не буду вдаваться!) На весь экран, выровненный по экрану благодаря тому факту, что они не преобразованы.

В объявлении вершины DirectX я передаю 3-компонентное плавающее число (Поз.x, y, z) и 2-х компонентные числа с плавающей запятой (Texcoord x, y). Texcoord z зарезервирован для массивов texture2d, в настоящее время я по умолчанию использую значение 0 в пиксельном шейдере.

Я написал это для выполнения простой задачи:

float fStartX = -1.0f;
float fEndX = 1.0f;
float fStartY = 1.0f;
float fEndY = -1.0f;
float fStartU = 0.0f;
float fEndU = 1.0f;
float fStartV = 0.0f;
float fEndV = 1.0f;
vmvUIVerts.push_back(CreateVertex(fStartX, fStartY, 0, fStartU, fStartV));
vmvUIVerts.push_back(CreateVertex(fEndX, fStartY, 0, fEndU, fStartV));
vmvUIVerts.push_back(CreateVertex(fEndX, fEndY, 0, fEndU, fEndV));
vmvUIVerts.push_back(CreateVertex(fStartX, fStartY, 0, fStartU, fStartV));
vmvUIVerts.push_back(CreateVertex(fEndX, fEndY, 0, fEndU, fEndV));
vmvUIVerts.push_back(CreateVertex(fStartX, fEndY, 0, fStartU, fEndV));

Макет IA: (Обновление)

D3D10_INPUT_ELEMENT_DESC ieDesc[2] = {
    { "POSITION",   0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
    { "TEXCOORD",   0, DXGI_FORMAT_R32G32B32_FLOAT, 0,12, D3D10_INPUT_PER_VERTEX_DATA, 0 }
};

Данные достигают вершинного шейдера в следующем формате: (Обновление)

struct VS_INPUT
{ 
    float3 fPos          :POSITION;
    float3 fTexcoord     :TEXCOORD0;
}

В моем вершинном и пиксельном шейдере не так много происходит для этого конкретного вызова отрисовки, пиксельный шейдер выполняет большую часть работы по выборке из текстуры с использованием указанных UV-координат.Тем не менее, это работает не совсем так, как ожидалось, похоже, я получаю только 1 пиксель выборочной текстуры.

Обходной путь был в пиксельном шейдере, чтобы сделатьследующее: (обновление)

sampler s0                      : register(s0);
Texture2DArray<float4> meshTex  : register(t0);
float4 psMain(in VS_OUTPUT vOut) : SV_TARGET
{
    float4 Color;
    vOut.fTexcoord.z = 0;
    vOut.fTexcoord.x = vOut.fPosObj.x * 0.5f;
    vOut.fTexcoord.y = vOut.fPosObj.y * 0.5f;
    vOut.fTexcoord.x += 0.5f;
    vOut.fTexcoord.y += 0.5f;
    Color = quadTex.Sample(s0, vOut.fTexcoord);
    Color.a = 1.0f;
    return Color;
}

Стоит также отметить, что это работает со следующей структурой VS out, определенной в шейдерах:

struct VS_OUTPUT
{
    float4 fPos          :POSITION0; // SV_POSITION wont work in this case
    float3 fTexcoord    :TEXCOORD0;
}

Теперь у меня есть текстураэто растянуто, чтобы уместиться на весь экран, оба треугольника уже покрывают это, но почему текстура UV не использовалась должным образом?

Чтобы уточнить, я использую точечный сэмплер и пробовал и зажимать и оборачивать УФ.

Мне было немного любопытно, и я нашел решение / обходной путь, упомянутый выше, однако я бы предпочел не делать этого, если кто-нибудь знает, почему это происходит?

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

Хорошо, ну, например, координаты текстуры вне диапазона 0..1 зажаты. Я допустил ошибку, предполагая, что, если обрезать пространство от -1 до +1, координаты текстуры тоже будут. Это не тот случай, они все еще идут от 0,0 до 1,0.

Причина, по которой код в пиксельном шейдере работал, заключалась в том, что он использовал координаты пространства клипа x, y, z для автоматической перезаписи этих координат текстуры; недосмотр с моей стороны. Однако код пиксельного шейдера приводит к растяжению текстуры на полноэкранном «квадре», поэтому он может быть кому-то полезен;)

1 голос
/ 24 февраля 2012

Какую семантику вы указываете для своего типа вершины? Они правильно выровнены с вашими вершинами, а также с вашим шейдером? Если вы используете настройки D3DXVECTOR4, D3DXVECTOR3 (как показано в коде VS), это может быть проблемой, если ваш CreateVertex () возвращает структуру D3DXVECTOR3, D3DXVECTOR2. Было бы обнадеживающе видеть ваш код пиксельного шейдера тоже.

...