Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios GLSL上的球体光线相交。不同的行为取决于设备_Ios_Opengl Es_Glsles - Fatal编程技术网

Ios GLSL上的球体光线相交。不同的行为取决于设备

Ios GLSL上的球体光线相交。不同的行为取决于设备,ios,opengl-es,glsles,Ios,Opengl Es,Glsles,我一直在尝试开发一些着色代码,用于在iOS设备上渲染大气效果。这个GLSL代码在很大程度上依赖于我以这种方式实现的基于 应该不返回任何交叉点,但它确实返回 我在着色器编程方面有点新手,如有任何帮助,将不胜感激 检查您的pow功能。如果x为负,则pow(x,y)未定义 我认为编译器足够聪明,可以将pow(x,2.0)转换为x*x,但我不想指望它 在你的例子中,指数是一个常量整数,你最好自己做乘法运算。当它是变量时,您应该执行类似于pow(max(0.0,x),y)的操作 但我不能确定这就是问题所在

我一直在尝试开发一些着色代码,用于在iOS设备上渲染大气效果。这个GLSL代码在很大程度上依赖于我以这种方式实现的基于

应该不返回任何交叉点,但它确实返回


我在着色器编程方面有点新手,如有任何帮助,将不胜感激

检查您的pow功能。如果x为负,则pow(x,y)未定义

我认为编译器足够聪明,可以将pow(x,2.0)转换为x*x,但我不想指望它

在你的例子中,指数是一个常量整数,你最好自己做乘法运算。当它是变量时,您应该执行类似于pow(max(0.0,x),y)的操作

但我不能确定这就是问题所在


glDrawArray中的崩溃可能是一个完全独立的问题,与着色器代码无关,更可能是它试图消耗一些无效缓冲区或内存位置的顶点。

检查pow函数。如果x为负,则pow(x,y)未定义

我认为编译器足够聪明,可以将pow(x,2.0)转换为x*x,但我不想指望它

在你的例子中,指数是一个常量整数,你最好自己做乘法运算。当它是变量时,您应该执行类似于pow(max(0.0,x),y)的操作

但我不能确定这就是问题所在


glDrawArray中的崩溃可能是一个完全独立的问题,与着色器代码无关,更可能是它试图使用一些无效缓冲区或内存位置的顶点。

感谢您的快速回复。你肯定是在那里,pow(x,2.0)肯定和x*x不一样,这似乎至少是我的问题的一部分。然而,在旧机器上的highp float上的vec3分辨率似乎不允许以足够的精度计算与球体的交点。它是否在片段着色器上运行?不幸的是,GLES2设备不必支持highp on fragment着色器,只需使用mediump即可(在CPU方面,几乎是半精度而不是单精度),感谢@Columbo。我终于找到了正确的解决方法。:)首先,正如你所指出的,我对pow()有这个问题。这给了我一些非常低质量的高锯齿光线球体相交的结果。对于精度问题,我尝试重新缩放整个场景,但没有任何改进。其次,我再次检查了两个平台上的精度是否相同。在一个绝望的举动中,我将光线方向的计算带到顶点着色器,它神奇地工作了!因此,到目前为止,我发现了两种可能性:1)glGetShaderPrecisionFormat()上存在问题,因为在顶点着色器和片段着色器上执行某些操作之间显然存在差异。2) 在某些平台上,变量的插值不够好。感谢您的快速回复。你肯定是在那里,pow(x,2.0)肯定和x*x不一样,这似乎至少是我的问题的一部分。然而,在旧机器上的highp float上的vec3分辨率似乎不允许以足够的精度计算与球体的交点。它是否在片段着色器上运行?不幸的是,GLES2设备不必支持highp on fragment着色器,只需使用mediump即可(在CPU方面,几乎是半精度而不是单精度),感谢@Columbo。我终于找到了正确的解决方法。:)首先,正如你所指出的,我对pow()有这个问题。这给了我一些非常低质量的高锯齿光线球体相交的结果。对于精度问题,我尝试重新缩放整个场景,但没有任何改进。其次,我再次检查了两个平台上的精度是否相同。在一个绝望的举动中,我将光线方向的计算带到顶点着色器,它神奇地工作了!因此,到目前为止,我发现了两种可能性:1)glGetShaderPrecisionFormat()上存在问题,因为在顶点着色器和片段着色器上执行某些操作之间显然存在差异。2) 在某些平台上,变量的插值不够好。
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);
}
intersectionsWithSphere(vec3(0.0,0.0,2.0),vec3(0.0,1.0,-1.0), 1.0);