双pass渲染案例(离线渲染一个三角面,然后渲染到一个占满屏幕的矩阵上)
离线渲染如何需要开启深度测试的话,需要额外操作,这里不展开
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WebGL 2 Offline Rendering and Texture Display</title>
</head>
<body>
<canvas id="glCanvas" width="800" height="600"></canvas>
<script>
// 将 WebGL 初始化和渲染逻辑封装到一个函数中
function initWebGL() {
// 获取 canvas 元素
const canvas = document.getElementById('glCanvas');
// 获取 WebGL 2 上下文
const gl = canvas.getContext('webgl2');
// 如果无法获取 WebGL 2 上下文,给出提示并结束函数
if (!gl) {
alert('无法初始化 WebGL 2,你的浏览器可能不支持。');
return;
}
// 离线渲染的着色器代码
const offlineVertexShaderSource = `#version 300 es
in vec2 a_position;
void main() {
gl_Position = vec4(a_position, 0.0, 1.0);
}
`;
const offlineFragmentShaderSource = `#version 300 es
precision mediump float;
out vec4 fragColor;
void main() {
fragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
`;
// 最终渲染到屏幕的着色器代码
const finalVertexShaderSource = `#version 300 es
in vec2 a_position;
in vec2 a_texCoord;
out vec2 v_texCoord;
void main() {
gl_Position = vec4(a_position, 0.0, 1.0);
v_texCoord = a_texCoord;
}
`;
const finalFragmentShaderSource = `#version 300 es
precision mediump float;
in vec2 v_texCoord;
uniform sampler2D u_texture;
out vec4 fragColor;
void main() {
fragColor = texture(u_texture, v_texCoord);
}
`;
// 创建着色器函数
function createShader(gl, type, source) {
const shader = gl.createShader(type);
gl.shaderSource(shader, source);
gl.compileShader(shader);
const success = gl.getShaderParameter(shader, gl.COMPILE_STAT