Войти
ПрограммированиеФорумГрафика

[D3D9] Проблема с Vertex Shader Texture

Страницы: 1 2 Следующая »
#0
10:16, 10 апр. 2018

Добрый день!

Есть у меня такая статейка
https://gamedev.ru/pages/totem4_engine/articles/totem4_article6

Реализовывал воду в одном проекте. Сейчас перенес эту технику в другой проект и столкнулся с проблемой швов, которая раньше не проявлялась.
not_fit | [D3D9] Проблема с Vertex Shader Texture

Суть в том, что я использую текстуру в вершинном шейдере для волнения

  
sampler DisplacementSampler = sampler_state 
{
    texture = <g_TextureDisplacement>;
  
  AddressU = WRAP;
  AddressV = WRAP;
  MIPFILTER = NONE;
  MINFILTER = POINT;
  MAGFILTER = POINT;
};

  // world space init vertex position
  float3 f3BeginWorldPos  = mul( float4(IN.position.x, 0.0f, IN.position.y, 1.0f ), g_MatrixWorld );
  // copy
  float3 f3Position     = f3BeginWorldPos;
    
  // texture coord
  OUT.TexCoord  = float2( f3BeginWorldPos.x / g_WaterScale.w, f3BeginWorldPos.z / g_WaterScale.w );
  
  float4 HeightChoppyMap = float4(0.0f, 0.0f, 0.0f, 0.0f);
  
//  float fTexel = 1.0f / 256;
//  int2 texInt = OUT.TexCoord / fTexel;
//  float2 texCoordDisp = texInt * fTexel + 0.5f * fTexel;
    
  // map for fetch
  HeightChoppyMap = tex2Dlod( DisplacementSampler, float4( OUT.TexCoord, 0.0f, 0.0f ) );
//  HeightChoppyMap = tex2Dlod( DisplacementSampler, float4( texCoordDisp, 0.0f, 0.0f ) );
    
  // vertex displacement
    
  // choppy
  f3Position.x  += ( HeightChoppyMap.y - 0.5f ) * g_WaterScale.z;
  f3Position.z  += ( HeightChoppyMap.z - 0.5f ) * g_WaterScale.z;
  // height
  f3Position.y  = HeightChoppyMap.x * g_WaterScale.x + g_WaterScale.y;
И части сетки разной детализации (с подгонкой друг к другу) как в статье описано.

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

В старом проекте нет проблем со швами, в новом - есть, и я не пойму почему, есть какие идеи?


#1
17:25, 10 апр. 2018

Osiris
> иногда и посредине геометрии
Это постоянный шов, или так, мелькнёт-исчезнет?
Настройки фильтрации для D3DVERTEXTEXTURESAMPLER точно совпадают со старым проектом?
Режимы D3DSAMP_ADDRESSU и D3DSAMP_ADDRESSV так же имеет смысл проверить.

#2
17:29, 10 апр. 2018

Mikle
> Это постоянный шов, или так, мелькнёт-исчезнет?

Нет, он мелькает, в некоторым местах сходится-расходится, и куда заметнее она на переходам между патчами. Фильтрацию поставил точечную, как в старом проекте, проверял, UV - Wrap как и положено, вообще идей нет. При чем он появлется даже на дальних кусках, где прямо патчи по 4 квада в рядочек и только когда волнение включено.

Может какой хак придумать можно.

Перепроверю еще раз вечером.

#3
18:00, 10 апр. 2018

Юзай camera aligned plane, самый лучший результат по плотности/равномерности/стабильности для море-океана

#4
18:44, 10 апр. 2018

Battle Angel Alita
> Юзай camera aligned plane, самый лучший результат по
> плотности/равномерности/стабильности для море-океана

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

Mikle
Проверил фильтрацию, установлена.

#5
19:55, 10 апр. 2018

Osiris
> Проверил фильтрацию, установлена.
У тебя:

 MIPFILTER = NONE;
То есть на границе ЛОДов обязан быть шов.
#6
21:07, 10 апр. 2018

Mikle
Да ты прав, но у меня там изначально был POINT, но суть проблемы оказывается не в fetch даже, они связаны, взял вывел все красное - нет мерцаний, значит в пексельном где-то проблема, сейчас буду отключать фичи, чтобы проверить

#7
11:39, 11 апр. 2018

А вот нет, это сетка, промучался весь вечер, потом вместо красного вывел белый, и вес равно артефакты. Плохо что их PIX не ловит.

#8
10:15, 13 апр. 2018

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

#9
11:35, 13 апр. 2018

Osiris
> Если что, проблему я такие не решил, на границах патчей я сделал геометрию
> пошире - там не заметно, а так же добавил спад в волнении на дистанции, чтобы
> вдали море не волновалось, тогда пробелы швово вдали не видны, иногда
> проскакивают только на ближних патчах не на границе, но это я не знаю как
> бороть, пока оставил как есть.
почти правильно всё делаешь. ну, только немного наоборот. если баг проявляется при волнении, то надо для отладки делать волнение в 100 раз сильнее, чтобы баг был в 100 раз заметнее и уже тогда исправлять. а то в одном пикселе копаться, ясное дело, неудобно. ну и, разумеется, смотреть на готовый неправильный результат — это как гадать на кофейной гуще. надо учиться локализовать проблему: вместо цвета выводить например, vec4(fract(dist * 100.0f)), или нормали и смотреть, от чего именно швы — от шейдера или от геометрии. а если всё в кучу намесить, то, ясное дело, проблему не решить.

выводи wireframe режим, для отладки меняй лоды как попало прямо перед камерой, убирай всё, что не вносит вклад в артефакт, который ты пытаешься устранить. отладка графики — это соверешенно отдельный скилл, который нужно тренировать, и pix здесь — вовсе не необходимый инструмент, и без него прекрасно можно обходиться.

#10
12:08, 13 апр. 2018

Suslik
> для отладки делать волнение в 100 раз сильнее, чтобы баг был в 100 раз заметнее
И ещё можно сильно замедлить анимацию.

#11
16:19, 13 апр. 2018

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

Mikle
Тоже хорошая идея!

#12
16:19, 13 апр. 2018

Suslik
> выводи wireframe режим
Он косячит на D3D9 когда читаю из текстуры и применяю на вершину.

#13
16:44, 13 апр. 2018

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

#14
19:53, 25 апр. 2018

А вот еще интересная проблема, чтобы темы не плодить:
случай один -
1_uv | [D3D9] Проблема с Vertex Shader Texture

тот же шейдер, только в другой программе, та же текстура
2_uv | [D3D9] Проблема с Vertex Shader Texture

По тем же координатам выдает другое значение, я проверил фильтрацию - одинаковая, текстура та же, координаты текстурные одинаковые - результат разный, может туплю, но такое как вообще может быть?

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.