glsl - webgl2.0我如何获得除uniformBuffer项目之外的所有制服

标签 glsl webgl

当我像这样在着色器中编写uniformBuffer时。

uniform Material {
    uniform vec4 u_DiffuseColor;
    uniform vec4 u_TilingOffset;
    uniform vec3 u_MaterialSpecular;
    uniform float u_AlphaTestValue;
    uniform float u_Shininess;
};

gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS) 和 gl.getActiveUniform(program, i) 仍然包含uniformBuffer项(例如u_DiffuseColor,它是多余的!),我发现的唯一一件事是gl.getUniformLocation(program, uniName) ) 将返回 null。

是否有另一种更好的方法可以让我获得不包含uniformBuffer项目的制服,因为我应该用两种不同的方式处理它们。

How can I find a list of all the uniforms in OpenGL es 2.0 vertex shader pro 当使用 opengles3.0 在着色器中使用uniformBuffer block 时,这可能不是最好的方法

最佳答案

给定一些事件统一索引列表,您可以使用 getActiveUniforms 查询该列表中每个项目的属性值。可查询的属性之一是UNIFORM_BLOCK_INDEX,它是uniform所属的uniform block 的索引。如果它不是任何 block 的成员,则该值为-1。

基本上,您构建一个所有统一索引(0 到 ACTIVE_UNIFORMS - 1)的列表,查询它们的 block 索引,然后仅查询 block 索引为 -1 的索引的属性.

或者,您可以使用getActiveUniformBlockParameter查询每个事件 block (0到ACTIVE_UNIFORM_BLOCKS - 1)的统一索引列表,这些索引是该 block 的成员,传递 UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 作为要查询的属性。因此,任何不在这些列表之一中的统一索引都不是 block 的成员。

关于glsl - webgl2.0我如何获得除uniformBuffer项目之外的所有制服,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60933510/

相关文章:

c++ - 在细胞中产生噪声 - CPP 和 GLSL

opengl - 对统一变量的操作是否缓存在 GLSL 中?

opengl - 从顶点数据中获取像素法线

html - 为什么 WebGL 比 Canvas 快?

javascript - WebGL:通过 2D 着色器进行圆线连接

JavaScript 二维渲染库 [pixie.js vs three.js]

opengl - 我应该在 GPU 上还是在 CPU 上计算矩阵?

OpenGL 启用剪辑距离

javascript - 如何在 Three.js 中实现不同摄像机/场景之间的交叉淡入淡出?

javascript - 在我的主机中加载 3D 模型时出现问题