2013-05-09 5 views
1

В DirectX я работал с текстурированной каре, используя следующую структуру:C++ DirectX - текстурирования 2D-сетки

struct TLVERTEX 
{ 
    float x; 
    float y; 
    float z; 
    D3DCOLOR colour; 
    float u; 
    float v; 
}; 

Однако я хочу, чтобы сделать более сложной 2D сетки и текстуры те, но я понятия не имею, как я должен выровнять текстуру на нем. В текстурированном квадрате свойства u и v структуры определяют ориентацию текстуры.

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

Еще одна вещь, которую я хотел бы сделать, это сказать, что у меня есть 2D-сетка с текстурой, наложенной на нее без растягивания текстуры и т. Д. Я бы просто хотел выровнять ее, так что если текстура не соответствовать форме сетки, биты будут отсутствовать и т. д.

Я пробовал Google, но могу только найти вещи, относящиеся к 3D-графике. Пока я понимаю, что я технически работаю в 3D-пространстве, в конечном итоге я пытаюсь создать 2D-графику. Я был бы признателен за ответы от чего-либо из предложений, где можно посмотреть/начать работу по достижению этого, чтобы, если возможно, заполнить примеры.

+0

Ваш вопрос немного расплывчато. Если у вас есть вершина, вы можете иметь столько вершин/треугольников в сетке, сколько хотите. Обычно экспортер model/map/object будет перечислять, где uv находятся в формате файла, который вы читаете. –

+0

Да, но у меня есть текстурированный квадрат с четырьмя вершинами. Проблема состоит более чем из четырех. Свойства u и v определяют ориентацию текстуры на квадроцикле, но как я могу достичь этого, когда имеется более 4 вершин? Или вы говорите, что свойства u и v могут применяться к вещам, отличным от текстурированных квадрациклов? Если да, то как я могу использовать их в этом сценарии? – Interminable

ответ

1

Вы должны действительно прочитать о том, как работают текстурные координаты.

Рассмотрим следующую сетку. Мы хотим применить неискаженную текстуру (пунктирная прямоугольник):

Sample

Затем указав координаты текстуры для каждой вершины довольно прост:

u = (x - minX)/(maxX - minX) 
v = (y - minY)/(maxY - minY) 

Если вы хотите, чтобы повернуть текстуру, вы должны проектировать вершины на соответствующие оси.

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

Choose an arbitrary point in the polygon -> o 
For each vertex v 
    Shoot a ray from o through v 
    Find the intersection of this ray with minX/maxX/minY/maxY 
    Calculate the texture coordinates at the intersection points as above 
Next 

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

Вот алгоритм для вогнутых многоугольников. Он должен давать согласованные координаты. Однако я не знаю, как будет выглядеть результат. Этот алгоритм также может пропускать углы. Можно включить проверки для применения координат углов к конкретным вершинам (например, при изменении стороны):

Calculate the polygon's perimeter -> p 
//The texture coodinate space has a perimeter of 4 
currentPos := 0 
for each vertex 
    if(4 * currentPos < 1) 
     uv = (4 * currentPos/p, 0) // top edge 
    else if(4 * currentPos < 2) 
     uv = (1, 4 * currentPos/p - 1); //right edge 
    else if(4 * currentPos < 3) 
     uv = (1 - 4 * currentPos/p - 2, 1); //bottomedge 
    else 
     uv = (0, 1 - 4 * currentPos/p - 3); //leftedge 
    currentPos += distance to next vertex 
next 
+0

Это интересно и полезно, спасибо!Я занимался поиском, чтобы попытаться найти хороший материал для чтения, но без особого успеха. Есть ли у вас какие-либо предложения? Также как вы занимаетесь вогнутой проблемой? Вам нужно разбить его на основе некоторой проверки на вогнутые вершины, чтобы вы получили кучу выпуклых фигур? Или я думаю об этом неправильно? – Interminable

+0

MSDN (http://msdn.microsoft.com/en-us/library/windows/desktop/bb206245(v=vs.85).aspx) - хорошее начало. Для обработки вогнутых многоугольников необходим другой подход. Я добавил для этого образец алгоритма. –

+0

Отмечая это как ответ, как вы, кажется, поставили меня на правильный путь. Благодаря! – Interminable

Смежные вопросы