Opengl es 在OpenGL ES/WebGL中将子数据复制到空纹理中

Opengl es 在OpenGL ES/WebGL中将子数据复制到空纹理中,opengl-es,textures,webgl,Opengl Es,Textures,Webgl,我以这种方式创建了纹理: var tex = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, tex); gl.texParameteri(... gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, w, h, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); 然后我尝试将子数据从当前帧缓冲区复制到其中: gl.copyTexSubImage2D(gl.TEXTURE_2D, 0, ox,

我以这种方式创建了纹理:

var tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texParameteri(...
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, w, h, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
然后我尝试将子数据从当前帧缓冲区复制到其中:

gl.copyTexSubImage2D(gl.TEXTURE_2D, 0, ox, oy, sx, sy, w, h);
它不会第一次复制任何东西。纹理仍然为空(包含零)

当我第二次调用copyTexSubImage2D时,它可以工作。如果子区域的大小与纹理的大小相对应,它也会第一次起作用

我希望避免在开始时发送真实数据(需要太长时间),复制比我需要的更大的区域也需要太长时间

这是预期的行为,还是Chromes WebGL中的错误?还有其他解决方案吗?

让我们测试一下

var gl=twgl.getWebGLContext(document.getElementById(“c”); var programInfo=twgl.createProgramInfo(gl,[“vs”,“fs]”); var greenProgramInfo=twgl.createProgramInfo(gl,[“vs”,“green fs]”); 变量数组={ 位置:[1,-1,0,1,-1,0,-1,1,0,-1,1,0,1,-1,0,1,1,0], }; var bufferInfo=twgl.createBufferInfoFromArrays(gl,arrays); twgl.setBuffersAndAttributes(总帐、程序信息、缓冲信息); //为帧缓冲区创建纹理 var fbtex=gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D,fbtex); gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,256,256,0,gl.RGBA,gl.UNSIGNED_字节,null); gl.texParameteri(gl.TEXTURE_2D、gl.TEXTURE_WRAP_S、gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE\u 2D、gl.TEXTURE\u WRAP\u T、gl.CLAMP\u至边缘); gl.texParameteri(gl.TEXTURE\u 2D,gl.TEXTURE\u MIN\u过滤器,gl.NEAREST); //创建帧缓冲区并附加纹理 var fb=gl.createFramebuffer(); gl.bindFramebuffer(gl.FRAMEBUFFER,fb); gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,fbtex,0); //将纹理清除为绿色 //gl.clearColor(0,1,0,1); //总账清除(总账颜色缓冲位); //只是为了确保渲染为绿色,而不是清除为绿色。(但这两种方法都适用于我) gl.useProgram(绿色计划信息计划); twgl.drawBufferInfo(总图,总图三角形,bufferInfo); //现在制作一个纹理 var tex=gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D,tex); gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,256,256,0,gl.RGBA,gl.UNSIGNED_字节,null); gl.texParameteri(gl.TEXTURE_2D、gl.TEXTURE_WRAP_S、gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE\u 2D、gl.TEXTURE\u WRAP\u T、gl.CLAMP\u至边缘); gl.texParameteri(gl.TEXTURE\u 2D,gl.TEXTURE\u MIN\u过滤器,gl.NEAREST); //将FBT纹理的一部分复制到它 //目标,水平,x偏移,y偏移,x,y,宽度,高度 gl.copyTexSubImage2D(gl.TEXTURE_2D,0,10,20,30,40,50,60); gl.bindFramebuffer(gl.FRAMEBUFFER,null); //现在清除红色 gl.clearColor(1,0,0,1); 总账清除(总账颜色缓冲位); //现在使用纹理进行渲染 总账使用程序(programInfo.program); 变量={ u_纹理:tex, }; twgl.设置制服(程序信息、制服); twgl.drawBufferInfo(总图,总图三角形,bufferInfo)
canvas{边框:1px纯黑;}

属性向量4位置;
可变矢量2 v_texcoord;
void main(){
gl_位置=位置;
v_texcoord=位置.xy*0.5+0.5;
}
精密中泵浮子;
均匀的二维u_纹理;
可变矢量2 v_texcoord;
void main(){
gl_FragColor=纹理2D(u_纹理,v_texcoord);
}
精密中泵浮子;
可变矢量2 v_texcoord;
void main(){
gl_FragColor=vec4(0,1,0,1);
}
如果这样做有效,应该有一个白色(透明)画布,里面有一个绿色矩形。

Ok,所以问题更复杂。我创建了两个纹理A、B,都用“null”初始化。我将设置为渲染目标,并将绿色渲染到其中。然后我做gl.copyTexSubImage2D(gl.TEXTURE_2D,…);变成B,它不起作用。更改了样本。对我来说仍然有效。这对你不管用吗?谢谢。这很奇怪。我的问题发生在一个复杂的任务中,当我有几十个纹理和数百个操作时,所以很难找到真正的原因。我现在通过用零数组初始化缓冲区解决了这个问题。