2013-03-19 2 views
1

Я занимаюсь рисованием бильярдных шаров в XNA/D3D (DX11). Я написал шейдер Blinn-Phone, который использует SamplerState в HLSL для сопоставления моих бильярдных текстур с сферическим FBX, который я сгенерировал в VisualStudio2012.Сфера показывает многоугольники при визуализации с текстурой

Есть две проблемы, которые у меня есть, как наиболее заметные на самом правом шаре на рисунке ниже.

1) Вы можете видеть, что текстура показывает, где лежат основные полигоны сферы.
2) На нижнем краю третьей линии, где чуть ниже белой видимости ниже полосы, она выглядит очень сглаженной или неровной.

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

Итак, как я мог улучшить это? Создать новую сферу с большим количеством полигонов?

Я сделал следующее за сглаживание, но, честно говоря, казалось, сделать очень мало, если что-нибудь:

 graphics.PreferMultiSampling = true; 
     graphics.ApplyChanges(); 
     GraphicsDevice.PresentationParameters.MultiSampleCount = 4; 

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

sampler2D ColorSampler = sampler_state { 
    Texture = <ColorTexture>; 
    FILTER = MIN_MAG_MIP_LINEAR; 
    AddressU = Wrap; 
    AddressV = Wrap; 
}; 

Billiard Balls Rendered

ответ

1

в дополнение ответ Рахул, есть третий, более активное участие вариант (хотя я бы, безусловно, выбор в пользу простого увеличения числа полигонов): вы упомянули, что вы используете затенение - и я буду Предположим, вы говорите о пиксельном шейдере. Проблема возникает из-за того, что координаты текстуры линейно интерполируются внутри треугольников в пиксельном шейдере: но так как вы знаю, что вы имеете дело с сферами, становится возможным вручную вычислить UV-координаты на пиксель в пиксельном шейдере (используйте стандартную формулу acos (z) и atan (y/x) с помощью (x, y, z) точка, являющаяся текущей точкой, растрированной в координате объекта).

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

EDIT: хотя у меня нет сниппет под рукой, вот псевдо-код:

Vertex шейдер:
- взять начальные координаты текущей вершины (без какой-либо матрицы преобразования; I Предположим, что ваши сферические вершины центрированы вокруг начала координат) и передают их непосредственно в пиксельный шейдер как varying vec3 P.

Пиксельный шейдер:
- r = sqrt(P.x*P.x + P.y*P.y + P.z*P.z)
- theta = acos(P.z/r)
- phi = atan2(P.y/r, P.x/r)
- u = theta*2/pi ; v = phi/(2*pi)+0.5
- использовать (и, v) выше, чтобы попробовать текстуру в tex2D()

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

+0

Если у вас есть образец фрагмента, который выполняет эту ручную интерполяцию, было бы удобно иметь в этой теме. – Dave

+0

нет фрагмента под рукой, но я обновил ответ с псевдокодом. Это также зависит от того, как была создана ваша текстура (координаты uv должны совпадать: если вы использовали проекцию меркатора для генерации текстуры, тогда вы должны использовать проекцию меркатора вместо формулы выше!). – WhitAngl

1

У вас есть несколько вариантов:

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

  2. Отфильтруйте свои текстуры, чтобы иметь менее резкий переход от синего -> белый (примените размытие по Гауссу, а затем используйте размытое изображение в качестве текстуры).

0

В случае, если это помогает другим: для решения этого я использовал 3DSMax вместо встроенного модельного конструктора VS2012. Я установил шкалу в 2 "для сферы и увеличил количество сегментов до 64. При экспорте в FBX я включил« Turbo Smooth », не зная, что это такое.

В итоге получается намного лучше:

enter image description here

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