布局(location=n)是否可以跳过WebGL中drawBuffers的索引?

布局(location=n)是否可以跳过WebGL中drawBuffers的索引?,webgl,opengl-es-2.0,webgl2,opengl-es-3.0,Webgl,Opengl Es 2.0,Webgl2,Opengl Es 3.0,我正在我的图形引擎中处理MRT 我所处(并打算修复)的一个有趣点是,我生成的片段着色器出现了: layout(location = 0) out vec4 thing1; layout(location = 2) out vec4 thing2; 应用程序端的drawBuffers调用如下所示: gl.drawBuffers([gl.COLOR_ATTACHMENT0, gl.NONE, gl.COLOR_ATTACHMENT1]); 但是,我得到了一个错误: WebGL: INVALID_

我正在我的图形引擎中处理MRT

我所处(并打算修复)的一个有趣点是,我生成的片段着色器出现了:

layout(location = 0) out vec4 thing1;
layout(location = 2) out vec4 thing2;
应用程序端的drawBuffers调用如下所示:

gl.drawBuffers([gl.COLOR_ATTACHMENT0, gl.NONE, gl.COLOR_ATTACHMENT1]);
但是,我得到了一个错误:

WebGL: INVALID_OPERATION: drawBuffers: COLOR_ATTACHMENTi_EXT or NONE
显然,这是不允许的。从我从维基百科的一篇讨论它的文章中读到的文档中:

它指出指定的布局位置引用了从drawBuffers调用中指定的数组索引。所以,理论上我认为这个着色器对配置是有效的

从我的理解中,我遗漏了什么使这不起作用

我主要要求理解,而不是修复我的程序,当我做到“正确”且没有位置索引跳过时,我的生成器将更正索引

更新:如下所述,可以跳过着色器中的布局位置。我的问题是drawBuffers调用的格式不正确,我在索引中有COLOR\u ATTACHMENT1,其中只有COLOR\u ATTACHMENT2是有效的。

这是错误的

gl.drawBuffers([gl.COLOR_ATTACHMENT0, gl.NONE, gl.COLOR_ATTACHMENT1]);
i-th附件必须是
gl.NONE
gl.COLOR\u附件
i

所以一定是这样

gl.drawBuffers([gl.COLOR_ATTACHMENT0, gl.NONE, gl.COLOR_ATTACHMENT2]);
函数main(){
const gl=document.querySelector('canvas').getContext('webgl2');
const vs=`#版本300 es
void main(){
gl_位置=vec4(0,0,0,1);
gl_PointSize=100.0;
}
`;
常数fs=`#版本300 es
高精度浮点;
布局(位置=0)输出向量4内容1;
布局(位置=2)输出向量4内容2;
空干管(){
thing1=vec4(1,0,0,1);
thing2=vec4(0,0,1,1);
}
`;
常量prg=twgl.createProgram(gl[vs,fs]);
const fb=gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER,fb);
createTextureAndAttach(总图,总图颜色\u附件0);
createTextureAndAttach(总图,总图颜色\u附件2);
德国劳埃德船级社([
gl.COLOR_附件0,
无德国劳埃德船级社,
gl.COLOR_附件2,
]);
const status=gl.checkFramebufferStatus(gl.FRAMEBUFFER);
如果(状态!==gl.FRAMEBUFFER\u完成){
错误(“无法呈现到此帧缓冲区组合”);
返回;
}
德国劳埃德船级社使用计划(prg);
总图视口(0,0,1,1);
总图绘制阵列(总图点,0,1);
checkError();
读取(总图颜色附件0);
读取(总图颜色附件2);
checkError();
函数checkError(){
const err=gl.getError();
如果(错误){
控制台错误(twgl.glEnumToString(gl,err));
}
}
函数读取(附件点){
总账读取缓冲区(附件点);
常数像素=新的UINT8阵列(4);
gl.readPixels(0,0,1,1,gl.RGBA,gl.UNSIGNED_字节,pixel);
log(Array.from(pixel.join(','));
}
函数createTextureAndAttach(gl,attachmentPoint){
常量tex=gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D,tex);
gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA8,1,1,0,gl.RGBA,gl.UNSIGNED_字节,null);
gl.framebufferTexture2D(gl.FRAMEBUFFER,attachmentPoint,gl.TEXTURE_2D,tex,0);
}
}
main()

谢谢!这肯定是我的问题。我相信我已经知道这一点,但我是在一个相当厚的树林里把它组装起来的!幸运的是,我的一切都准备好了,所以我的引擎又发出咕噜声:)