首页 > 解决方案 > 片段着色器的 Spark AR 脚本中的点积错误

问题描述

当我使用less than带有s[0]. 如果我评论以下内容,它会起作用:s[0] = R.add(s[0], R.mul(cV, cV));

我知道上述操作的结果是正确的,因为如果我在纹理中绘制像素,它会正确显示。我认为这是数据类型的问题,但是没有任何警告就很难修复它。

谢谢你的帮助 !

const R = require('Reactive');
const S = require('Shaders');
const Textures = require('Textures');
const Diagnostics = require('Diagnostics');

Promise.all([
    Textures.findFirst('cameraTexture0')
]).then(res => {
    const cameraColor = res[0].signal;

    const uv = S.fragmentStage(S.vertexAttribute({
        'variableName': S.VertexAttribute.TEX_COORDS
    }));

    const c = S.textureSampler(cameraColor, uv);
    const cV = R.pack3(c.x, c.y, c.z);

    const s = [R.pack3(0, 0, 0)];
    s[0] = R.add(s[0], R.mul(cV, cV));

    let min_sigma2 = 100;

    const sigma2 = R.dot(s[0], R.pack3(1, 1, 1));
    Diagnostics.log('1'); // showing
    const condition = R.lt(sigma2, min_sigma2);
    Diagnostics.log('2'); // not showing
})

标签: shaderreactive-programmingfragment-shaderspark-ar-studio

解决方案


我深入研究了您的代码。我不知道为什么变量 s 被定义为一个数组,但是这两行不能确定。

const s = [R.pack3(0, 0, 0)];
s[0] = R.add(s[0], R.mul(cV, cV));

反应变量 s[0] 不能依赖于自身。

也许你想做这样的事情?

const zeroPack3 = R.pack3(0, 0, 0);
const s = R.add(zeroPack3, R.mul(cV, cV));

我也同意你的观点,问题很可能出在数据类型上。您可以更详细地查看变量的实际数据类型,例如使用Diagnostics.log (sigma2);您可以看到它是ShaderSignal,然后将其与 进行比较 ScalarSignal


推荐阅读