2014-11-05 11 views
2

코드를 this tutorial에서 구현하려고하는데 훨씬 큰 비율 (반경 = 100000 단위)입니다.구름 위의 추악한 렌더링

사이즈가 중요한지는 모르겠지만 지구상의 구름에는 이상한 렌더링이 있습니다. 튜토리얼에서는 두 개의 구체와 세 개의 텍스처 (지구지도, 범프 맵, 구름)를 사용하고 있습니다. 다음은 결과 (구름이 가까이있는 경우 즉 더 나쁜)

: Earth

더 많은 구름이 지구 표면의 가까운는 더이 결함 볼 수 있습니다. 구름이 충분히 멀리 떨어져 있다면 (현실적이지는 않지만) 문제는 완전히 사라집니다.

어떻게해야합니까?

+0

가까운 비행기가 0.01 인 경우 튜토리얼 에서처럼 100으로 늘려보십시오. – WestLangley

답변

4

선형 대수 대신에 로그 깊이 버퍼를 사용하십시오. 여기

var renderer = new THREE.WebGLRenderer({ antialias: true, logarithmicDepthBuffer: true}); 

당신이 한 번 봐 가질 수 예제 : LJ_1102에 의해 제안 polygonOffset를 사용 http://threejs.org/examples/#webgl_camera_logarithmicdepthbuffer

을 가능성이있다 이것은 당신이 THREE.WebGLRenderer과 같이하면 당신 만들 때 단지 logarithmicDepthBuffer 수 있도록, 매우 간단한 변화 필요하지는 않습니다.

+0

고마워, 작동하지. LJ_1102의 대답에 대한 내 의견을 볼 수도 있습니다. 당신의 대답에 관해서, 나는 로그 깊이 버퍼가 덜 최적화되어 있다고 생각합니까? 렌더링 지속 시간에는 차이점을 볼 수 없지만 앞으로는 훨씬 더 많은 요소를 내 장면에 추가해야 할 것입니다. –

+1

@MorganTouvereyQuilling 로그 버퍼는 프래그먼트 셰이더에 오버 헤드를 가지고 있습니다. 이것은 프래그먼트 셰이더에 로그 함수를 추가합니다. 조각의 색과 위치를 계산해야 할 필요가있는 다른 모든 것들에 관해서는 - 이것은 아주 작은 것입니다. 즉, 성능 오버 헤드가 매우 작습니다. 또한이 오버 헤드는 정적입니다. 장면 깊이 테스트에서 얼마나 많은 객체를 가지고 있더라도 렌더링 된 픽셀 당 한 번만 수행됩니다. 소스 https://github.com/mrdoob/three.js/blob/1769fbfc6c994b51a54c15a5c096855fd3cb8a1a/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl – travnik

+0

도와 주시면 솔루션이 내 입자 렌더링에 문제가됩니다. 저는 ShaderParticleEngine을 입자 엔진으로 사용하고 있습니다. 이제 입자는 다른 모든 요소 뒤에 렌더링됩니다. http://i.imgur.com/cPYvE7U.png (우주선의 입자가 지구 뒤쪽에 표시되고 또한 반응기 뒤 - 에미 터 출처 ** ** 반응기 내부에 있음) –

1

뎁쓰 버퍼 해상도가 부족하기 때문에 발생하는 문제는 z-fighting입니다.

  1. 쓰기/하나 개의 영역에 세 개의 텍스처를 렌더링하는 다중 텍스처 쉐이더를 사용

    당신은 기본적으로 이에 대응하기 위해 세 가지 옵션이 있습니다.

  2. 구면 간의 거리를 증가 시키십시오./근거리 및 원거리 자르기 평면 사이의 거리를 줄입니다.

  3. polygonOffsetPOLYGON_OFFSET_FILL renderstate를 사용하면 외부 영역에서 작성된 깊이 값을 오프셋 할 수 있습니다. Read more about polygonOffset here.

+0

고마워요! 마지막으로 travnik 솔루션을 사용하여 완벽하게 작동합니다. 하지만 몇 가지 질문이 있습니다. 불충분 한 깊이 버퍼 해상도에 대해 말하고 있습니다. 한 의미에서, 나는 반경 반지름에 너무 큰 값을 사용하고 있다는 말입니까? 내가 z-fighting 원점을 찾았 기 때문에 생각하지 않습니다. 저는 구를 그리는 데 64 개의 세그먼트 (너비와 높이)를 사용하고 있습니다. 세그먼트 수를 512로 늘리면 문제가 거의 사라집니다. 그것은 두 개의 구체의 얼굴이 평평해서 싸우고 있기 때문에 z-fighting이 일어난다 고 생각합니다. 꼭지점 만 "좋은 높이"에 있습니다. –

+1

Btw : 나는 당신의 대답과 travnik의 대답을 받아들이고 싶었지만 불가능하다고 생각합니다. 나는 당신에게 upvote를 주었지만 더 대답 할 수 없기 때문에 미안하다. 왜냐하면 당신의 대답은 더 완전하고 더 많은 조사 가능성을 제공하기 때문이다. –

+0

문제는 당신의 구체가 너무 크다는 사실에 있지는 않지만, 구체의 크기와 관련하여 그들의 얼굴 사이의 거리는 너무 작습니다. 기본 깊이 버퍼는 비선형이며 먼 자르기 기준면에 대한 해상도가 감소합니다. 구의 세그먼트 수를 늘리면 이상적인 구에 대한 더 나은 근사를 얻고 그로 인해 얼굴 전체의 깊이 값 보간에서 오류가 줄어들 기 때문에 가정은 정확합니다. –