作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的片段着色器,包含一个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/
这是我的片段着色器,包含一个uniform: precision highp float; uniform sampler2D uSampler; varying vec2 vPosition; vo
我是一名优秀的程序员,十分优秀!