2012-02-23 3 views
5

Okay Сначала я использую:DirectX клип пространство координаты текстуры

  • DirectX 10
  • C++

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

В объявлении вершин DirectX я передаю 3-компонентный поплавок (Pos x, y, z) и 2-компонентный float (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)); 

Layout IA: (Update)

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 } 
}; 

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

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

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

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

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 из структура определена в шейдерах:

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

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

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

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

ответ

1

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

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

1

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

+0

Обновленный вопрос, не совсем понимаю, насколько он уместен, это не так, как будто я не был работая в этой среде в течение длительного времени. – Jay

+0

CreateVertex ничего не делает, возвращает то, что я хочу. Единственное, что может отличаться, это то, что texcoord Z не используется, и в дальнейшем ему понадобилось использовать массивы текстур. – Jay

+0

Выравнивание правильное, шаг - правильное значение 24 байта (не очень кратное 16 байт, но оно должно по-прежнему работать как dx auto pads this) – Jay