gpt4 book ai didi

javascript - webgl getUniformLocation 返回 0

转载 作者:行者123 更新时间:2023-11-30 14:50:11 29 4
gpt4 key购买 nike

简而言之,我遇到了一个问题,即通过 getUniformLocation 调用不同制服似乎都返回相同的值。

很难验证这一点,因为返回的 Glint 对 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 Vanik 的 webgl-inspector chrome 扩展 https://github.com/benvanik/WebGL-Inspector ,我看到程序面板中列出的两个制服的 idx 值为 0 和 1。但是我确实注意到提供无效的制服名称不会产生任何错误,并导致 'uRotationMatrix' 的信息对象的“默认”返回值 (信息E);仅使用 -1 导致错误 (infoF)。

const infoE = gl.getActiveUniform(program, gl.getUniformLocation(program, 'INVALID_NAME');
const infoF = gl.getActiveUniform(program, -1); // null

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

着色器在下面并且非常简单,当检查相关参数时,它们和我链接它们的程序都返回成功。即

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

最佳答案

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 对象,不是整数,也不能转换成整数。充其量它被转换为 NaNNaN 被转换为 0。

gl.getActiveUniform 不采用统一位置,它采用从 0 到 N - 1 的数字,其中 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 不做这样的保证。

  • 具有相同制服的两个程序可能每个制服的位置不同。
  • 这些位置不是 0 和 1,它们可以是任何东西,5323 和 23424。这取决于驱动程序。各种驱动程序返回不同的数字。
  • uniform float foo[2] 类似,如果 foo[0] 的位置是 37,则意味着foo[1] 的位置是 38。

出于所有这些原因,WebGL 选择包装位置。这样可以避免和/或检查其中的许多错误。您不能在 WebGLUniformLocation 上进行数学运算,因此猜测位置错误就会消失(您的猜测可能在本地有效,但您正在制作一个必须在其他 GPU 上运行的网页)。避免了错误的统一数组数学错误。同样,您不能将一个程序的 WebGLUniformLocation 用于另一个程序,这意味着可以避免假设具有相同制服的 2 个程序将具有相同的 int 位置的错误。

当我们讨论 gl.getActiveUniform 主题时,您应该知道它可以返回非制服的信息。示例:https://jsfiddle.net/greggman/n6mzz6jv/

关于javascript - webgl getUniformLocation 返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48270307/

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