96443


three.jsのShaderMaterialのフラグメントシェーダーの記述のところで、  
配列の添字を変数にすると描画されません。  
（ ①だと描画されるが、②だと描画されない ）

配列の添字に変数は使えないのでしょうか？  
または使う方法はありますか？  
動的に配列の要素を選択したいです。

[code]

    <script id="fragmentShader" type="x-shader/x-fragment">
    void main(){
        float ary[1];
        ary[0] = 1.0;
    
        gl_FragColor = vec4(ary[0], 0.0, 0.0, 1.0); // ① OK
    
        int r = 0;
        // gl_FragColor = vec4(ary[r], 0.0, 0.0, 1.0); // ② NG
    }
    </script>
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/xdRPe.png)](https://i.stack.imgur.com/xdRPe.png)


CC BY-SA 4.0
2023-10-07T00:43:32.697
96442
2023-10-07T01:29:34.960
2023-10-07T00:50:58.893
12297
12297
question
javascript three.js glsl
three.jsのShaderMaterialのフラグメントシェーダーの記述で、配列の添字に変数が使えない？


[WebGL](https://registry.khronos.org/webgl/specs/latest/1.0/)は

  * [OpenGL ES Version 2.0.25](https://registry.khronos.org/OpenGL/specs/es/2.0/es_full_spec_2.0.pdf)
  * [OpenGL ES Shading Language Version 1.00](https://registry.khronos.org/OpenGL/specs/es/2.0/GLSL_ES_Specification_1.00.pdf)

を参照していますが、後者の [Appendix A: Limitations for ES
2.0](https://registry.khronos.org/OpenGL/specs/es/2.0/GLSL_ES_Specification_1.00.pdf#page=115)
に

> ## 5 indexing of Arrays, Vectors and Matrices
>
> Definition:  
>  `constant-index-expressions` are a superset of `constant-expressions`.
> Constant-index-expressions can include loop indices as defined in Appendix A
> section 4.

とか言っていて最終的に

>
> [![画像の説明をここに入力](https://i.stack.imgur.com/3tF2v.png)](https://i.stack.imgur.com/3tF2v.png)

となっていて配列の添え字は定数しか認められていません。

* * *

一応、

[code]

    if (r == 0)
        gl_FragColor = vec4(ary[0], 0.0, 0.0, 1.0);
    else if (r == 1)
        gl_FragColor = vec4(ary[1], 0.0, 0.0, 1.0);
    
[/code]

みたいな涙ぐましい努力をすることが認められています。


CC BY-SA 4.0
2023-10-07T01:29:34.960
96443
2023-10-07T01:29:34.960
4236
96442
answer