2016-10-20 20 views
1

저는 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); 

은 교차점을 전혀 반환하지 말아야합니다.

저는 쉐이더 프로그래밍에 초보자이며 어떤 도움을 주시면 감사하겠습니다.

답변

0

펑 기능을 확인하십시오. x가 음수이면 pow (x, y)는 정의되지 않습니다.

저는 컴파일러가 pow (x, 2.0)를 x * x로 바꾸기에 충분히 똑똑하다고 생각하고 싶습니다. 그러나 저는 그것을 의지하지 않을 것입니다.

귀하의 경우와 같이 지수가 일정한 정수인 경우, 곱셈을 수행 할 수도 있습니다. 변수가있는 곳에서는 pow (max (0.0, x), y)와 같은 것을해야합니다.

그러나 이것이 문제인지는 확실하지 않습니다.

glDrawArray의 충돌이 셰이더 코드와 완전히 별개의 문제 일 가능성이 높습니다. 잘못된 버퍼 또는 메모리 위치에서 버텍스를 소비하려고 할 가능성이 훨씬 큽니다.

+0

빠른 답장을 보내 주셔서 감사합니다. 확실히 당신은 거기에 있었고, pow (x, 2.0)는 x * x와 분명히 같지 않습니다. 그리고 그것은 제 문제의 적어도 일부분 인 것 같습니다. –

+0

그러나 오래된 기계의 highp float에있는 vec3의 해상도는 구체와의 교차점을 충분한 정밀도로 계산할 수없는 것으로 보입니다. –

+0

조각 쉐이더에서 실행 중입니까? 불행히도 GLES2 디바이스는 프래그먼트 쉐이더에서 highp를 지원할 필요가 없으며 mediump (CPU 용어로 단 정밀도가 아닌 반 정밀도)를 사용할 수 있습니다. – Columbo