gpt4 book ai didi

javascript - WebGLUniformLocation 对象的属性是什么?

转载 作者:行者123 更新时间:2023-11-30 10:38:05 26 4
gpt4 key购买 nike

这是我的片段着色器,包含一个uniform:

precision highp float;

uniform sampler2D uSampler;
varying vec2 vPosition;

void main() {
gl_FragColor = texture2D(uSampler, vPosition);
}

现在调用函数 getUniformLocation 的地方:

var uniformLocation = gl.getUniformLocation(program, 'uSampler')

我得到一个似乎没有附加任何属性的 WebGLUniformLocation:

for(a in uniformLocation) { console.log(a); } // prints no results

为什么 WebGLUniformLocation 对象没有属性?

最佳答案

WebGLUniformLocation 只是制服位置的不透明句柄,以便您可以设置制服。在真正的 OpenGL 统一位置是整数。不幸的是,许多程序员会对这些整数进行数学运算。例如他们可能会做这样的事情

//--shader--
uniform float a;
uniform float b;
...

// C
GLint location_a = glGetUniformLocation(program, "a");
GLint location_b = a + 1; // ILLEGAL BUT MIGHT WORK ON SOME CARDS

同样他们可能会这样做

//--shader--
uniform float a[2];
...

// C
GLint location_a0 = glGetUniformLocation(program, "a[0]");
GLint location_a1 = a + 1; // ILLEGAL BUT MIGHT WORK ON SOME CARDS

或者他们可以这样做

//--shader #1--
uniform float a;
...

//--shader #2--
uniform float a;
...


// C
GLint program_1 = CompileShadersAndLinkProgram(shader_1_src, ..);
GLint program_2 = CompileShadersAndLinkProgram(shader_2_src, ..);

// Get the location from program 1
GLint location_a = glGetUniformLocation(program_1, "a");

// Use a location from program 1 with program 2
glUseProgram(program_2);
glUnform1f(location_a, 123); // ILLEGAL BUT MIGHT WORK ON SOME CARDS

根据 OpenGL 规范,所有这些都是非法和错误的。有时候没关系。如果您正在编写一些 OpenGL 程序并且您只需要它在您的个人机器或一些固定硬件上工作,那么您可能不在乎它是否有问题,只要它能正常工作。

对于 WebGL 来说,这还不够好。在可能的情况下,您希望一次编写代码并让它在任何地方运行。为了防止这些类型的错误,WebGL 返回一个 WebGLUniformLocation,这样您就不能进行任何数学运算,也不能在另一个程序上使用一个程序的位置。

关于javascript - WebGLUniformLocation 对象的属性是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12846197/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com