首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >webgl getUniformLocation返回0

webgl getUniformLocation返回0
EN

Stack Overflow用户
提问于 2018-01-15 20:34:37
回答 1查看 1.1K关注 0票数 1

简单地说,我遇到了这样的问题:通过getUniformLocation调用不同的制服似乎都返回相同的值。

很难验证这一点,因为返回的闪烁对于javascript控制台是不透明的。然而,当查看其他人的代码示例时,我注意到您可以在它的位置传递标准的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);

infoAinfoB都等于'uRotationMatrix'统一的WebGLActiveInfo对象,infoC也是如此,但是infoD返回'uSampler'的信息数据。

我能找到的最接近类似问题的是关于优化,删除未使用的制服,导致getUniformLocation总是返回-1。我不相信这里的情况是这样的,因为这两种制服都是使用的,并且使用了Ben https://github.com/benvanik/WebGL-Inspector的webgl-检查器铬扩展,我在程序面板中看到了这两种制服,其值分别为0和1。然而,我确实注意到,提供无效的统一名称不会产生错误,并导致'uRotationMatrix' (infoE)的信息对象的“默认”返回值(infoE);使用只使用-1会导致错误(infoF)。

代码语言:javascript
复制
const infoE = gl.getActiveUniform(program, gl.getUniformLocation(program, 'INVALID_NAME');
const infoF = gl.getActiveUniform(program, -1); // null

有趣的是,Safari中的结果是相反的,即大多数调用返回'uSampler的info对象,而只显式使用javascript号,返回'uRotationMatrix'的info对象

着色器在下面,相当简单,他们和我的程序连接在返回成功时,有关参数被检查。即

代码语言:javascript
复制
gl.getShaderParameter(shader, gl.COMPILE_STATUS);
gl.getProgramParameter(program, gl.LINK_STATUS);

顶点。

代码语言:javascript
复制
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);
}

碎片。

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-15 23:15:06

gl.getUniformLocation不返回-1为不存在的制服。它返回null

这段代码毫无意义。

代码语言:javascript
复制
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)返回。它的目的是让你可以在不知道他们的名字的情况下查询制服。

代码语言:javascript
复制
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没有这样的保证。

  • 具有相同制服的两个程序可能对每个制服都有不同的位置。
  • 这些地点不是0和1,它们可能是任何东西,5323和23424。这取决于司机。不同的司机返回不同的号码。
  • 类似地,对于像uniform float foo[2]这样的制服数组,如果foo[0]的位置是37,那么而不是意味着foo[1]的位置是38。

出于所有这些原因,WebGL选择包装位置。这样就可以避免和/或检查其中的许多错误。您不能在WebGLUniformLocation上计算,因此猜测位置错误就消失了(您的猜测可能在本地有效,但您正在创建一个必须在其他GPU上运行的网页)。避免了均匀阵列的数学错误。类似地,您不能使用来自不同程序的一个程序的WebGLUniformLocation,这意味着避免了假设两个具有相同制服的程序具有相同的int位置的错误。

当我们讨论gl.getActiveUniform这个话题时,你应该意识到它可以为那些不是制服的东西返回信息。示例:https://jsfiddle.net/greggman/n6mzz6jv/

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48270307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档