当前位置: 首页 > 知识库问答 >
问题:

更新数据纹理时,所有点都将变为0,0

阙星渊
2023-03-14

我正在交换新的位置数据,以便在用户点击时形成点云(在高云和宽云之间交替)。我做了这个小提琴,到目前为止,我可以让云第一次正确渲染(一个高云),但在点击事件中,所有的点位置似乎都变成了0,0,而不是变成一个宽云。我错过了什么?

以下是一些需要检查的片段:

function makeCloud() {

    var cloudWidth, cloudHeight;

    if ( isTallCloud ) {
        cloudHeight = 100;
        cloudWidth = 25;
    } else {
        cloudHeight = 25;
        cloudWidth = 100;
    }

    isTallCloud = !isTallCloud;

    var positions = new Float32Array( particles * 4 );
    var offsets = new Float32Array( particles * 4 );

    for ( var i = 0, i4 = 0; i < particles; i ++, i4 +=4 ) {

        positions[ i4 + 0 ] = ( Math.random() * 2 - 1 ) * cloudWidth; // x
        positions[ i4 + 1 ] = ( Math.random() * 2 - 1 ) * cloudHeight; // y
        positions[ i4 + 2 ] = 0.0; // velocity
        positions[ i4 + 3 ] = 0.0; // velocity

        offsets[ i4 + 0 ] = positions[ i4 + 0 ]; // width offset
        offsets[ i4 + 1 ] = positions[ i4 + 1 ]; // height offset
        offsets[ i4 + 2 ] = stateChange; // this will hold the change state ( 0.0 or 1.0 )
        offsets[ i4 + 3 ] = 0.0; // not used

    }

    cloudData = {
        "positions" : positions,
        "offsets" : offsets
    }
}

function updateStateChange() {

    for ( var i = 0, i4 = 0; i < particles; i ++, i4 +=4 ) {
        cloudData.offsets[ i4 + 2 ] = stateChange; // this will hold the change state ( 0.0 or 1.0 )
    }
}

function updateOffsets() {
    offsetsTexture = new THREE.DataTexture( cloudData.offsets, width, height, THREE.RGBAFormat, THREE.FloatType );
    positionUniforms.tOffsets.value = offsetsTexture;
    positionUniforms.tOffsets.needsUpdate = true;
}

function onDocumentClick() {
    event.preventDefault();
    stateChange = 1.0;
    makeCloud();
    updateOffsets();
}

function animate() {
    requestAnimationFrame( animate );
    update();
    render(); 
}

function render() {
    renderer.render( scene, camera );
}

function update() {
    positionUniforms.uTime.value += 0.01;
    gpuCompute.compute();

    particleUniforms.tPositions.value = gpuCompute.getCurrentRenderTarget( positionVariable ).texture;

    if ( stateChange === 1.0 ) {
        stateChange = 0.0;
        console.log("swapped state!");
        updateStateChange();
        updateOffsets();
    }
}

着色器代码中的一个片段:

vec4 offsets = texture2D( tOffsets, uv ).xyzw;
float swapState = offsets.z;
vec4 nowPos;
vec2 velocity;

if ( swapState == 0.0 ) {
    nowPos = texture2D( tPositions, uv ).xyzw;
    velocity = vec2(nowPos.z, nowPos.w);
} else { // if swapState == 1.0
    nowPos = vec4( offsets.x, offsets.y, 0.0, 0.0 );
    velocity = vec2(0.0, 0.0);
}

背景:

我意识到,只需点击一下交换所有数据,就可以很容易地得到我想要的结果;然而,我试图通过在纹理中传递这些偏移值来更新的原因是,在我的更大程序中,有更多的点云,我只想改变选定的云(如着色器中的swapState所示),同时让物理着色器继续控制剩余的未选定云。更新所有云会破坏着色器控制的物理连续性。

共有1个答案

东方修谨
2023-03-14

我在我的代码中发现了错误——缺陷在于我如何为DataTexture设置必要性更新属性。请参阅此处的固定小提琴。这是使它最终按预期工作的修订:

function updateOffsets() {
    offsetsTexture = new THREE.DataTexture( cloudData.offsets, width, height, THREE.RGBAFormat, THREE.FloatType );
    offsetsTexture.needsUpdate = true; // **using this way of updating the texture produced the behavior I expected
    positionUniforms.tOffsets.value = offsetsTexture;
    // positionUniforms.tOffsets.needsUpdate = true; **this form of updating caused the faulty behavior
}
 类似资料:
  • 问题内容: 我有一个CI管道来构建我的android应用程序,并使用gitlab管道运行有条件的测试。我的gitlabRunner是一台ubuntu 16.04机器,在docker容器中运行每个构建。我有一个通过USB连接到gitlab运行程序的物理android设备。 最近,每次触发新的构建时,系统都会提示我允许android目标上的USB设备使用RSA指纹。问题在于指纹随着每个构建而变化。 我

  • 好的,所以我需要创建我自己的纹理/图像数据,然后在OpenGL中将它显示到一个四边形上。我让四边形工作,我可以用我自己的纹理加载器在上面显示一个TGA文件,它完美地映射到四边形。 但是我如何创建自己的“自制图像”,即每个像素1000x1000和3个通道(RGB值)?纹理数组的格式是什么,例如如何将像素(100,100)设置为黑色? 这就是我对完全白色的图像/纹理的想象: 编辑:下面的答案是正确的,

  • 我有一段代码可以在Windows7本机或Ubuntu16.04本机下正常工作,但是在VMPlayer6中使用Ubuntu16.04和vmwgfx,除非移动窗口,否则它不会更新。三种情况下的代码完全相同。 节点这是旧的JOGL 1 http://jogamp.org/deployment/archive/master/gluegen-old-1.0b6/gluegen-rt-natives-linu

  • 问题内容: 我的数据库确实发生了一些奇怪的事情。我正在使用PHP将数据插入数据库中,并且在过去的两年中我一直在这样做,没有任何问题。当客户在我的网站上付款时,我会将交易中的所有数据存储在数据库中。每个交易都有一个唯一的“ transaction_id”。当我将付款信息插入数据库时​​,除“ transaction_id”外,所有信息均已正确插入。所有交易均被赋予“ 4294967295”的“ tr

  • 我有一个像这样的物体。 我的目标是引用数组,并使用。我根据这个答案和另一个答案编写了这个代码。 我将我的发送到以更新彼得的银牌。请求机构是: 问题是,当我使用将竞争对手设置为时,我不知道中有什么。我想使用整个来更新数组中的对象,但是当我这样做的时候,该对象被覆盖,所以彼得的银章变成了: 如何更新数组中的对象,当我知道对象的与所有字段从没有删除字段,我想保持? 我认为数组是空的,因为该对象已重新初始

  • 我有一个使用Liquibase for PostgreSQL定义的现有模式。我正在添加对Oracle的支持,这需要进行重大更改。有些create-table标记只需更改数据类型即可工作,有些则不然(需要sql更改)。当前的changelog-schema文件在单个change-set下有多个create-table语句(我知道这不是一个好的设计,但这正是我现在要处理的),为了重用那些create-