일부 스프라이트 기반 게임을하고 있습니다. Z-주문 스프라이트를 들어 대안이
1) 올바른 순서로 그려 기본적으로 - 일괄 처리에 대한 골칫거리가 될 수
2) 직교 투영과 깊이 테스트를 사용 - 반투명과 번잡 할 수 있습니다 내가 2를 선호하고
) 그러나 I 3D 애니메이션을 쉽게 구현할 수 있도록 투시 투영을하고 싶습니다. 카드를 3d 등으로 뒤집어 쓴다. 그렇게하면 객체가 카메라와 다른 거리에 있기 때문에 z 버퍼의 차이로 인해 스프라이트의 크기가 조정될 수있다.
투영을 취소하기 위해 거리에 따라 스프라이트 크기를 조정하는 방법에 대해 생각했습니다. 그러나 그때 나는 "평평하지 않은"2 차원 장면 위에 3D 애니메이션 객체에 간섭을 줄 것입니다.
정식 2D 장면으로 이동하고 두 번째 단계에서 드문 3D 애니메이션을 "복제 된"개체와 함께 사용하는 것이 정상적인 방법이라고 생각합니다. 그러나 누군가 다른 생각을 가지고 있을까요?
투시 투영 및 왜곡없는 z 버퍼를 사용하는 OpenGL 스프라이트 장면. 가능한?
mikkokoos 해결책을 주도 대답합니다. 추가 깊이 값을 통해 버텍스 쉐이더는 클립 공간에서 모든 버텍스의 z 좌표를 조정하여 다른 깊이 레이어로 푸시 할 수 있습니다. 실제 3D 좌표는 z = 0에 머무를 수 있습니다. 클립 공간을 변경하면 원근감 문제가 없어 지므로 원근 투영을 장면에서 사용할 수 있습니다.
스프라이트 평면에 수직이 아닌 다른 카메라 각도를 허용하려면 스프라이트 정점을 고정 레이어로 푸는 대신 "layerOffset * layerIdx"로 조정해야합니다. 따라서 모든 레이어에 대해 정점은 카메라에 한 걸음 더 밀착됩니다.
참고 : 고정 레이어를 사용하면 xy 평면이 반드시 중앙에 있지 않으므로 올바른 클립 공간 좌표를 찾는 것이 매우 까다로운 일입니다.
열린 질문 : 클립 공간의 해상도? 클립 공간에서 가장 작은 차이점은 무엇입니까? 푸시 된 sprite와 실제 3D 요소간에 가능한 간섭이 있습니까? 평면 스프라이트가 3d 객체를 초과하여 굴지 않도록하려면 스프라이트가 아닌 모든 평면 객체는 사용 된 최대 레이어 오프셋으로 푸시되어야합니다. 카메라 앞의 사용 가능한 공간에서 레이어 오프셋을 계산하는 것이 좋습니다.
달성 : 전망 투영 된 3D 장면에서 2 차원 평면에 스프라이트가 구성됩니다. 스프라이트는 셰이더에서 계산 된 조각 깊이를 기준으로 차단됩니다. 그리기는 여전히 텍스처 배치로 수행 할 수 있습니다.
주 2 : 아직 일괄 처리 된 두 번의 실행을 고려합니다. 첫 번째 것은 조정 된 깊이를 가진 2 차원 스프라이트이고, 두 번째는 스프라이트 또는 스프라이트 평면에 "부착"되지 않은 객체입니다. 깊이 버퍼 inbetween를 지우고 보이지 않는 스프라이트면을 클리핑에 추가합니다.
사진을 (무대 뒤에있는 물체가 허용되지 않은 경우) :
http://www.imagebam.com/image/109f6e356918267
http://www.imagebam.com/image/a2085f356918275
투영 후 깊이를 직접 쓸 수 있습니다. https://www.opengl.org/sdk/docs/man/html/gl_FragDepth.xhtml 명확히하기 : 동일한 깊이에 투시 투영을 사용하여 개체를 렌더링하십시오. 그 후에 gl_FragDepth를 사용하여 객체를 올바른 순서로 배치하십시오. – dari
젠장, 내 실수 야. 나는 OpenGL ES 2.0에 대해 언급 했어야했다. Afaik에는 gl_FragDepth가 지원되지 않습니다. 죄송합니다! 더 일찍 말해야 했어. 어쨌든 고마워! –
'glPolygonOffset'을 사용하여 투시 투영을 사용하십시오. https://www.opengl.org/sdk/docs/man/html/glPolygonOffset.xhtml – dari