【问题标题】:const float array in WebGL shaderWebGL着色器中的常量浮点数组
【发布时间】:2013-02-22 03:38:46
【问题描述】:

我将 THREE.js 与 WebGL 着色器一起使用。我想在片段着色器中声明一个浮点数数组。 GLSL 常量浮点数组的定义如下:

#define KERNEL_LENGTH 9
const float kernel[KERNEL_LENGTH] = {
    1.0/16.0, 2.0/16.0, 1.0/16.0,
    2.0/16.0, 4.0/16.0, 2.0/16.0,
    1.0/16.0, 2.0/16.0, 1.0/16.0
};

我也试过:

#define KERNEL_LENGTH 9
const float kernel[KERNEL_LENGTH] = float[KERNEL_LENGTH](
    1.0/16.0, 2.0/16.0, 1.0/16.0,
    2.0/16.0, 4.0/16.0, 2.0/16.0,
    1.0/16.0, 2.0/16.0, 1.0/16.0
);

但是对于 WebGL,它们都不起作用。错误信息:

ERROR: 0:44: 'kernel' : 数组不能被声明为常量,因为它们不能被初始化 错误:0:44:'=':语法错误

那么我应该如何定义一个 const float 的数组呢?

【问题讨论】:

    标签: arrays constants three.js webgl shader


    【解决方案1】:

    将值作为统一传递,而不是尝试做它告诉你不能做的事情:将数组初始化为常量。

    【讨论】:

    • 我不想将它们传递给着色器,因为这些值始终是恒定的。
    • 一个小秘密:“常量”值总是作为统一值传递给 GPU
    • 你确定WebGL中没有const变量吗?
    • 什么会更快:使用数组类型的统一或将逻辑硬编码到 Ovilia 的答案中的着色器中?
    • 我强烈怀疑编译器会将两者识别为等价的。
    【解决方案2】:

    随便逛逛:

    float kernel[KERNEL_LENGTH];
    kernel[0] = kernel[4] = kernel[20] = kernel[24] = 1.0/273.0;
    kernel[1] = kernel[3] = kernel[5] = kernel[9] = kernel[15] = kernel[19] 
        = kernel[21] = kernel[23] = 4.0/273.0;
    kernel[2] = kernel[10] = kernel[14] = kernel[22] = 7.0/273.0;
    kernel[6] = kernel[8] = kernel[16] = kernel[18] = 16.0/273.0;
    kernel[7] = kernel[11] = kernel[13] = kernel[17] = 26.0/273.0;
    kernel[12] = 41.0/273.0;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 2012-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      相关资源
      最近更新 更多