Monotouch 및 openTK를 사용하여 iOS 용 입자 엔진을 작성 중입니다. 내 접근 방식은 각 입자의 좌표를 투영 한 다음이 화면 위치에 올바르게 크기 조정 된 질감이있는 사각형을 작성하는 것입니다.3D 스프라이트, 정확한 깊이 버퍼 정보 쓰기
그것은 잘 작동하지만 스프라이트가 제대로 초과 인출하고 3D 장면에서 객체에 의해 초과 인출 할 수 있도록 나는 문제가 올바른 깊이 값을 계산있다.
//d=distance to projection plane
float d=(float)(1.0/(Math.Tan(MathHelper.DegreesToRadians(fovy/2f))));
Vector3 screenPos=Vector3.Transform(ref objPos,ref viewMatrix, out screenPos);
float depth=1-d/-screenPos.Z;
그럼 I는 I의 Z 좌표로서 상기 계산 된 깊이 값을 넣어 위치를 화면 좌표에서 trianglestrip 드로잉하고 :
이
제가 현재 사용하고있는 코드이다.결과는 정확하지만별로 정확하지 않습니다. 나는 어떻게 든 가까워지고 멀리 클리핑 비행기를 고려해야한다고 생각한다. (가까운 곳은 1이고 멀리는 나의 경우 10000이다.) 그러나 나는 잘 모르겠다. 나는 정확한 결과를 얻지 않고 다양한 방법과 알고리즘을 시도했다.
이 점에 대해 도움을 주시면 감사하겠습니다.
그건 이상한 일이 될 것 같습니다. ES 1.1에는 포인트 스프라이트 확장 기능이 내장되어 있으며 ES 2.0에서는 버텍스 쉐이더와 관련이 있습니다. CPU에서이 변환을 수행하는 이유가 있습니까? – Tommy
나는 OpenGl에서 초보자이므로 어색하게 그렇게한다면 용서해주십시오. :)하지만 내 이해에서, 내가 정기적으로 파이프 라인을 사용한다면 입자 당 회전 행렬을 만들어서 항상 카메라를 향하게해야한다. 이것은 피할 수있는 오버 헤드를 제공하며, 직면하는 동안 카메라를 향하게하는 그런 카메라가 제공하는 원근감 효과를보고 싶지 않습니다. 나는 ES 2.0을 사용하고있다. – sinsro
아니요, 기하학적 측면에서 생각할 필요가 없습니다. 단지 점의 위치를 제공하고 OpenGL에 그 점에 2 차원 모양을 넣을 수 있습니다. ES 1.1의 포인트 스프라이트 확장을 통해 구현할 수 있지만 2.0에서는 버텍스 쉐이더에서 내장 출력'gl_PointSize'를 사용하고 프래그먼트 쉐이더에서 내장 입력'gl_PointCoord'를 사용할 수 있습니다. 나는 내 대답을 편집하여 꽤 많이 말했습니다. – Tommy