Shader 渐变屏幕

渐变

前置工作,创建缓冲,对顶点着色器传递顶点数据

function main() {
  var canvas = document.getElementById('webgl');
  var gl = getWebGLContext(canvas);
  if (!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) return
  var n = initVertexBuffers(gl);
}

function initVertexBuffers(gl) {
  var vertices = new Float32Array([-1, 1, -1, -1, 1, -1, 1, 1]);
  var n = 4;
  var a_Position = gl.getAttribLocation(gl.program, 'a_Position');
  var vertexBuffer = gl.createBuffer();
  gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
  gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
  gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);
  gl.enableVertexAttribArray(a_Position);
  return n;
}

顶点着色

var VSHADER_SOURCE =
  'attribute vec4 a_Position;\n' +
  'void main() {\n' +
  '  gl_Position = a_Position;\n' +
  '}\n';

思考,最终操作改变每个片元的颜色,就是根据uv坐标的不同逐片元计算,使用cos控制周期性效果

uv坐标:二维空间每个像素绝对位置(0,0 ~ 宽高) gl_FragCoord.xy  /  设备分辨率

cos周期变化:delta时间,每帧间隔为主键

对片元着色传递这些控制变量

  let time = Date.now();
  let iTime = 0;
  let iResolutionAddr = gl.getUniformLocation(gl.program, "iResolution");
  let iTimeAddr = gl.getUniformLocation(gl.program, "iTime");
  gl.clear(gl.COLOR_BUFFER_BIT);

  let loop = () => {
    let nowTime = Date.now();
    let dt = (nowTime - time) * 0.002;
    iTime += dt;
    time = nowTime;

    gl.uniform2f(iResolutionAddr, 1536, 865); // 传递分辨率
    gl.uniform1f(iTimeAddr, iTime); // 传递时间

    gl.clearColor(0, 0, 0, 0);
    gl.drawArrays(gl.TRIANGLE_FAN, 0, n);
    requestAnimationFrame(loop);
  };
  loop();

片元着色

var FSHADER_SOURCE =
  '#ifdef GL_ES\n' +
  'precision mediump float;\n' +
  '#endif\n' +
  'uniform vec2 iResolution;\n' + // 屏幕分辨率
  'uniform float iTime;\n' +
  'void main() {\n' +
    'vec2 uv = gl_FragCoord.xy / iResolution;' +  // 计算uv 0~1
    // cos 分别计算 v.x, v.y, v.z 的余弦值,返回 vec3(-1~1, -1~1, -1~1)
    'vec3 c = 0.5 + 0.5 * cos(iTime + uv.xyx + vec3(0, 2, 4));' +  // vec3 0~1 
    'gl_FragColor = vec4(c, 1.0);\n' +
  '}\n';

相关推荐

  1. css 边框渐变

    2024-04-20 19:46:09       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-20 19:46:09       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-20 19:46:09       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-20 19:46:09       87 阅读
  4. Python语言-面向对象

    2024-04-20 19:46:09       96 阅读

热门阅读

  1. Spring-Aop源码解析(下)

    2024-04-20 19:46:09       31 阅读
  2. 前端-renren-ui学习

    2024-04-20 19:46:09       36 阅读
  3. 自动化运维工具Ansible模块的介绍与使用

    2024-04-20 19:46:09       34 阅读
  4. 作文笔记7 说明文说明方法

    2024-04-20 19:46:09       27 阅读
  5. 【数据库】MySQL之union联合查询

    2024-04-20 19:46:09       34 阅读
  6. tcpdump服务器抓包实测

    2024-04-20 19:46:09       27 阅读
  7. Excel文件转Asc文件

    2024-04-20 19:46:09       29 阅读
  8. Rust 入门-更换镜像源(MAC)

    2024-04-20 19:46:09       46 阅读
  9. mybatis使用

    2024-04-20 19:46:09       34 阅读
  10. 【QT教程】QML Web多媒体处理

    2024-04-20 19:46:09       29 阅读
  11. vue3知识点补充第二节

    2024-04-20 19:46:09       37 阅读