Я пытаюсь использовать WEBGL_draw_buffers с OES_texture_float, который работает. Однако при использовании двух целей рендеринга с другим типом это не работает на моей машине Windows (amd). Тем не менее, он работает на моей Linux-машине (драйвер с открытым исходным кодом Radeon).Webgl: цветные вложения с различными форматами не работают на окнах
Так фреймбуфера со следующими приложениями цвета не работает на окнах:
крепежных 0: RGB * байты без знака
вложение 1: RGB * поплавок
но следующее макет не работает:
приложение 0: rgb * float
вложение 1: RGB * поплавок
Я написал небольшую тестовую программу, которая иллюстрирует проблему:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<script type="text/javascript">
var canvas = document.createElement('canvas');
var gl = canvas.getContext("webgl");
var WEBGL_draw_buffers = gl.getExtension("WEBGL_draw_buffers") || gl.getExtension("GL_EXT_draw_buffers") || gl.getExtension("EXT_draw_buffers");
gl.getExtension("OES_texture_float");
gl.getExtension("WEBGL_depth_texture");
var result = "";
result += "UNSIGNED_BYTE, FLOAT: " + test(gl.UNSIGNED_BYTE, gl.FLOAT) + "<br />";
result += "FLOAT, FLOAT: " + test(gl.FLOAT, gl.FLOAT);
var div = document.createElement('div');
div.innerHTML = result;
document.body.appendChild(div);
function setParams() {
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
}
function test(type1, type2) {
var w = 2, h = 2;
var t1 = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, t1);
setParams();
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, w, h, 0, gl.RGB, type1, null);
var t2 = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, t2);
setParams();
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, w, h, 0, gl.RGB, type2, null);
var framebuffer = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
WEBGL_draw_buffers.drawBuffersWEBGL([WEBGL_draw_buffers.COLOR_ATTACHMENT0_WEBGL, WEBGL_draw_buffers.COLOR_ATTACHMENT1_WEBGL]);
gl.framebufferTexture2D(gl.FRAMEBUFFER, WEBGL_draw_buffers.COLOR_ATTACHMENT0_WEBGL, gl.TEXTURE_2D, t1, 0);
gl.framebufferTexture2D(gl.FRAMEBUFFER, WEBGL_draw_buffers.COLOR_ATTACHMENT1_WEBGL, gl.TEXTURE_2D, t2, 0);
var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
switch (status) {
case gl.FRAMEBUFFER_COMPLETE:
return "FRAMEBUFFER_COMPLETE";
case gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
return "FRAMEBUFFER_INCOMPLETE_ATTACHMENT";
case gl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
return "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";
case gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
return "FRAMEBUFFER_INCOMPLETE_DIMENSIONS";
case gl.FRAMEBUFFER_UNSUPPORTED:
return "FRAMEBUFFER_UNSUPPORTED";
default:
return "Error: " + status;
}
}
</script>
</body>
</html>
На окнах это выходы:
UNSIGNED_BYTE, FLOAT: FRAMEBUFFER_UNSUPPORTED
FLOAT, FLOAT: FRAMEBUFFER_COMPLETE
и на linux эти выходы:
UNSIGNED_BYTE, FLOAT: FRAMEBUFFER_COMPLETE
FLOAT, FLOAT: FRAMEBUFFER_COMPLETE
Хотелось бы знать почему. Обратите внимание, что мои результаты одинаковы в firefox и chrome.
Обновление: когда использование angle
отключено в Windows, оно будет вести себя точно так же, как Linux.