WebGL入门(029):WEBGL_depth_texture 简介、使用方法、示例代码

news2024/12/23 13:40:26

还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,echarts等技术开发,欢迎加底部微信(gis-dajianshi),一起交流。

No.内容链接
1Openlayers 【入门教程】 - 【源代码+示例300+】
2Leaflet 【入门教程】 - 【源代码+图文示例 150+】
3Cesium 【入门教程】 - 【源代码+图文示例200+】
4MapboxGL【入门教程】 - 【源代码+图文示例150+】
5前端就业宝典 【面试题+详细答案 1000+】

在这里插入图片描述

文章目录

      • WEBGL_depth_texture 简介
      • 使用方法
      • 示例代码
      • 注意事项
      • 结论


在WebGL中,WEBGL_depth_texture扩展提供了一种方式来将深度缓冲区的内容作为纹理进行采样。这使得开发者能够在着色器中访问深度值,从而实现一些高级效果,比如阴影贴图、后处理效果等。

WEBGL_depth_texture 简介

WEBGL_depth_texture扩展为WebGL添加了一个新的纹理格式,允许将深度缓冲区的值作为纹理进行读取。这在许多渲染技术中都非常有用,尤其是那些需要访问深度信息的技术,如阴影计算、反射、折射等。

使用方法

使用WEBGL_depth_texture扩展的一般步骤如下:

  1. 检测扩展:首先确保浏览器支持该扩展。
  2. 创建纹理:使用createTexture方法创建纹理。
  3. 设置纹理参数:使用texParameteri方法设置纹理参数,指定纹理格式为深度格式。
  4. 绑定深度纹理:使用bindTexture方法绑定纹理。
  5. 从深度缓冲区复制数据到纹理:使用readPixelscopyTexImage2D方法将深度缓冲区的内容复制到纹理中。
  6. 在着色器中使用深度纹理:在着色器中通过texture2D函数访问深度纹理。

示例代码

下面是一个使用WEBGL_depth_texture扩展查询深度纹理的基本示例:

const canvas = document.getElementById('my-canvas');
const gl = canvas.getContext('webgl2', { antialias: true });

// 检测扩展
const depthTexture = gl.getExtension('WEBGL_depth_texture');

if (!depthTexture) {
  console.error('Depth texture extension not supported.');
  return;
}

// 创建深度纹理
const depthTextureId = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, depthTextureId);

// 设置纹理参数
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
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.readPixels(0, 0, canvas.width, canvas.height, gl.DEPTH_COMPONENT, gl.UNSIGNED_INT, null);

// 在着色器中使用深度纹理
const fragmentShaderSource = `
  precision mediump float;
  uniform sampler2D u_depthTexture;
  void main() {
    float depth = texture2D(u_depthTexture, gl_FragCoord.xy / ${canvas.width}).r;
    gl_FragColor = vec4(depth, depth, depth, 1.0);
  }
`;

const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderSource);
gl.compileShader(fragmentShader);

// 创建并链接着色器程序
const shaderProgram = gl.createProgram();
gl.attachShader(shaderProgram, fragmentShader);
gl.linkProgram(shaderProgram);
gl.useProgram(shaderProgram);

// 设置着色器中的深度纹理
const depthTextureLocation = gl.getUniformLocation(shaderProgram, 'u_depthTexture');
gl.uniform1i(depthTextureLocation, 0);

// 绑定深度纹理到纹理单元0
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, depthTextureId);

// 渲染场景
gl.drawArrays(gl.TRIANGLES, 0, 3); // 假设已经设置了顶点数据

注意事项

  • 确保在使用深度纹理之前已经正确设置了深度缓冲区。
  • 在着色器中使用深度纹理时,通常需要将纹理坐标归一化到[0, 1]范围内。
  • 由于浏览器和设备支持情况的不同,你应该始终检查扩展是否可用。

结论

使用WEBGL_depth_texture扩展可以方便地获取WebGL深度缓冲区的内容,并将其作为纹理进行采样。这对于实现高级渲染效果非常有用,如阴影贴图、后处理效果等。然而,由于浏览器和设备支持情况的不同,你应该始终检查扩展是否可用,并且不要在生产环境中直接暴露敏感信息给用户。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2130851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Machine Learning: A Probabilistic Perspective 机器学习:概率视角 PDF免费分享

下载链接在博客最底部!! 之前需要参考这本书,但是大多数博客都是收费才能下载本书。 在网上找了好久才找到免费的资源,浪费了不少时间,在此分享以节约大家的时间。 链接: https://pan.baidu.com/s/1erFsMcVR0A_xT4fx…

Harmony Next 文件命令操作(发送、读取、媒体文件查询)

查询文件位置 hdc shell mediatool query IMG_20240902_204224.jpg 输出示例 拉取文件 hdc file recv /storage/cloud/100/files/Photo/4/IMG_1725281044_036.jpg aa.jpg 发送文件 hdc file send aa.jpg /storage/media/100/local/files/Docs/Download/ab.jpg 下载目录位置…

Qt信号和槽【1】

文章目录 信号和槽概念connect函数自定义信号和槽自定义槽自定义信号 信号和槽概念 在Linux当中有信号signal,是系统内部的通知机制,也可以认为是进程的通知机制。这里需要注意三要素: 信号源:谁发的信号信号的类型:…

耗时一个月,我做了一个网页视频编辑器

最近又肝了一个多月,终于把这个网页视频编辑器做好了,下面我来简单介绍一下如何使用 注意目前该功能还处在测试阶段,可能会有很多问题,后续我会不断修复 体验地址 app.zyjj.cc 界面介绍 整个剪辑界面包括4个区,左边是…

