3D 모델에 페인트하는 방법
나는이 주제를 아주 오랫동안 검색했고 기본적으로 그것에 대한 정보를 찾지 못했습니다.
UV 레이아웃이있는 3D 모델이있는 경우. 브러시로 해당 모델의 3D 페인팅을위한 기본 기술은 무엇입니까? 브러시 스트로크는 연속적으로 배치 된 브러시 픽셀 데이터 / 이미지로 구성됩니다. 그렇다면 각각의 브러시 이미지를 물체의 표면에 투영합니까? (실제로는이 작업을 수행하기 위해 대신 이미지 공간에 개체를 투영합니다.) 이전에 텍스처를 개체에 투영했습니다. 그리고 각각의 브러시 이미지를 투영하는 것은 확실히 가능해 보이지만 성능 측면에서 실용적인지, 더 나은 기술이 있는지는 확실하지 않습니다.
답변
여기서 "더 나은"접근 방식을 제공 할 수는 없지만
개체의 표면에 각각의 개별 브러시 이미지를 투영
GPU를 사용하여 구현하면 실제로 성능 문제가 아닙니다. 특히 컴퓨터 게임에 비해 많이 진행되지 않는 편집기 환경에서. 기본적으로 원하는 것은 프레임 당 단일 이미지를 제한된 텍스처 세트에 렌더링하는 것입니다. 이 기능이 필요한 경우 주제에 접근하는 방법에 대한 초안을 제공 할 수 있습니다. 그러나 아직 직접 구현하지 않았기 때문에 생각하지 못한 복잡한 문제와 문제가있을 수 있으므로 예상대로 작동하지 않는 경우 댓글에 알려주세요.
영향을받는 표면 찾기
- 브러시 텍스처의 모서리를 사용하고 감소 된 브러시 투영 절두체를 생성합니다.
- 모든 오브젝트를 검사하고 가장 가까운 표면을 찾습니다.-> 이미 씬에 어떤 종류의 컬링을 사용하고 있다면 이미 컬링 된 오브젝트 목록을 재사용하십시오. 브러시는 카메라가 보는 것만 "볼"수 있기 때문입니다.
- 브러시의 영향을받는 하위 표면 / 삼각형 식별
영향을받는 모든 텍스처를 수집합니다. 영향을받는 각 표면에 대해 어떤 텍스처가 있는지 알아야합니다. 최적으로 전체 개체에는 단일 UV 텍스처 만 있습니다.
텍스처에 렌더링 할 셰이더 프로그램을 만듭니다.
- 조심하세요. 정점 셰이더는 정규화 된 UV 좌표를 계산하고이를 정점 위치로 파이프 라인 아래로 전달해야합니다. 파이프 라인을 전달하는 데 필요한 추가 정보를 확인하십시오.
- 조각 셰이더에서 브러시 아래에있는 각 픽셀을 덮어 씁니다. 직사각형이 아닌 브러시의 경우 여기에서 블렌딩을 사용해야 할 수도 있습니다.
- 브러시 위치는 약간 까다 롭습니다. 조각 셰이더의 텍스처 UV 공간에 필요하며 정점 셰이더에서 계산할 수 있는지 확실하지 않습니다. 따라서 조각 셰이더 또는 지오메트리 셰이더에서이를 수행해야 할 수도 있습니다. 내가 보는 문제는 브러시 투영이 표면에 닿는 각도를 정점 셰이더에서 계산할 수 없으며 덮힌 영역을 결정해야한다는 것입니다. 지오메트리 셰이더에는 각도와 덮힌 영역을 계산하기에 충분한 정보가 있습니다. 프래그먼트 셰이더에서도 각도를 계산할 수 없지만 브러시 프로젝션 절두체의 위치와 위치를 간단히 확인할 수 있습니다.
이제 텍스처로 렌더링하기 만하면됩니다.
- 브러시 텍스처 바인딩
- 영향을받는 각 텍스처에 대해
- 텍스처를 렌더링 대상으로 바인딩
- 영향을받는 모든 개체를 렌더링하고 GPU가 덮어 써야하는 픽셀을 정렬하도록합니다.
(선택 사항) 수정 사항을 저장하려면 GPU에서 텍스처를 다시 읽어서 저장해야합니다.
주요 작업은 GPU에 의해 수행되기 때문에 상당히 빠릅니다. 그러나 브러시가 부분적으로 겹치는 여러 개체 / 텍스처를 칠 때 설명 된 접근 방식에서 몇 가지 문제를 볼 수 있습니다. 브러시의 픽셀을 분류하면 어떤 텍스처 / 오브젝트가 지저분해질 수 있습니다. 적용 할 수있는 스텐실 / 깊이 버퍼 트릭이있을 수 있지만 이것이 다른 질문에 대한 주제라고 생각합니다.
텍스처의 픽셀이 두 번 사용되지 않는 한 지오메트리를 렌더링하고 UV 좌표 (텍스처 좌표)를 표시 할 수 있습니다. 일반적으로 빨간색과 녹색 (2d)의 조합입니다. 브러시를 사용할 때, 당신은 당신이 치는 uv 좌표를 읽고 원하는 색상의 위치 (uv)에서 텍스처를 색칠하기 만하면됩니다.
힌트 : 두 번째 텍스처에 페인트하면 원래 텍스처 색상이 손상되지 않습니다.
단점 : 때때로 지오메트리 내에서 다른 삼각형의 텍스처 해상도가 다양합니다. 따라서 어떤 얼굴에서는 멋지게 보이고 다른 얼굴에서는 픽셀 화됩니다.
앞서 말했듯이 메시 (지오메트리)가 텍스처의 동일한 부분을 두 번 사용하고 (동일한 텍스처 좌표를 목표로하는 두 개의면) 그중 하나에 그리면 다른 하나도 칠해집니다.
다른 방법으로 할 수 있습니다.
하지만 저에게 가장 논리적 인 방법은 경로를 따라 샘플링 된 점이 있고, 스플라인 / 벤지에 곡선을 사용하여 매끄럽게 만들고 (추가 점을 보간 할 수 있음) 이후에 텍스처에 투영되고 저장된다는 것입니다. 따라서 "모든"포인트를 샘플링 할 필요가 없습니다.