2013-04-08 5 views
0

GLSL 쉐이더에서는 성능을 대폭 향상시키기 위해 테셀레이션 패치를 생략해야합니다. 이 패치는 각 정점에 주어진 월드 좌표를 갖는 삼각형입니다. 그러나 절두체 컬링을 위해이 좌표를 뷰 공간으로 변환하면 오차가 있습니다.보기 매트릭스로 도려내 기가있는 풀다운

이것은 원래 지형입니다.

terrain

이 오류가 상단에 영향을 미치는 방법이다.

terrain broken

먼지와 섹션의 근접 촬영입니다.

terrain broken

이러한 오류는 화면의 상단뿐만 아니라 측면과 바닥의 주위에 namly 발생합니다. 다음은 GLSL에서 삼각형을 제외해야하는지 결정하는 데 사용하는 코드입니다.

bool inFrustum(vec3 p,vec3 q,vec3 r) { 
    vec4 Pclip = camera * vec4(p, 1.0f); 
    vec4 Qclip = camera * vec4(q, 1.0f); 
    vec4 Rclip = camera * vec4(r, 1.0f); 
    if(((-Pclip.w>Pclip.x&&-Qclip.w>Qclip.x&&-Rclip.w>Rclip.x)|| (Pclip.x>Pclip.w&&Qclip.x>Qclip.w&&Rclip.x>Rclip.w))|| 
     ((-Pclip.w>Pclip.y&&-Qclip.w>Qclip.y&&-Rclip.w>Rclip.y)||(Pclip.y>Pclip.w&&Qclip.y>Qclip.w&&Rclip.y>Rclip.w))|| 
     ((-Pclip.w>Pclip.z&&-Qclip.w>Qclip.z&&-Rclip.w>Rclip.z)||(Pclip.z>Pclip.w&&Qclip.z>Qclip.w&&Rclip.z>Rclip.w))){ 
    return false; 
    } 
    else{ 
    return true; 
    } 
} 

나는 어떤 도움을 주셔서 감사합니다! Behemyth

내 쉐이더에서

답변

1

나는 패치 추려 다음을 사용

bool visible(vec3 vert) 
{ 
    int clipoffset = 5; //a bit offset because of displacements 
    vec4 p = MVP*vec4(vert,1); 
    return !((p1.x < -(p1.w+clipoffset))|| 
      (p.x > (p.w+clipoffset))|| 
      (p.y < -(p.w+clipoffset))|| 
      (p.y > (p.w+clipoffset))|| 
      (p.z < -(p.w+clipoffset))|| 
      (p.z > (p.w+clipoffset))); 
} 

를 그리고 위에서 다음과 같습니다 enter image description here

PS : 나는 확인 그래서 나는 쿼드 테셀레이션을 사용 한 경우 어쩌면 (와) || 사업자는, 문제의 원인 코드에서 :

if(visible(inPos[0])|| 
      visible(inPos[1])|| 
      visible(inPos[2])|| 
      visible(inPos[3])) 
     { 
      outt[0] = calcTessellationLevel(inPos[3],inPos[0]); 
      outt[1] = calcTessellationLevel(inPos[0],inPos[1]); 
      outt[2] = calcTessellationLevel(inPos[1],inPos[2]); 
      outt[3] = calcTessellationLevel(inPos[2],inPos[3]); 

      inn[1] = (outt[0]+outt[2])/2; 
      inn[0] = (outt[1]+outt[3])/2; 
     } 

편집 : 정점이 절두체에 매 초마다 문 뒤에 괄호없이 그 시도 :

if(S1||S2||S3||S4) 

대신

if((S1||S2)||(S3||S4)) 

을 편집 : 흠 .... 나는이 질문 한 날짜에 못 봤어, 내가 '잘 모릅니다 찾았 어 .... Oo

+1

게시물에 넣은 노력에 감사드립니다. 나는 실수로 경로 추적 렌더러를 생성하여이 문제를 일주했습니다. 문제는 내 끝에서 진정으로 해결되지 않았으므로,이 질문은 모든 대답만큼 좋은 답변입니다. 도와 주셔서 감사합니다! – Behemyth