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,它不起作用。更改了样本。对我来说仍然有效。这对你不管用吗?谢谢。这很奇怪。我的问题发生在一个复杂的任务中,当我有几十个纹理和数百个操作时,所以很难找到真正的原因。我现在通过用零数组初始化缓冲区解决了这个问题。