Вы можете получить текущее значение униформы, вызвав `
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>