2013-07-04 6 views
0

다른 장치의 조각 쉐이더에 문제가 있습니다. 일부 장치에서는 쉐이더가 정상적으로 작동하지만 다른 알고리즘에서는 이상한 결과가 발생합니다. 자바에서 알고리즘을 검사하여 알고리즘 자체에 오류가 없는지 확인했습니다.조각 쉐이더 알고리즘에서 예기치 않은 동작이 발생했습니다.

알고리즘이 실패한 부분은 다음과 같습니다.

float a = sqrt(dot(MD,MD)); 
float factor = (dot(MD,b)/a)/a; 

을하지만 사용하는 경우 내가 믿는,

float factor = dot(MD,b)/dot(MD,MD); 

같은 계산이며, 따라서해야이 같은 결과를 나타내지 만 :이 같은 계산을 쓸 때 는 모든 장치에서 작동 일부 장치에서는 알고리즘이 실패합니다. 실패가 발생할 수있는 다른 부분은 더 복잡합니다. 그러나 이것이 왜 실패하고 있는지 이해할 수 있다면 다른 부분도 해결할 수 있습니다.

도움을 주시면 감사하겠습니다. BTW

, 나는 더 정확성을 보장 없다 뜨고 점 (MD, MD)가 제로보다 큰

답변

1

부동 포인트가 다른 장치에서 다르게 작동 항상 mediump 정밀는 OpenGL ES 2.0을 사용하고, 그래서 당신은해야 숫자가 너무 크거나 작을 때 나쁜 결과를 기대하십시오.

예를 들어 도트 (MD, MD)가 0에 가까울 때 sqrt는이 값을 멀리 이동하여이 수를 사용하여 추가 작업을 안정화합니다. 부문에서 이것은 특히 중요합니다.

+0

감사합니다. 여러 장치 용으로 개발할 때 이러한 문제를 피하기 위해 수행 할 수있는 방법에 대해 설명하는 다른 방법이나 참고 자료를 알고 계십니까? 불필요한 sqrt와 division을 계산하는 것이 옳다고 느끼지 않습니다. – user1581048

+0

@ user1581048 일반적으로 안정 범위에서 계산을 유지하려고 시도하지만이를 달성하는 일반적인 방법은 없습니다. 키워드 안정성에서 검색을 시작할 것을 제안 할 수 있습니다. – Vasaka

+0

감사합니다. 나는 1에서 0까지의 범위에서의 계산이 OpenGL에서 그렇게 드물지 않다고 생각하기 때문에 이러한 문제는 0에 가까운 계산 결과에서 조금 놀란다. – user1581048

관련 문제