当前位置: 首页 > article >正文

WebGL进阶(七)深度缓冲区

理论基础:

效果:

画家算法

深度冲突

斑驳消除

源码:

画家算法

// 初始化缓冲区并设置矩阵
function initBuffer() {

    // 定义顶点数据,包括位置和颜色
    let arr = [
        // 位置坐标,颜色值
        0.0, 100, -80, 1,      1, 0,  0, 1,  // 红色
        -50, -100, -80, 1,     1, 0,  0, 1,
        50, -100, -80, 1,      1, 0,  0, 1,

        0, 100, -60, 1,       1.0, 1.0,  0.4, 1,  // 黄色
        -50, -100, -60, 1,      1.0, 1.0,  0.4, 1,
        50, -100,-60, 1,      1.0, 1.0,  0.4, 1,

        0.0, 100, -35.0, 1,      0.4,  0.4, 1.0, 1,  // 蓝色
        -50, -100, -35.0, 1,     0.4,  0.4, 1.0, 1,
        50, -100, -35.0, 1,      0.4, 0.4, 1.0, 1,
    ]

    // 创建一个Float32Array类型的数组来存储顶点数据
    let pointPosition = new Float32Array(arr);

    // 获取顶点着色器中位置属性的位置
    let aPosition = webgl.getAttribLocation(webgl.program, "a_position");

    // 创建一个缓冲区对象
    let triangleBuffer = webgl.createBuffer();
    webgl.bindBuffer(webgl.ARRAY_BUFFER, triangleBuffer);
    webgl.bufferData(webgl.ARRAY_BUFFER, pointPosition, webgl.STATIC_DRAW);
    webgl.enableVertexAttribArray(aPosition);
    webgl.vertexAttribPointer(aPosition, 4, webgl.FLOAT, false, 8 * 4, 0);

    // 获取顶点着色器中颜色属性的位置
    let aColor = webgl.getAttribLocation(webgl.program, "a_color");
    webgl.enableVertexAttribArray(aColor);
    webgl.vertexAttribPointer(aColor, 4, webgl.FLOAT, false, 8 * 4, 4 * 4);

    // 初始化投影矩阵
    let ProjMatrix = glMatrix.mat4.create();
    glMatrix.mat4.identity(ProjMatrix);
    // 设置透视投影矩阵,参数为:矩阵、角度(转换为弧度)、宽高比、近剪裁面、远剪裁面
    glMatrix.mat4.perspective(ProjMatrix, angle * Math.PI / 180, webglDiv.clientWidth / webglDiv.clientHeight, 1, 1000);

    // 获取uniform变量u_formMatrix的位置
    let uniformMatrix1 = webgl.getUniformLocation(webgl.program, "u_formMatrix");

    // 初始化模型矩阵
    let ModelMatrix = glMatrix.mat4.create();
    glMatrix.mat4.identity(ModelMatrix);
    // 沿x轴平移模型
    glMatrix.mat4.translate(ModelMatrix, ModelMatrix, [180, 0, 0]);

    // 初始化视图矩阵
    let ViewMatrix = glMatrix.mat4.create();
    glMatrix.mat4.identity(ViewMatrix);
    // 设置视图矩阵,参数为:矩阵、相机位置、目标位置、上方向
    glMatrix.mat4.lookAt(ViewMatrix, [0, 0, 300], [0, 0, -90], [0, 1, 0]);

    // 计算模型视图矩阵
    let mvMatrix = glMatrix.mat4.create();
    glMatrix.mat4.multiply(mvMatrix, ViewMatrix, ModelMatrix);

    // 计算模型视图投影矩阵
    let mvpMatrix = glMatrix.mat4.create();
    glMatrix.mat4.identity(mvpMatrix);
    glMatrix.mat4.multiply(mvpMatrix, ProjMatrix, mvMatrix);
    // 将模型视图投影矩阵传递给着色器
    webgl.uniformMatrix4fv(uniformMatrix1, false, mvpMatrix);

    // 设置清除颜色为绿色,并清除颜色缓冲区
    webgl.clearColor(0.0, 1.0, 0.0, 1.0);
    // 清除颜色缓冲区和深度缓冲区
    webgl.clear(webgl.COLOR_BUFFER_BIT | webgl.DEPTH_BUFFER_BIT);
    // 启用深度测试
    webgl.enable(webgl.DEPTH_TEST);
    // 绘制三角形
    webgl.drawArrays(webgl.TRIANGLES, 0, 9);
}

深度冲突

            //隐藏面消除
            webgl.clear(webgl.COLOR_BUFFER_BIT|webgl.DEPTH_BUFFER_BIT);
            webgl.enable(webgl.DEPTH_TEST);
            // webgl.enable(webgl.POLYGON_OFFSET_FILL);
            webgl.drawArrays(webgl.TRIANGLES, 0, 3);
            // webgl.polygonOffset(1.0, 1.0);  
            webgl.drawArrays(webgl.TRIANGLES, 3, 6);
         

斑驳消除

            webgl.clear(webgl.COLOR_BUFFER_BIT);
            //隐藏面消除
            // webgl.clear(webgl.DEPTH_BUFFER_BIT);
            // webgl.enable(webgl.DEPTH_TEST);
            webgl.drawArrays(webgl.TRIANGLES, 0, 9);

 

复盘:

声明:本人素材学习来自于冰老师及官方文档!部分为自己理解注释冰哥图形学工作站的个人空间-冰哥图形学工作站个人主页-哔哩哔哩视频


http://www.kler.cn/a/403325.html

相关文章:

  • json-bigint处理前端精度丢失问题
  • Java中的TreeSet集合解析
  • SSRF漏洞利用
  • nginx 配置lua执行shell脚本
  • 网站推广实战案例:杭州翔胜科技有限公司如何为中小企业打开市场大门
  • SparkContext讲解
  • Vue 3 国际化 (i18n) 最佳实践指南
  • 基于Ruoyi的同一token跨系统访问,后端单点登录并且鉴权方案
  • 手机领夹麦克风哪个牌子好,哪种领夹麦性价比高,热门麦克风推荐
  • 基于大数据爬虫数据挖掘技术+Python的网络用户购物行为分析与可视化平台(源码+论文+PPT+部署文档教程等)
  • C语言和C++的不同
  • .net6.0(.net Core)读取 appsettings.json 配置文件
  • 在云服务器搭建 Docker
  • 音视频pts/dts
  • Python设计模式详解之5 —— 原型模式
  • 浪潮服务器硬件与配置监控指标解读
  • 【GL003】TCP/IP 协议
  • 【原创】java+ssm+mysql房屋租赁管理系统设计与实现
  • spring-logback引用外部文件
  • 使用Spring异步任务
  • Python软体中使用 Flask 或 FastAPI 搭建简单 RESTful API 服务并实现限流功能
  • 【金融风控项目-05】:信贷业务审批流程介绍
  • VUE 基础,初始VUE
  • 短视频矩阵矩阵,矩阵号策略
  • 【大数据测试 Elasticsearch 的标准--超详细篇】
  • 低速接口项目之串口Uart开发(一)——串口UART