简单地说,我遇到了这样的问题:通过getUniformLocation调用不同的制服似乎都返回相同的值。
很难验证这一点,因为返回的闪烁对于javascript控制台是不透明的。然而,当查看其他人的代码示例时,我注意到您可以在它的位置传递标准的javascript编号,因此这个试用代码:
const infoA = gl.getActiveUniform(program, gl.getUniformLocation(program, 'uSampler'));
const infoB = gl.getActiveUniform(program, gl.getUniformLocation(program, 'uRotationMatrix'));
const infoC = gl.getActiveUniform(program, 0);
const infoD = gl.getActiveUniform(program, 1);infoA和infoB都等于'uRotationMatrix'统一的WebGLActiveInfo对象,infoC也是如此,但是infoD返回'uSampler'的信息数据。
我能找到的最接近类似问题的是关于优化,删除未使用的制服,导致getUniformLocation总是返回-1。我不相信这里的情况是这样的,因为这两种制服都是使用的,并且使用了Ben https://github.com/benvanik/WebGL-Inspector的webgl-检查器铬扩展,我在程序面板中看到了这两种制服,其值分别为0和1。然而,我确实注意到,提供无效的统一名称不会产生错误,并导致'uRotationMatrix' (infoE)的信息对象的“默认”返回值(infoE);使用只使用-1会导致错误(infoF)。
const infoE = gl.getActiveUniform(program, gl.getUniformLocation(program, 'INVALID_NAME');
const infoF = gl.getActiveUniform(program, -1); // null有趣的是,Safari中的结果是相反的,即大多数调用返回'uSampler的info对象,而只显式使用javascript号,返回'uRotationMatrix'的info对象
着色器在下面,相当简单,他们和我的程序连接在返回成功时,有关参数被检查。即
gl.getShaderParameter(shader, gl.COMPILE_STATUS);
gl.getProgramParameter(program, gl.LINK_STATUS);顶点。
precision mediump float;
attribute vec2 aPosition;
attribute vec2 aTexCoord;
uniform mat4 uRotationMatrix;
varying vec2 fragTexCoord;
void main() {
fragTexCoord = aTexCoord;
gl_Position = uRotationMatrix * vec4(aPosition, 0.0, 1.0);
}碎片。
precision mediump float;
varying vec2 fragTexCoord;
uniform sampler2D uSampler;
void main() {
vec4 sample = texture2D(uSampler, fragTexCoord);
gl_FragColor = vec4(sample.rgb, 1.0);
}有没有人知道我应该在哪里找到这个问题呢?
编辑:
为了确保参数类型和返回值类型是兼容的,请通过相关函数的MDN文档。
“位置:指定要获取的统一属性的索引的GLuint。这个值由getUniformLocation()返回。”链接:getActiveUniform
和
返回值:当指定统一属性的索引或位置时,表示命名变量位置的WebGLUniformLocation值. WebGLUniformLocation类型与GLint类型兼容。链接:getUniformLocation
发布于 2018-01-15 23:15:06
gl.getUniformLocation不返回-1为不存在的制服。它返回null
这段代码毫无意义。
const infoA = gl.getActiveUniform(program, gl.getUniformLocation(program, 'uSampler'));
const infoB = gl.getActiveUniform(program, gl.getUniformLocation(program, 'uRotationMatrix'));gl.getActiveUniform需要一个整数。gl.getUniformLocation返回WebGLUniformLocation对象,而不是整数,它不能转换为整数。最好是将其转换为NaN,而NaN则被转换为0。
gl.getActiveUniform不采取统一的位置,它需要一个从0到N1的数字,其中N从gl.getProgramParameter(prg, gl.ACTIVE_UNIFORMS)返回。它的目的是让你可以在不知道他们的名字的情况下查询制服。
const numUniforms = gl.getProgramParameter(prg, gl.ACTIVE_UNIFORMS);
for (let i = 0; i < numUniforms; ++i) {
// get the name, type, and size of a uniform
const info = gl.getActiveUniform(prg, i);
// get the location of that uinform
const loc = gl.getUniformLocation(prg, info.name);
}请注意,WebGL之所以选择让gl.getUniformLocation返回WebGLUniformLocation对象而不是int,是因为猜测这些int或假定它们是连续的是一个常见的错误。OpenGL没有这样的保证。
uniform float foo[2]这样的制服数组,如果foo[0]的位置是37,那么而不是意味着foo[1]的位置是38。出于所有这些原因,WebGL选择包装位置。这样就可以避免和/或检查其中的许多错误。您不能在WebGLUniformLocation上计算,因此猜测位置错误就消失了(您的猜测可能在本地有效,但您正在创建一个必须在其他GPU上运行的网页)。避免了均匀阵列的数学错误。类似地,您不能使用来自不同程序的一个程序的WebGLUniformLocation,这意味着避免了假设两个具有相同制服的程序具有相同的int位置的错误。
当我们讨论gl.getActiveUniform这个话题时,你应该意识到它可以为那些不是制服的东西返回信息。示例:https://jsfiddle.net/greggman/n6mzz6jv/
https://stackoverflow.com/questions/48270307
复制相似问题