비행 시뮬레이터를 쓰고 있는데이 장르의 고전적인 문제에 매달 렸습니다. 뷰잉 프러스 텀의 가까운 비행기는 항공기 조종실을 볼 수있을 정도로 가까이 있어야하며, 먼 비행기는 멀리 보이는 거리를 허용해야합니다. 최대 40km.OpenGL에서 z-fighting 문제를 없애려면 어떻게해야합니까?
가시 거리 또는 근거리/원거리 비율은 실제로 OpenGL의 z 버퍼 정밀도 능력을 뛰어 넘고 멀리있는 물체는 심하게 깜박입니다. 멋진 3D 엔진으로 문제가 해결되고 OpenGL에 대한 진정한 지식이 필요합니다. :) 아마도 내가 문제를 해결할 올바른 방법을 찾았을 것입니다. (내가 틀렸다면 OpenGL 전문가가 저를 바로 잡습니다.)하지만 내 솔루션은 중요한 부분을 놓칩니다. 변경된 렌더러 더블 패스 렌더링을 수행 표시되어야하는 첫 번째 패스 먼 물체에
- 및 배경 근처 평면 멀어, Z 버퍼는 지형 좋지만 가까운 오브젝트가 얻어 클리핑 보이는 행복하다.
- 두 번째 단계에서 투영 행렬은 근거리 개체에 맞게 조정되어 조종실을 표시해야합니다.
미해결 문제 : 모든 멀리있는 물체와 배경이 보이지 않는 두 번째 패스에서은, 그러므로 나는 조종석과 그 뒤에 검은 배경을 가지고있다. 두 번째 패스의 결과는 첫 번째 패스의 결과를 완전히 낭비합니다. Ergo 계획 오버레이가 발생하지 않습니다. 질문 : 두 번째 패스에서 배경색을 무시하도록 OpenGL을 강제하는 방법 두 패스 결과가 원하는 오버레이를 만들 수 있습니까?
P. 현상의 이미지가 있습니다 (가까운/먼 평면은 모든 세부 사항을 볼 수 있도록 극단에 있으며, 투사 조정없이 단일 패스를 나타냅니다).
http://www.flickr.com/photos/[email protected]/5995604542/sizes/l/in/photostream/
버퍼 클리어 렌더링 사이클 당 한 번만 발생하고, 2 개 패스 사이에 관여하지. 여기에 청산 코드 :
JoglContext jctx = (JoglContext) ctx;
GLContext context = context(ctx);
GL gl = context.getGL();
// Mask of which buffers to clear, this always includes color & depth
int clearMask = GL.GL_DEPTH_BUFFER_BIT | GL.GL_COLOR_BUFFER_BIT;
gl.glPushAttrib(GL.GL_DEPTH_BUFFER_BIT);
gl.glDepthMask(true);
gl.glClearColor(r, g, b, jctx.getAlphaClearValue());
gl.glClear(clearMask);
gl.glPopAttrib();
당신이 설명하는 접근 방식은 또한 2 개 패스에 사용되는 : 1. "장거리"투사와 지형 2. "짧은 거리"와 조종실 사이에 청소하지만 두 번째 이후 조종석 뒤에 배경을 통과 검은 색입니다. 아마도 glDepthRange 함수가 도움이 될 것이고, 매뉴얼을 확인해야 할 것입니다.
z 버퍼 깊이는 24 비트입니다.
신속한 응답을 보내 주셔서 감사합니다. Nicol. 내 의견은 길었고 원래 게시물에 붙여 넣어야했습니다. glDepthRange를 자세히 살펴볼 것입니다. – Paul