추상 2D 하향식 물 질감을 애니메이션하는 방법?


24

나는 현재 바다를 위에서 내려다 본 게임을 구현하고 있습니다. 나는 약간의 추상적 인 질감을 사용합니다.여기에 이미지 설명을 입력하십시오

실제 질감은 투명하고 명확성을 위해 녹색과 같은 색상을 추가했습니다.

내가 가진 문제는 물이 멋지게 보이도록이 텍스처에 애니메이션을 적용하는 방법을 모른다는 것입니다. 나는 사인파로 텍스처를 움직이려고했습니다 texture.y += sin(angle). 물론 이제는 전체 질감이 움직이며 비현실적으로 보입니다. 다음으로 시도한 것은 다른 레이어를 추가하고 시차 효과를 구현하는 것입니다. 따라서 수면 아래의 반사도 움직일 수 있지만 훨씬 느립니다. 조금 나아 보이지만 여전히 좋지는 않습니다.

개별 셀이 웹이나 헝겊 조각처럼 확장되고 축소되면 가장 잘 보이는 애니메이션이 될 것이라고 생각합니다. 누군가이 셀의 한 정점을 약간 당기면 인접한 셀이 확장되고 내가 끌어 당기는 셀이 수축한다고 상상해보십시오. 스프링스 웹과 같은 종류 (?). 그러나 나는 이런 식으로 구현하는 방법에 대한 단서가 없다.

  • 이것에 대한 수학 모델은 무엇입니까? 힘이 밀거나 당기는 스프링이있는 것?
  • 그렇다면이 모델을 주어진 텍스처에 어떻게 매핑합니까? 모든 곡선을 유지하고 무엇을하지 ...

(또한 주어진 텍스처에 애니메이션을 적용하는 방법에 대한 다른 아이디어 / 답변에 개방되어 있습니다. 사실주의는 여기서 핵심이 아니며 움직임처럼 멋진 물처럼 보입니다 ...)

DMGregory의 솔루션

이 게시물에 libgdx 예제를 게시했습니다 .2d 워터 애니메이션이 들쭉날쭉하고 부드럽 지 않습니다 (텍스처 필터링에 대한 답변 참조).

답변:


41

이 작업을 수행하는 일반적인 방법은 셰이더에서 간접 텍스처 조회를 사용하여 디스플레이 텍스처를 왜곡하는 것입니다.

물 애니메이션을 보여주는 애니메이션 GIF

여기서는 저주파 색 노이즈가있는 텍스처 (임의의 부드러운 얼룩 모양)를 사용하여 시간이 지남에 따라 디스플레이 지오메트리를 스크롤합니다.

여기에 이미지 설명을 입력하십시오

이 텍스처에서 색상을 그리는 대신 빨강 및 녹색 채널을 빼고 0.5f시간과 공간에 따라 부드럽게 변하는 의사 난수 2D 벡터로 변환합니다.

그런 다음 주요 물 텍스처에서 샘플링하기 전에이 벡터의 작은 배수를 UV 좌표에 추가 할 수 있습니다. 이것은 우리가 읽고 표시하는 텍스처의 일부를 뒤틀어 이동시킵니다.

이 노이즈에서 두 개의 샘플을 평균화하여 반대 방향으로 스크롤하면 이동 방향을 숨길 수있어 마치 객관적인 슬로 싱처럼 보입니다.

Unity에서 셰이더는 다음과 같습니다. 선택한 셰이더 언어로 번역하기에 충분히 간단해야합니다.

fixed4 frag (v2f i) : SV_Target
{               
    float2 waveUV = i.uv * _NoiseScale;
    float2 travel = _NoiseScrollVelocity * _Time.x;

    float2 uv = i.uv;
    uv += _Distortion * (tex2D(_Noise, waveUV + travel).rg - 0.5f);
    waveUV += 0.2f; // Force an offset between the two samples.
    uv += _Distortion * (tex2D(_Noise, waveUV - travel).rg - 0.5f);

    // Sample the main texture from the distorted UV coordinates.
    fixed4 col = tex2D(_MainTex, uv);

    return col;
}

1
이거 정말 멋져요. "노이즈 맵"을 스케일링하기위한 _NoseScale = 스칼라 속성을 모두 이해하지 못했습니다. _NoiseScrollVelocity = Vector2 속도 맵에서 노이즈 맵을 이동합니다. _Noise =?. _Distortion = 스칼라 왜곡 계수로 선택합니까? v2f = 정점 색상을 결정합니다. 나는 =?
morpheus05

_Noise위의 작은 불규칙한 랜덤 텍스처를 읽는 텍스처 샘플러입니다. v2f i는 정점 셰이더에서 보간 된 데이터입니다. 주로이 데이터를 사용하여 그리는 픽셀의 텍스처 좌표를 얻습니다 i.uv. 그리고 나머지는 모두 정확합니다.
DMGregory

