WebGL проверяет, какая единица текстуры связана с униформой - PullRequest
0 голосов
/ 23 сентября 2019

Можно ли проверить, какая единица текстуры связана с униформой, используя javascript?Например (код psudeo!):

let samplerRef = gl.getUniformLocation(program, 'textureSampler'); 
gl.uniform1i(samplerRef, 0);
console.log(samplerRef.textureUnit);  // texture unit 0

Я пытаюсь отладить некоторый код, и это поможет мне убедиться, что мои текстурные блоки подключены к правильным сэмплерам.Однако я не смог найти в Интернете никакого кода, который позволил бы мне сделать это.

1 Ответ

1 голос
/ 23 сентября 2019

Вы можете получить текущее значение униформы, вызвав `

const currentValue = gl.getUniform(program, uniformLocation);

. Вы также можете получить объекты текстуры, привязанные к текущему активному текстурному блоку, вызвав

const texture2D = gl.getParameter(gl.TEXTURE_BINDING_2D);
const textureCubeMap = gl.getParameter(gl.TEXTURE_BINDING_CUBE_MAP);

Так что если выхотел получить объект текстуры, который определенная uinform использовал бы, если бы вы вызвали gl.drawXXX, вы могли бы сделать что-то вроде

const unit = gl.getUniform(program, samplerUniformLocation);
gl.activeTexture(gl.TEXTURE0 + unit);
const texture2D = gl.getParameter(gl.TEXTURE_BINDING_2D);

Примеры

const gl = document.createElement('canvas').getContext('webgl');

const vs = `
uniform int abc;
uniform vec3 def;
void main() {
  gl_Position = vec4(def, abc);
}
`;

const fs = `
precision highp float;
uniform sampler2D tex;
void main() {
  gl_FragColor = texture2D(tex, vec2(0));
}
`;

const program = twgl.createProgram(gl, [vs, fs]);

gl.useProgram(program);
gl.uniform1i(gl.getUniformLocation(program, 'abc'), 123);
gl.uniform3fv(gl.getUniformLocation(program, 'def'), [4, 5, 6]);
gl.uniform1i(gl.getUniformLocation(program, 'tex'), 7);

gl.activeTexture(gl.TEXTURE0 + 7);
const tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);

log('----texture units-----');

// get all the currently bound textures
const numTextureUnits = gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS);
for (let unit = 0; unit < numTextureUnits; ++unit) {
  gl.activeTexture(gl.TEXTURE0 + unit);
  log(unit, '2D', gl.getParameter(gl.TEXTURE_BINDING_2D) || 'null', 'CUBE_MAP', gl.getParameter(gl.TEXTURE_BINDING_CUBE_MAP) || 'null');
}

log('----uniforms-----');

// get all the uniforms values
const numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
for (let i = 0; i < numUniforms; ++i) {
  const uniformInfo = gl.getActiveUniform(program, i);
  const location = gl.getUniformLocation(program, uniformInfo.name);
  const value = gl.getUniform(program, location);
  log(uniformInfo.name, glEnumToString(gl, uniformInfo.type), value, value === tex ? 'this is tex' : '');
}

function glEnumToString(gl, v) {
  for (let k in gl) {
    if (gl[k] === v) {
      return k;
    }
  }
  return v;
}


function log(...args) {
  const elem = document.createElement('pre');
  elem.textContent = [...args].join(' ');
  document.body.appendChild(elem);
}
pre { margin: 0; }
<script src="https://twgljs.org/dist/4.x/twgl.min.js"></script>
...