저는 iOS 장치에서 대기 효과를 렌더링하기위한 음영 코드를 개발하려고했습니다. 이 GLSL 코드는 코드가 모두 실행 아이폰 OS 10.0 아이 패드 프로 9.7과 아이폰 6에 완벽하게 정상적으로 근무하고있다 http://www.scratchapixel.com/lessons/3d-basic-rendering/minimal-ray-tracer-rendering-simple-shapes/ray-sphere-intersectionGLSL의 구형 선 교차점. 장치에 따른 다른 동작
highp vec2 intersectionsWithSphere(highp vec3 o,
highp vec3 d,
highp float r){
highp float a = dot(d,d);
highp float b = 2.0 * dot(o,d);
highp float c = dot(o,o) - pow(r, 2.0);
highp float q = pow(b,2.0) - 4.0 * a * c;
if (q < 0.0){
return vec2(-1.0, -1.0);
}
highp float sq = sqrt(q);
highp float t1 = (-b - sq)/(2.0*a);
highp float t2 = (-b + sq)/(2.0*a);
if (t1 > t2){
highp float a = t2;
t2 = t1;
t1 = a;
}
return vec2(t1,t2);
}
에 따라, 나는이 방법을 구현 구 레이 교차 수학에 크게 의존 .2.
그러나 iPad 2 (iOS 9.3) 및 iPad 4 (iOS 10)를 사용하면이 기능이 동일한 결과를 반환하지 않습니다. 도중에 나는 glDrawArray() OpenGL 커맨드의 아주 이상한 동작을 보았습니다. 때때로 완벽하게 유효하고 컴파일 가능한 쉐이딩 코드와 충돌하는 것처럼 보였습니다.
두 플랫폼 모두 highp 플로트 (27 비트)에 대해 동일한 정밀도가 있고 작은 범위로 검사되었는지 확인했습니다. 예 :
intersectionsWithSphere(vec3(0.0,0.0,2.0),vec3(0.0,1.0,-1.0), 1.0);
은 교차점을 전혀 반환하지 말아야합니다.
저는 쉐이더 프로그래밍에 초보자이며 어떤 도움을 주시면 감사하겠습니다.
빠른 답장을 보내 주셔서 감사합니다. 확실히 당신은 거기에 있었고, pow (x, 2.0)는 x * x와 분명히 같지 않습니다. 그리고 그것은 제 문제의 적어도 일부분 인 것 같습니다. –
그러나 오래된 기계의 highp float에있는 vec3의 해상도는 구체와의 교차점을 충분한 정밀도로 계산할 수없는 것으로 보입니다. –
조각 쉐이더에서 실행 중입니까? 불행히도 GLES2 디바이스는 프래그먼트 쉐이더에서 highp를 지원할 필요가 없으며 mediump (CPU 용어로 단 정밀도가 아닌 반 정밀도)를 사용할 수 있습니다. – Columbo