셰이더를 구현했으며 어떻게 든 작동하지 않습니다 (이동하지 않거나 왜곡이 커짐). 값을 올바르게 설정하지 않았다고 가정합니다. 시간 = 마지막 프레임과의 차이 (ms) noise_scale = 1 (텍스처 사용, 랩 모드 반복) noise_scroll_velocity = [0.01, 0.01] 왜곡 = 0.02
morpheus05

변수는 DeltaTime이 아니라 Time이라고합니다. 시간의 차이를 사용하고 프레임 속도가 일정하면 항상 같은 수를 얻으며 동일한 입력으로 쉐이더를 다시 실행하여 동일한 출력을 얻습니다 (아무것도 움직이지 않습니다). 더 나쁜 것은, 프레임 속도가 일치하지 않으면 진동을받을 수 있습니다. 델타 시간이 아닌 총 시간이 경과하기를 원합니다.
DMGregory

나는 곧 그것을 보내서 깨달았고 이제는 거의 작동합니다. 애니메이션은 오른쪽 하단에서 파도를 생성하는 것처럼 보이며 10 초 정도 지나면 멈추는 파도처럼 사라집니다. 그 이유는 무엇입니까?
morpheus05

6

이것을 가성 효과라고하며 런타임에 이러한 효과를 생성하는 데는 시간이 많이 걸리므로 일반적으로 사전 렌더링 된 프레임 별 애니메이션으로 수행됩니다. 비상업적 용도의 무료 버전이있는 Caustics Generator 와 같이 가성 애니메이션 프레임을 생성하는 도구가 있습니다. 내가 언급 한 도구의 프로 버전보다 훨씬 저렴하게 구입할 수있는 사전 제작품도 있습니다.

가성 효과는 일반적으로 수중 지형 또는 수중 표면에 가벼운 쿠키로 적용되는 효과입니다. 즉, 물을 내려다 보면서 물 표면에 올려 놓는 것은 일반적으로 물의 모양이 아닙니다.


매우 흥미 롭습니다.이 생성기를 살펴볼 것입니다. (이벤트를 이해하면 셰이더 변형을 시도 할 것입니다 ...)
morpheus05

4

보로 노이 그래프에서 생성 할 수있는 텍스처처럼 보입니다. 예 :

여기에 이미지 설명을 입력하십시오

포인트를 움직여 그래프를 작고 부드럽게 조정할 수 있습니다. 각 프레임마다 그래프를 다시 그리면 비용이 많이 들기 때문에 애니메이션을 미리 렌더링하고 싶을 것입니다.


4
실제로 과거에는 셰이더에서 가성을 렌더링했습니다. 뾰족한 다각형이 아닌 가장자리에서 올바른 부드러운 모양을 얻는 것이 어려울 수 있지만 생각하는 것만 큼 비싸지는 않지만 ( WebGL 쉐이더에서 실시간으로 Voronoi 가장자리를 렌더링하는 예제입니다 ).
DMGregory

Ooo, 그것은 매우 멋지다; 매우 유용한 지형 생성기가 있습니다.
FacticiusVir

0

바닥 텍스처 레이어와 2 개의 반투명 텍스처를 포함하는 올드 스쿨 방법이 있습니다.

모든 방향으로 가고 물이 복제 된 파도 나 샘 같은 푸른 수프-흐름 맵으로 가득 차지 않게하려면 목표를 달성해야합니다.

https://steamcdn-a.akamaihd.net/apps/valve/2010/siggraph2010_vlachos_waterflow.pdf


3
링크가 도움이 될 수는 있지만 좋은 답변은 없습니다. 이 두 가지 방법을 모두 확장 할 수 있습니까? 어떻게 구현하면 좋을까요?
Vaillancourt

첫 번째 방법은 기본적으로 물에 애니메이션을 적용하는 데 사용되는 매우 오래된 방법입니다. UVW 좌표가 원하는 방향으로 이동하는 기본 레이어 워터 텍스처를 가져옵니다. 이제 다른 방향으로 이동하는 노멀 맵 / 범프 맵을 추가로 적용하십시오. 잘 수행하면 작은 강이 설득력이 있습니다. 파도를 닮은 것은 무아레 효과를 얻을 수 있기 때문에 큰 물이 있지만 매우 제한적입니다. 링크는 내가 할 수있는 것보다 훨씬 나은 플로우 맵 사용을 설명합니다.
Pica

여기에 추가 한 내용으로 질문을 개선하려면 편집 기능을 사용하십시오. 사람들은 의견이 아닌 게시물에서 답변을 찾는 데 사용됩니다.
Vaillancourt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.