Java毕业设计选题推荐之基于SpringBoot+Vue的校园互助帮平台【提供源码+答辩PPT+参考文档+项目部署】

🚩如何选题? 如何选题、让题目的难度在可控范围,以及如何在选题过程以及整个毕设过程中如何与老师沟通,这些问题是需要大家在选题前需要考虑的,具体的方法我会在文末详细为你解答。 🚭如何快速熟悉一个项目…

Ubuntu 下载软件包时,提示 但是它将不会被安装E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。

解决办法: 打开 软件和更新 先更新一下: sudo apt-get update 接下来再次安装你需要的软件包,例如: sudo apt install libsdl2-dev

C++奇迹之旅:快速上手Priority_queue的使用与模拟实现

文章目录 📝priority_queue的介绍和使用🌠 priority_queue的介绍🌉priority_queue的使用 🌠仿函数的使用🌠C语言有趣的模仿push_back🌠priority_queue的模拟实现🚩总结 📝priority_q…

小型企业如何利用人工智能的生产力

尽管生产力低下是一个长期存在的问题,但最近严峻的经济逆风加剧了这一问题,企业清算数量同比增长了 19%。 Xero 的报告《小企业生产力:趋势、影响和战略》反映了这些宏观经济变化,显示 2023 年新西兰小企业生产力与 …

水平仪激光模组热了就不亮了怎么维修?

在建筑施工、装修设计或是精密测量等领域,水平仪作为不可或缺的工具,其准确性和稳定性直接关乎到工作的质量与效率。然而,许多用户在使用过程中会遇到这样一个问题:水平仪的激光模组在长时间使用或环境温度升高后,突然…

模拟实现通用型排序

本期介绍🍖 主要介绍:什么是泛型排序,即:无类型排序,以及库函数qsort()的使用,以及如何自己模拟实现一个泛型的冒泡排序。 文章目录 1. 什么是通用型排序2. 库函数qsort()2.1 定义2.2 使用 3. 模拟实现通用…

828华为云征文|部署多媒体流媒体平台 Plex

828华为云征文|部署多媒体流媒体平台 Plex 一、Flexus云服务器X实例介绍1.1 云服务器介绍1.2 性能模式1.3 计费模式 二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Plex3.1 Plex 介绍3.2 Docker 环境搭建3.3 Plex 部署3.4 Plex 使…

Apple M3编译OpenSSL安卓平台SO库

1.下载OpenSSL源码: https://github.com/openssl/openssl.git 2.配置NDK环境变量:vim ~/.zprofile 添加ANDROID_NDK_ROOT环境变量,iosdev改为你自己的用户名 export ANDROID_NDK_ROOT=/Users/iosdev/Library/Android/sdk/ndk/23.1.7779620 添加NDK下可执行文件路径到PATH环…

Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)

导航: 【Java笔记踩坑汇总】Java基础JavaWebSSMSpringBootSpringCloud瑞吉外卖/谷粒商城/学成在线设计模式面试题汇总性能调优/架构设计源码解析 推荐视频: 黑马程序员全套Java教程_哔哩哔哩 尚硅谷Java入门视频教程_哔哩哔哩 推荐书籍: 《Ja…

ubuntu2204安装kvm

ubuntu2204安装kvm 前言一、检测硬件是否支持二、安装软件三、创建/管理虚拟机1、创建存储池2、qemu创建镜像3、xml文件运行虚拟机1、范文2、xml文件创建虚机3、创建虚机 4、克隆虚机5、创建快照6、脚本创建VNC连接 四、创建集群1、安装glusterfs2、加入集群删除节点 3、 创建卷…

EasyExcel 动态表头+表头合并

EasyExcel 动态表头表头合并 ​ 最终呈现效果: ​ 以前对EasyExcel的使用都是一个实体类字段对应一列,通过以下来一一对应即可。 ExcelProperty(index 0,value "姓名" ) private String xm;​ 所以此中出现的两个问题: 表头合并…

【LeetCode每日一题】——LCR 168.丑数

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目注意】六【题目示例】七【题目提示】八【解题思路】九【时间频度】十【代码实现】十一【提交结果】 一【题目类别】 优先队列 二【题目难度】 中等 三【题目编号】 LCR 168.丑数 四【题目描述…

多输入多输出 | Matlab实现SO-BP蛇群算法优化BP神经网络多输入多输出预测

多输入多输出 | Matlab实现SO-BP蛇群算法优化BP神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现SO-BP蛇群算法优化BP神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现SO-BP蛇群算法优化BP神经网络多输…

1688竞品分析这样做,超越电商同行,流量想不爆都难!

竞品分析最大的意义就是知己知彼!清楚自己所在的位置,取长补短,确定下一阶段打法和方向。那么该怎么做竞品分析? 我们利用店雷达1688工具进行实操讲解,分别从竞品目标、价格机制、流量结构,3个方面教你迅速…

uniapp 做一个查看图片的组件,图片可缩放移动

因为是手机端,所以需要触摸可移动,双指放大缩小。 首先在components里建个组件 查看图片使用 uni-popup 弹窗 要注意 transform的translate和scale属性在同一标签上不会一起生效 移动就根据触摸效果进行偏移图片 缩放就根据双指距离的变大变小进行缩…

前端练习小项目 —— 养一只电子蜘蛛

前言:在学习完JavaScript之后,我们就可以使用JavaScript来实现一下好玩的效果了,本篇文章讲解的是如何纯使用JavaScript来实现一个网页中的电子蜘蛛。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-C…