以下是使用OpenGL / WebGL将两个重叠图像合并的示例代码:
首先,您需要创建一个包含两个纹理的帧缓冲对象(FBO)用于渲染到纹理。然后,您可以使用一个简单的着色器将两个纹理进行混合。
// 创建帧缓冲对象(FBO)
const fbo = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
// 创建纹理1
const texture1 = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture1);
// 设置纹理参数
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);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
// 创建纹理2
const texture2 = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture2);
// 设置纹理参数
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);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
// 绑定纹理到FBO
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture1, 0);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT1, gl.TEXTURE_2D, texture2, 0);
// 检查FBO是否完整
if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) {
console.error('Framebuffer is not complete');
}
// 渲染到纹理1
gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture1, 0);
// 绘制图像1
// ...
// 渲染到纹理2
gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture2, 0);
// 绘制图像2
// ...
// 将两个纹理混合
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
gl.useProgram(shaderProgram);
// 设置着色器中的纹理单元
const uTexture1Location = gl.getUniformLocation(shaderProgram, 'uTexture1');
gl.uniform1i(uTexture1Location, 0); // 纹理单元0
const uTexture2Location = gl.getUniformLocation(shaderProgram, 'uTexture2');
gl.uniform1i(uTexture2Location, 1); // 纹理单元1
// 绑定纹理1到纹理单元0
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, texture1);
// 绑定纹理2到纹理单元1
gl.activeTexture(gl.TEXTURE1);
gl.bindTexture(gl.TEXTURE_2D, texture2);
// 绘制一个矩形,将两个纹理混合
// ...
// 清理
gl.deleteTexture(texture1);
gl.deleteTexture(texture2);
gl.deleteFramebuffer(fbo);
这只是一个基本示例,您可能需要根据您的需求进行更多的自定义。请注意,此示例假设您已经初始化了上下文(gl)和着色器程序(shaderProgram)。
希望这可以帮助到您!