태그 보관물: graphics-programming

graphics-programming

데칼 구현 문제가 있었 으므로이 질문이 다른

데칼에 대한 정보를 찾는 데 문제가 있었 으므로이 질문이 다른 사람들에게 도움이 될 것입니다. 구현은 포워드 렌더러를위한 것입니다.

데칼 구현이 올바른지 누군가 확인할 수 있습니까?

  • 공통 공간에서 투영 볼륨을 정의 할 차원의 큐브를 정의합니다. 투영이 영향을받는 삼각형을 받기 위해 정의 된 큐브와 삼각형 교차를 확인하십시오.
  • 이 삼각형을 자르고 저장합니다.
  • 그런 다음 매트릭스 트릭을 사용하여 투영중인 텍스처를 참조하는 저장된 삼각형의 UV 좌표를 계산합니다.
  • 이렇게하려면 공통 공간에서 큐브의 높이, 너비 및 깊이를 나타내는 벡터를 가져 와서 왼쪽 아래 모서리가 원점이되도록합니다.
  • i, j, k 단위 벡터로 행렬에 넣고 큐브의 변환을 설정 한 다음이 행렬을 뒤집습니다.
  • 저장된 삼각형의 정점에이 행렬을 곱하면 UV 좌표로 사용하는 0 대 1 크기 큐브 내부의 좌표를 얻을 수 있습니다.
  • 이 방법으로 투영중인 원래 삼각형이 있고 UV 좌표가 있습니다 (UV 좌표는 투영중인 텍스처를 참조합니다).
  • 그런 다음 저장된 삼각형을 장면에 다시 렌더링하면 영사 이미지로 투영 영역을 덮어 씁니다.

이제 내가 찾을 수 없었던 질문들. 마지막 요점이 맞습니까? 나는 소프트웨어 클리핑을 한 번도 해본 적이 없지만, 제한된 정밀도로 인해 오류가 발생하기 쉬운 것처럼 보이며, 투영 된 텍스처에 대해 z 충돌이 발생할 수 있습니다. UV 좌표를 얻는 방법도 올바른가요?



답변

이 기사를 살펴보십시오.

http://blog.wolfire.com/2009/06/how-to-project-decals/

그는 당신이 사용하는 것과 똑같은 접근법을 사용하고있는 것 같습니다. 그는 z- 파이팅에 대해 이야기하지는 않지만 더 먼 거리에서 문제가 될 수 있습니다.

z-fighting이 매우 잘 보이는 경우 특정 거리 후에 데칼을 비활성화하는 것이 좋습니다.


답변

Z 싸움을 해결하기 위해 한 것은 화면 좌표가 표시된 후 데칼 셰이더에서 정점의 Z 값을 조금만 부딪히는 것이 었습니다.

OK … 나는 적합 메쉬 데칼을 사용합니다. Y를 지형에 놓고 메쉬 nxn을 만듭니다. 지형 폴리곤 메쉬에서 Y를 찾기 위해 코드를 사용합니다. 모든 변환 후, 화면 좌표에서 기존 지오메트리의 상단을 그립니다. 깊이 버퍼는 화면 좌표에 있으므로 데칼 다각형의 Z를 화면쪽으로 약간 이동하면 Z 싸움이 중지됩니다. 이를 통해 피팅 된 데칼 메시를 구성하는 폴리곤의 양을 절반으로 줄였습니다. 이것은 오래된 120 코드입니다

 vec4 v = gl_ModelViewProjectionMatrix * gl_Vertex;
 v.z -= .03;
 gl_Position = v;

이것이 더 잘 설명되기를 바랍니다.

모든 와이어 프레임.

와이어 지형 만.


답변