【问题标题】:Passing Integer to Shader to Define Array Length ( ThreeJS )将整数传递给着色器以定义数组长度 ( ThreeJS )
【发布时间】:2019-09-20 12:33:57
【问题描述】:

我想将一个整数值传递给着色器来定义数组的长度。我是这样传递的:

uniforms:{
    num_parcels: { value: ap_props.parcels }
}

ap_props.parcels = 24。我在着色器中收到它并尝试像这样应用它:

uniform int num_parcels;
uniform vec3 air_parcel_position[ num_parcels ];

我在浏览器控制台中看到了这个错误:

THREE.WebGLShader: gl.getShaderInfoLog() 片段错误: 0:123: '' : 需要常量表达式 错误:0:123:'':数组大小必须是常量整数表达式

我尝试将 num_parcels 转换为常量,但似乎不允许这样做。

我是否可以将整数传递给着色器并使用它来定义数组的长度?

【问题讨论】:

标签: arrays three.js int glsl


【解决方案1】:

我很抱歉。我想出了如何做到这一点。以下是如何将整数传递给着色器以定义数组长度:

var velocityShader = new THREE.ShaderMaterial( {
    uniforms:{
        time: { type: 'f', value: 0 },
        bounce: { type: 'f', value: .5 },
        friction: { type: 'f', value: .99 },
        gravity: { type: 'f', value: .1 }
    },
    vertexShader: document.getElementById( 'ortho-vs' ).textContent,
    fragmentShader: "#define NUM_PARCELS " + ap_props.parcels + "\n" + document.getElementById( 'velocity-fs' ).textContent,
    depthTest: false,
    depthWrite: false
} );

以 fragmentShader 开头的行就是答案。

【讨论】:

  • ShaderMaterial 具有用于此目的的 defines 属性。此外,不需要type:。三.js r.104
  • 是的,你评论了类型:在我的另一个线程中。我只是还没来得及清理代码。不过,我确实了解它现在是如何工作的。谢谢。
猜你喜欢
  • 2015-03-25
  • 1970-01-01
  • 2019-09-11
  • 1970-01-01
  • 2021-01-07
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多