2011-12-08 5 views
0

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이다.) 그러나 나는 잘 모르겠다. 나는 정확한 결과를 얻지 않고 다양한 방법과 알고리즘을 시도했다.

이 점에 대해 도움을 주시면 감사하겠습니다.

+0

그건 이상한 일이 될 것 같습니다. ES 1.1에는 포인트 스프라이트 확장 기능이 내장되어 있으며 ES 2.0에서는 버텍스 쉐이더와 관련이 있습니다. CPU에서이 변환을 수행하는 이유가 있습니까? – Tommy

+0

나는 OpenGl에서 초보자이므로 어색하게 그렇게한다면 용서해주십시오. :)하지만 내 이해에서, 내가 정기적으로 파이프 라인을 사용한다면 입자 당 회전 행렬을 만들어서 항상 카메라를 향하게해야한다. 이것은 피할 수있는 오버 헤드를 제공하며, 직면하는 동안 카메라를 향하게하는 그런 카메라가 제공하는 원근감 효과를보고 싶지 않습니다. 나는 ES 2.0을 사용하고있다. – sinsro

+0

아니요, 기하학적 측면에서 생각할 필요가 없습니다. 단지 점의 위치를 ​​제공하고 OpenGL에 그 점에 2 차원 모양을 넣을 수 있습니다. ES 1.1의 포인트 스프라이트 확장을 통해 구현할 수 있지만 2.0에서는 버텍스 쉐이더에서 내장 출력'gl_PointSize'를 사용하고 프래그먼트 쉐이더에서 내장 입력'gl_PointCoord'를 사용할 수 있습니다. 나는 내 대답을 편집하여 꽤 많이 말했습니다. – Tommy

답변

1

정말로 원하는 것은 소스 위치를 가져 와서 고정 파이프 라인을 사용하지 않는 경우 modelview와 프로젝션 또는 설정 한 모든 것을 전달하는 것입니다. glFrustum과 같이 스택을 설정하기 위해 표준 호출 중 하나를 사용했다고 가정하고, 그렇지 않으면 정체성을 유지하는 경우 해당 매뉴얼을 직접 매뉴얼 페이지에서 얻을 수 있습니다. 마지막으로, 그런 다음

z_clip = -((far + near)/(far - near)) * z_eye - ((2 * far * near)/(far - near)) 
w_clip = -z 

을 :

z_device = z_clip/w_clip; 

편집 : 그래서 당신은 같은 변환 거라고에서 직접 읽는 당신이 ES 2.0에 최선을 다하고, 당신은 실제로 완전히 문제를 방지 할 수 있습니다. GL_POINTS로 렌더링 할 지오메트리를 제공하고 정점 셰이더에서 일반 변환을 수행하지만 gl_PointSize을 원하는 크기로 설정하십시오.

조각 쉐이더에서 gl_PointCoord을 읽으면 점의 일부인 각 조각의 텍스처 좌표를 얻을 수 있습니다. 단 하나의 색상 만 원하지 않으면 포인트 스프라이트를 그릴 수 있습니다.

+0

훨씬 효율적인 방법 인 것처럼 보였습니다. OpenGL에서 쉐이더를 사용하여 이런 점을 텍스처링 할 수 있다는 것을 알지 못했습니다. :) 그러나 나는 전에 언급하지 않은 한 가지 더 많은 요구 사항을 가지고있다. 중심점을 중심으로 텍스처 입자를 회전시킬 수 있어야합니다. 이 방법을 사용하면 가능합니까? 그리고 포인트를 사용하는 파티클은 비 정사각형이 될 수 있습니까? – sinsro

+0

종속 텍스처 읽기가 괜찮 으면 조각 쉐이더 내에서 회전을 수행 할 수 있습니다 (일반적으로 가능한 경우 피할 수 있지만이 경우 피할 수 있도록 지오메트리 비용을 4 배로 늘릴 수는 없습니다) 더 나은 솔루션), 거기에 서클을 확실히 달성하십시오. 그러나 GL에서 뷰포트 정렬 텍스처 좌표 매핑을 사용하여 항상 축 정렬 사각형을 얻으 려한다고 저는 말할 수 있습니다. – Tommy

+0

팁 주셔서 감사. 포인트 스프라이트의 한계로 인해 (둥근 모양이어야하고 텍스처 아틀라스 애니메이션을 지원하지 않음),이 기술을 지금은 사용할 수 없지만 나중에 알아두면 유용합니다. 내가 생각한 원래 접근법을 고수 할 것이다. 전통적인 빌보드는 위에서 언급 한 바와 같이 자신 만의 문제를 가지고 있기 때문에 내가 놓친 OpenGL에서 그것을 할 수있는 영리한 방법이 없다면? :) – sinsro