我目前在WebGL中使用片段着色器(由Three.js提供支持),它使用纹理作为查找表(LUT)。这最初是在我的笔记本电脑上开发的,但后来我决定将其扩展到移动设备上。我在iPhone上打开页面,发现它看起来完全不同。剥离我的代码后,只看到我从LUT得到的东西,我注意到结果是不同的。我的LUT代码在
之下//equipment-SL-routing.module.ts
const routes: Routes = [
{
path: '',
component: EquipmentComponent,
},
];
添加 uniform sampler2D texture1;
uniform sampler2D lutMap;
varying vec2 vUv;
precision highp float;
vec3 rgb2hsv(vec4 c)
{
vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));
vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));
float d = q.x - min(q.w, q.y);
float e = 1.0e-10;
return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
}
void main() {
vec4 inColour = texture2D(texture1, vUv);
// convert to hsv
vec3 hsv = rgb2hsv(inColour);
// scale it up
hsv = vec3(floor(hsv[0] * 128.0), floor(hsv[1] * 128.0), floor(hsv[2] * 128.0));
// map to how we've stored our value
float posF = ((hsv[0] * 128.0*128.0) + (hsv[1] * 128.0) + hsv[2]);
// calculate the actual position in our map
vec2 posV = vec2(floor(posF / 2048.0) / 2048.0, 1.0 - mod(posF, 2048.0) / 2048.0);
// the colour
gl_FragColor = texture2D(lutMap, posV);
}
行以尝试测试它是否精确导致此问题,但似乎没有任何区别。我已经在我的工作笔记本电脑上检查了http://webglreport.com/而没有使用手机,他们为片段着色器精度提供了相同的值。我还有什么可以尝试的吗?为了清楚起见,因为这最初导致笔记本电脑出现问题,我告诉我的纹理使用最近的滤镜映射,例如。
precision highp float