This document is about: FUSION 2
SWITCH TO

텍스쳐 그리기

Fusion 산업 프로토타이핑 애드온

이 애드온은 텍스처 수정을 동기화하는 솔루션을 제공합니다.

텍스처 그리기 샘플

개요

이 애드온의 로직은 그리기 포인트(위치, 색상, ... DrawinPoint) 세부 정보를 사용자 간에 공유하는 것입니다.

텍스처 그리기 개요

상태 권한

로직은 펜과 도면 표면 사이에 분할되며, 둘 다 네트워크 동작을 가지며, 펜과 대상 도면 사이에 잠재적으로 다른 상태 권한을 갖습니다:

  • 펜 상태 권한은 펜을 쥐고 있습니다
  • 여러 사용자가 동시에 표면에 그림을 그릴 수 있으므로 도면 표면 상태 권한이 도면 사용자가 아닐 수 있습니다.

그리기 단계

펜으로 새 그리기 부분을 추가하는 경우 먼저:

  1. 펜은 도면 표면에 추가해야 하는 도면 점을 감지하고(TexturePen 참고) 정보를 준비합니다(좌표, ...).
  2. 펜은 텍스처에 임시 선을 그어 즉시 표시합니다(네트워크 통신이 발생하면 도면 표면이 실제로 다시 그립니다)
  3. 펜에 그릴 최신 포인트는 펜의 네트워크 연결된 링 버퍼에 저장됩니다(TextureDrawer 참조). 그러면 모든 사용자가 그림에 포인트를 추가하려는 의지를 알 수 있습니다

그런 다음 상태 권한을 가진 클라이언트의 도면 표면:

  1. 펜에 새로운 점이 있다는 것을 감지합니다,
  2. 이 새 도면점을 최신 추가된 점의 링 버퍼에 저장합니다(같은 사용자가 펜과 도면을 모두 소유할 경우 펜 링 버퍼는 생략됩니다). TextureDrawing 참조

마지막으로 도면 표면의 새 최신 점을 보는 모든 클라이언트가 실제 질감으로 그립니다(TextureSurface 참조).

늦은 참가자

늦게 참여한 가입자의 경우 이 애드온의 도면 표면 컴포넌트는 Fusion 2 스트리밍 API를 사용하여 처음부터 추가된 전체 포인트 목록을 보냅니다.

텍스처 그리기

애드온은 텍스처를 편집하는 두 가지 방식을 제공합니다:

  • 기본 솔루션은 셰이더 그래프로 만들어진 특정 드로잉 셰이더를 사용하므로 URP 및 HDRP 렌더 파이프라인과만 호환됩니다. 이 솔루션은 고해상도 텍스처에 더 적합합니다.
  • 대체 솔루션은 비트맵 그리기 API를 제공하는 ProtoTurtle.BitmapDrawing 타사 솔루션을 사용하여 텍스처를 편집합니다.

공유-기반 그리기

LinePainter 셰이더는 텍스처에 선을 그릴 수 있습니다. 점에서 그어진 선까지의 거리를 결정하는 하위 그래프 LineSDK가 포함되어 있습니다.

그리는 로직은 다음과 같습니다:

  • 도면 표면 머티리얼에 렌더 텍스처 사용
  • 선을 그릴 필요가 있을 때마다 Graphics.Blit를 사용하여 셰이더에 현재 렌더링 텍스처와 선 세부 정보를 제공하고 결과를 저장합니다
텍스처 그리기 셰이더 로직

클래스 세부내용=

TexturePen

TexturePen은 펜(BlockableTip 컴포넌트)에 위치하며, TextureDrawing 컴포넌트가 있는 BlockingSurface 컴포넌트와의 접촉을 감지합니다.
접촉이 탐지되면 로컬로 그려지는 점 목록이 업데이트됩니다. 그런 다음 각 점에 대해 TextureDrawerAddDrawingPoint() 메소드를 FixedUpdateNetwork()에서 호출합니다.

TextureDrawer

DataSyncHelpers 애드온RingBufferSyncBehaviour 클래스의 하위 클래스입니다.

펜과 드로잉 표면 사이의 접촉이 감지되었을 때 텍스처에 편집해야 하는 드로잉 포인트를 기록하는 데 사용됩니다.
이를 위해 TexturePenAddDrawingPoint() 메소드를 사용하여 텍스처 표면에 배치해야 할 점 목록에 DrawingPoint를 추가합니다.

동일한 사용자가 TexturePen과 대상의 TextureDrawing을 소유하고 있는 경우, TextureSurface를 직접 편집하고 TextureDrawing의 무손실 링 버퍼에 엔트리를 추가하여 OnNewEntries의 콜백으로 원격 플레이어에게 알려줍니다.
그렇지 않으면 로컬 플레이어의 TextureDrawing에서 로컬로 임시 그리기를 수행하고 TextureDrawer 링 버퍼에 새로운 항목을 추가합니다.
그러면 모든 플레이어는 TextureDrawer 링 버퍼에 새로운 데이터를 받게 되고, TextureDrawing에 대한 상태 권한을 가진 원격 플레이어는 TextureDrawing 무손실 링 버퍼에 새로운 DrawingPoint를 추가하게 됩니다.

TextureDrawing

DataSyncHelpers 애드온RingBufferLosslessSyncBehaviour 클래스의 하위 클래스입니다.
이 링 버퍼에는 TextureDrawer 컴포넌트가 추가된 이 그리기를 대상으로 하는 모든 DrawingPoint가 포함되어 있습니다.
TextureDrawer에 의해 링 버퍼에 새로운 엔트리가 추가되면 모든 플레이어에게 OnNewEntries()가 호출되고 Draw() 메서드는 TextureSurface를 업데이트하여 포인트를 추가하거나 선을 그립니다.

이 링 버퍼의 "손실이 적은" 특징 덕분에, 늦은 가입자들은 방에 들어갈 때 TextureSurface에 그려야 하는 모든 포인트를 받게 됩니다.

TextureSurface

TextureSurfaceRenderer의 컴포넌트를 의미하며 텍스처 초기화, 텍스처 색상 변경, 점 그리기, 선 그리기 등 텍스처 편집을 위한 유틸리티 방법을 담고 있습니다.
따라서 이 클래스는 네트워크 부분과 연결되지 않습니다.

(DataSyncHelpers 의 애드온에서) IRenderTextureProvider 인터페이스를 구현합니다. 외부에서 텍스처를 편집한 경우 onRedrawRequired 이벤트가 발생하고 이 이벤트가 발생하면 TextureDrawing에 구독하여 포인트를 모두 다시 그립니다.

DrawingPoint

이 클래스는 표면의 드로잉 점(위치, 색상, 압력 및 참조 Id)을 정의합니다. 이 referenceId는 대상 TextureDrawing 또는 소스 TextureDrawer를 저장하는 데 사용됩니다.
DataSyncHelpers 애드온의 RingBuffer.IRingBufferEntry 인터페이스를 구현합니다.

의존성

  • DataSyncHelpers 애드온
  • BlockingContact 애드온

데모

데모 씬은 Assets\Photon\FusionAddons\TextureDrawing\Demo\Scenes\ 폴더에 있습니다.

다운로드

이 애드온의 최신 버전은 애드온 프로젝트에 포함되어 있습니다.

지원하는 토폴로지

  • 공유 모드

타사 솔루션

  • ProtoTurtle.BitmapDrawing, MIT 라이선스, https://github.com/ProtoTurtle/UnityBitmapDrawing

변경 내용

  • 버전 2.0.0: 최초 릴리즈
Back to top