2013-06-03 3 views
2

Я хочу повторить небольшую текстуру 2x2 пикселей на большом квадрате, например, 50x50 пикселей.Повторение текстуры

Набор вершин -

float X = 100, Y = 100, Width = 50, Height = 50; 
float TextureLeft = 0, TextureTop = 0, TextureRight = 25, TextureBottom = 25; 

Vertices[0].x = X; 
Vertices[0].y = Y + Height; 
Vertices[0].z = 0; 
Vertices[0].rhw = 1; 
Vertices[0].tu = TextureLeft; 
Vertices[0].tv = TextureBottom; 

Vertices[1].x = X; 
Vertices[1].y = Y; 
Vertices[1].z = 0; 
Vertices[1].rhw = 1; 
Vertices[1].tu = TextureLeft; 
Vertices[1].tv = TextureTop; 

Vertices[2].x = X + Width; 
Vertices[2].y = Y; 
Vertices[2].z = 0; 
Vertices[2].rhw = 1; 
Vertices[2].tu = TextureRight; 
Vertices[2].tv = TextureTop; 

Vertices[3].x = X; 
Vertices[3].y = Y + Height; 
Vertices[3].z = 0; 
Vertices[3].rhw = 1; 
Vertices[3].tu = TextureLeft; 
Vertices[3].tv = TextureBottom; 

Vertices[4].x = X + Width; 
Vertices[4].y = Y; 
Vertices[4].z = 0; 
Vertices[4].rhw = 1; 
Vertices[4].tu = TextureRight; 
Vertices[4].tv = TextureTop; 

Vertices[5].x = X + Width; 
Vertices[5].y = Y + Height; 
Vertices[5].z = 0; 
Vertices[5].rhw = 1; 
Vertices[5].tu = TextureRight; 
Vertices[5].tv = TextureBottom; 

Draw -

DrawPrimitive(D3DPT_TRIANGLELIST, 0, 6); 

Проблема «глюк» в крае между треугольниками, вероятно, из-за неправильных вершин координат, а также «глюк» на четырехъядерных границ.

Оригинальная текстура - http://i.imgur.com/tNqYePs.png

Результат - http://i.imgur.com/sgUZvqE.png

+0

Вы не указали состояние растеризатора, которое вы используете. Возможно, вам не хватает настроек текстурного зажима/повтора. Что еще вы вызываете перед DrawPrimitive для настройки текстуры? –

+0

Не могли бы вы сказать, какие настройки растеризатора/зажима/повтора должны быть установлены? Я рисую пустую сцену с одним квадратом текстуры. – Demion

+0

Параметр «повтор» называется «обертка» в DX. Я добавил ответ со ссылкой на MSDN, если у вас есть вопросы о значениях. –

ответ

1

Перед вызовом DrawPrimitive необходимо настроить текстуру упаковки, как в этом article.

// For the textures other than the first one use "D3DVERTEXTEXTURESAMPLER0+index" 
YourDevice->SetSamplerState(D3DVERTEXTEXTURESAMPLER0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP); 
YourDevice->SetSamplerState(D3DVERTEXTEXTURESAMPLER0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP); 

Чтобы устранить сбой по диагонали, вы можете использовать одиночный Quad вместо двух треугольников.

Проблема на краях считается here. Вы должны добавить небольшое смещение к каждой координате текстуры. «Малый» означает нормализованную половину пикселя. Если ваше разрешение текстуры равно 512x512, добавьте (0.5/512.0) в каждый из u/v-коордов.

+0

Спасибо вам за ответ, но это ничего не изменило. Все еще «сбой» на границах и в краю между треугольниками. – Demion

+0

Я добавил немного об этой проблеме, надеюсь, что это поможет. Сначала попробуйте добавить смещение. –

1

Если вы рисуете 2d, вы должны добавить координаты 0.5px в U и V при текстурировании. Это даст вам точную точность пикселя/текселя. В противном случае вы потеряете 0.5 пикселя каждый раз, и текстура будет выглядеть размытой.

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