2014-11-25 2 views
1

필자는 WebGL에서 프랙탈을위한 거리 함수를 사용하여 반복 횟수를 3 이상으로 설정할 때마다 내 컴퓨터에서 오류를 발견했습니다. 그 말은 그레이 스케일 프랙탈 대신에 회색 화면을 얻는다는 것입니다 (비 -WebGL 설정에서 정확성을 테스트했기 때문에 계산이 완료되지 않았다고 생각합니다)for 루프를 수동으로 반복하는 이유는 무엇입니까?

그러나 컴퓨터에서는 직장에서는 3 또는 그 이상으로 잘 작동합니다. 나는이 같은 반복의 수를 정의 :이에 ...

float mandelboxDist(Object inMandelbox, vec3 inPos) { 
    inPos -= inMandelbox.pos; 
    vec3 offset = vec3(inPos); 

    float d = 1.0; 
    for (int i = 0; i < MANDELBOX_ITER; i++) { 
     // Boxfold 
     inPos = clamp(inPos, -MANDELBOX_BFOLD, MANDELBOX_BFOLD)*2.0-inPos; 

     // Spherefold 
     float posDot = dot(inPos, inPos); 
     if (posDot < MANDELBOX_MIN_RAD) { 
      inPos *= MANDELBOX_LINEAR_SCALE; 
      d *= MANDELBOX_LINEAR_SCALE; 
     } 
     else if (posDot < MANDELBOX_FIXED_RAD) { 
      float inversion = MANDELBOX_FIXED_RAD/posDot; 
      inPos *= inversion; 
      d *= inversion; 
     } 

     inPos = MANDELBOX_SCALE*inPos+offset; 
     d = MANDELBOX_SCALE*d+1.0; 
    } 

    return length(inPos)/abs(d); 
} 

:

#define MANDELBOX_ITER 20 

내가 내 반복 기반 코드 변환 문제를 알아 내기 위해 노력

void iterateMandelbox(inout vec3 pos, vec3 inOffset, inout float d) { 
    // Boxfold 
    pos = clamp(pos, -MANDELBOX_BFOLD, MANDELBOX_BFOLD)*2.0-pos; 

    // Spherefold 
    float posDot = dot(pos, pos); 
    if (posDot < MANDELBOX_MIN_RAD) { 
     pos *= MANDELBOX_LINEAR_SCALE; 
     d *= MANDELBOX_LINEAR_SCALE; 
    } 
    else if (posDot < MANDELBOX_FIXED_RAD) { 
     float inversion = MANDELBOX_FIXED_RAD/posDot; 
     pos *= inversion; 
     d *= inversion; 
    } 

    pos = MANDELBOX_SCALE*pos+inOffset; 
    d = MANDELBOX_SCALE*d+1.0; 
} 

float mandelboxDist(Object inMandelbox, vec3 inPos) { 
    inPos -= inMandelbox.pos; 
    vec3 offset = vec3(inPos); 
    float d = 1.0; 

    iterateMandelbox(inPos, offset, d); 
    iterateMandelbox(inPos, offset, d); 
    iterateMandelbox(inPos, offset, d); 
    iterateMandelbox(inPos, offset, d); 
    iterateMandelbox(inPos, offset, d); 
    iterateMandelbox(inPos, offset, d); 
    iterateMandelbox(inPos, offset, d); 
    iterateMandelbox(inPos, offset, d); 
    iterateMandelbox(inPos, offset, d); 
    iterateMandelbox(inPos, offset, d); 
    iterateMandelbox(inPos, offset, d); 
    iterateMandelbox(inPos, offset, d); 
    iterateMandelbox(inPos, offset, d); 
    iterateMandelbox(inPos, offset, d); 
    iterateMandelbox(inPos, offset, d); 
    iterateMandelbox(inPos, offset, d); 
    iterateMandelbox(inPos, offset, d); 
    iterateMandelbox(inPos, offset, d); 
    iterateMandelbox(inPos, offset, d); 
    iterateMandelbox(inPos, offset, d); 

    return length(inPos)/abs(d); 
} 

. 내 컴퓨터에서 작동하는 것을 발견했습니다. 분명히 이것은 매우 불편하며, "수동으로"루핑 할 때 왜 작동하는지 알지 못합니다. 무슨 일 이니?

편집 : LJ_1102의 대답에 대응하여, 나는 "이 매킨토시에 관하여"2011 년에서 맥북과이가 나에게 말한다 나는이에 "인텔 HD 그래픽 3000 384메가바이트"그래픽 카드 가정에서

답변

1

당신 ' 당신이 ANGLE에서 루프 언 롤링 버그를 겪고있는 것처럼 들리는 Windows PC에서 다시.

확인하려면 브라우저를 --use-gl=desktop으로 시작하십시오. 이 플래그를 사용하면 브라우저에서 ANGLE DirectX 변환 계층을 사용하지 않습니다. 문제가 실제로 ANGLE 기반 일 때 getTranslatedShaderSource을 사용하여 컴파일 된 HLSL 코드를 살펴보고 거기에서 디버그하십시오.

각도 기반 문제인 경우 불행히도 각도 기반 프로젝트가 실행될 수있는 유일한 기회는 각도가 올바르게 변환 될 때까지 주변을 들썩 거리거나 앵글 프로젝트 페이지에 버그를 신고하는 것입니다.

+0

나는 실제로 맥북을 가지고있다. 중요한 점은 2011 년부터이고 "이 Mac 정보"에서 "Intel HD Graphics 3000 384 MB"그래픽 카드가 있다고 말합니다 – asimes

+0

그렇습니다. 그렇다면 Macbook에서 OSX를 사용하고 있다고 가정하고 있습니까? 제가 인텔 (Intel HD 3000) 드라이버에 몇 가지 문제가 있음을 기억하는 한, 최신 버전의 OSX가 설치되어 있습니까? [chrome : // gpu /] (chrome : // gpu /)/[about : gpu] (about : gpu) (크롬을 사용한다고 가정 할 때), 어떤 드라이버 해결 방법이 적용됩니까? 또한 [WebGL 적합성 테스트] (https://www.khronos.org/registry/webgl/sdk/tests/webgl-conformance-tests.html)를 참조하십시오. 가장 좋은 방법은 그래픽 드라이버를 업데이트하는 것입니다. –

+0

그 외에도 종료 조건으로 define 대신 상수를 사용하려 했습니까? –

관련 문제