webGL进阶(一)多重纹理效果

news2024/11/18 14:47:10

效果:

代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>绘制多重纹理(漂浮的云)</title>
    <script src="glMatrix-0.9.6.min.js"></script>
    <script>
        let vertexstring = `
        attribute vec4 a_position;
        uniform   mat4    proj;
        attribute vec2 outUV;
        varying vec2 inUV;
        void main(void){
            gl_Position =  a_position;
            inUV = outUV;
        }
        `;
        let fragmentstring = `
        precision mediump float;
        uniform sampler2D texture;
        uniform sampler2D texture1;
        uniform float anim;
        varying vec2 inUV;
        void main(void){
          vec4 color1 =texture2D(texture,inUV);
          vec4 color2 =texture2D(texture1, vec2(inUV.x + anim, inUV.y));

          gl_FragColor = color1;
        }
        `;
        var projMat4 = mat4.create();
        var webgl;
        var uniformTexture = 0;
        var uniformTexture1 = 0;
        var uniformAnim = 0;
        var count = 0;
        var texture0;
        var texture1;
        function webglStart() {
            init();
            tick();
        }
        function tick() {
            requestAnimFrame(tick)
            draw();
        };
        function init() {
            initWebgl();
            initShader();
            initBuffer();

        }
        function initWebgl() {
            let webglDiv = document.getElementById('myCanvas');
            webgl = webglDiv.getContext("webgl");
            webgl.viewport(0, 0, webglDiv.clientWidth, webglDiv.clientHeight);
            mat4.ortho(0, webglDiv.clientWidth, webglDiv.clientHeight, 0, -1.0, 1.0, projMat4)
        }
        function initShader() {

            let vsshader = webgl.createShader(webgl.VERTEX_SHADER);
            let fsshader = webgl.createShader(webgl.FRAGMENT_SHADER);

            webgl.shaderSource(vsshader, vertexstring);
            webgl.shaderSource(fsshader, fragmentstring);

            webgl.compileShader(vsshader);
            webgl.compileShader(fsshader);
            if (!webgl.getShaderParameter(vsshader, webgl.COMPILE_STATUS)) {
                var err = webgl.getShaderInfoLog(vsshader);
                alert(err);
                return;
            }
            if (!webgl.getShaderParameter(fsshader, webgl.COMPILE_STATUS)) {
                var err = webgl.getShaderInfoLog(fsshader);
                alert(err);
                return;
            }
            let program = webgl.createProgram();
            webgl.attachShader(program, vsshader);
            webgl.attachShader(program, fsshader)

            webgl.linkProgram(program);
            webgl.useProgram(program);

            webgl.program = program
        }
        function initBuffer() {
            let arr = [
                -0.5, -0.5, 0, 1,      0, 0,
                -0.5, 0.5, 0, 1,       0, 1,
                0.5, 0.5, 0, 1,         1, 1,
                0.5, -0.5, 0, 1,        1, 0,


              
            ]
            let index = [
                0, 1, 2,
                2, 0, 3
            ];
            let pointPosition = new Float32Array(arr);
            let aPsotion = 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(aPsotion);
            webgl.vertexAttribPointer(aPsotion, 4, webgl.FLOAT, false, 6 * 4, 0);

            let uniformProj = webgl.getUniformLocation(webgl.program, "proj");
            webgl.uniformMatrix4fv(uniformProj, false, projMat4);

            attribOutUV = webgl.getAttribLocation(webgl.program, "outUV");
            webgl.enableVertexAttribArray(attribOutUV);
            webgl.vertexAttribPointer(attribOutUV, 2, webgl.FLOAT, false, 6 * 4, 4 * 4);

            let indexarr = new Uint8Array(index)
            let indexBuffer = webgl.createBuffer();
            webgl.bindBuffer(webgl.ELEMENT_ARRAY_BUFFER, indexBuffer);
            webgl.bufferData(webgl.ELEMENT_ARRAY_BUFFER, indexarr, webgl.STATIC_DRAW);


            uniformTexture = webgl.getUniformLocation(webgl.program, "texture");
            uniformTexture1 = webgl.getUniformLocation(webgl.program, "texture1");

            texture1 = initTexture("fog.png");
            texture0 = initTexture("山水图像纹理映射.png");
        

        }
        function handleLoadedTexture(texture) {
            webgl.bindTexture(webgl.TEXTURE_2D, texture);
            webgl.pixelStorei(webgl.UNPACK_FLIP_Y_WEBGL,666);
         
            
            webgl.texImage2D(webgl.TEXTURE_2D, 0, webgl.RGBA, webgl.RGBA, webgl.UNSIGNED_BYTE, texture.image);
            webgl.texParameteri(webgl.TEXTURE_2D, webgl.TEXTURE_MAG_FILTER, webgl.LINEAR);
            webgl.texParameteri(webgl.TEXTURE_2D, webgl.TEXTURE_MIN_FILTER, webgl.LINEAR);
            webgl.texParameteri(webgl.TEXTURE_2D, webgl.TEXTURE_WRAP_S, webgl.CLAMP_TO_EDGE);
            webgl.texParameteri(webgl.TEXTURE_2D, webgl.TEXTURE_WRAP_T, webgl.CLAMP_TO_EDGE);


        }
        function initTexture(imageFile, num) {
            let textureHandle = webgl.createTexture();
            textureHandle.image = new Image();
            textureHandle.image.src = imageFile;
            textureHandle.image.onload = function () {
                handleLoadedTexture(textureHandle, num)
            }
            return textureHandle;
        }
        function draw() {
            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);



            //纹理变动
            uniformAnim = webgl.getUniformLocation(webgl.program, "anim");
            count = count + 0.01;
            webgl.uniform1f(uniformAnim, count);
            webgl.activeTexture(webgl.TEXTURE0);
            webgl.bindTexture(webgl.TEXTURE_2D, texture0);
            webgl.uniform1i(uniformTexture, 0);

            webgl.activeTexture(webgl.TEXTURE1);
            webgl.bindTexture(webgl.TEXTURE_2D, texture1);
            webgl.uniform1i(uniformTexture1, 1);





            webgl.drawElements(webgl.TRIANGLES, 6, webgl.UNSIGNED_BYTE, 0);
        }
        window.requestAnimFrame = (function () {
            return window.requestAnimationFrame ||
                window.webkitRequestAnimationFrame ||
                window.mozRequestAnimationFrame ||
                window.oRequestAnimationFrame ||
                window.msRequestAnimationFrame ||
                function (callback, element) {
                    window.setTimeout(callback, 1000 / 60);
                };
        })();
    </script>
</head>

<body onload="webglStart()">
    <canvas id='myCanvas' width="1024" height='1000'></canvas>
</body>

</html>

复盘:

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

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

相关文章

[JAVA]连接数据库 并在Java中实现查询员工信息功能

在进行这些操作之前&#xff0c;我们需要先了解JDBC入门&#xff0c;JDBC是一种用于执行SQL语句的JavaAPL&#xff0c;可以为多种关系数据库提供统一访问。 一&#xff0c;主要作用 1.连接数据库 允许Java程序与各种不同的数据库建立连接。无论使用的是MySQL&#xff0c;Ora…

高效开发,低代码平台如何助力构建内部工具

Zoho Creator是低代码平台&#xff0c;助力快速构建内部工具&#xff0c;如审批、订单、销售管理等&#xff0c;提升生产力、客户满意度&#xff0c;并减轻管理负担。平台提供拖放界面、集成数据库等功能&#xff0c;入选Gartner低代码平台“魔力象限”。 一、什么是内部工具&a…

免杀对抗—GOC#反VT沙盒资源分离混淆加密

前言 今天的主要内容是反VT沙盒&#xff0c;我们都知道生成的后门会被杀软上穿到沙盒中去运行&#xff0c;去逆向。如此一来我们的后门就很容易被查杀掉&#xff0c;但如果我们对后门进行一些操作&#xff0c;让它在被逆向的时候&#xff0c;反编译出一堆乱码&#xff0c;或者…

(接口测试)接口测试理论 http理论 接口测试流程 接口文档解析

一.接口测试理论 1.接口和接口测试 服务器为客户端开了一个验证接口&#xff08;接口本质&#xff1a;函数方法&#xff09;客户端向服务器传送的消息可以相当于函数的参数&#xff0c;接口是用来让客户端传递数据的 接口&#xff1a;相当于开了一个通道 当服务器要给客户端响…

用setnx实现一个分布式锁

用setnx实现一个分布式锁 简介 利用Redis的单线程特性&#xff0c;在多个Redis客户端同时通过SETNX命令尝试获取锁&#xff0c;如果返回1表示获取锁成功&#xff0c;否则表示获取锁失败。 Redis Setnx&#xff08;SET if Not eXists&#xff09; 命令在指定的 key 不存在时&…

基于SSM的车库智能管理平台设计与实现【附源码】

基于SSM的车库智能管理平台设计与实现&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统概要设计 4.2 系统功能结构设计 4.3 数据库设计 4.3.1 数据库E-R图设计 4.3.2 数据库表结构设计 5 系统实现 5.1用户信息管理 5.2 车…

腾讯云SDK地址生成器

音视频终端 SDK&#xff08;腾讯云视立方&#xff09;将新版连麦管理方案的多个功能集成至 腾讯云视立方控制台 > 连麦管理&#xff0c;便于用户快捷使用&#xff0c;具体分为快速上手、连麦应用、用量统计和地址生成器四个功能页面。更多连麦功能说明&#xff0c;请参见 新…

YOLO11 实例分割模型做行人分割

实例分割是检测和隔离图像中单个对象的关键技术,YOLO11 是执行这项任务的最佳模型之一。在本文中,你将学习如何使用 YOLO11 分割模型有效地在图像中分割人物。我们将涵盖从设置 Python 环境和安装必要的库,到下载测试图像和可视化分割结果的所有内容。通过本教程的学习,你将…

pandas的用法

1.简介&#xff1a; pandas是一个开源的python数据分析库提供了快速&#xff0c;灵活和表达力强的数据结构&#xff0c;使数据清洗和分析工作变得更加简单易行。pandas的核心数据结构是DataFrame和Series 2.DataFrame的基本操作&#xff1a; DataFrame是pandas库中的一个二维…

WebAPI的初步认识

这里局限于Asp.net core Web API。 简单一句话&#xff0c;就是webApi支持我们专注于数据&#xff0c;返回值可以直接返回对象。且支持RestFul风格的编程。RestFul编程就是 资源&#xff08;Resource&#xff09;&#xff1a;将所有的数据和功能都视为资源&#xff0c;每个资源…

Passolo使用教程

作用&#xff1a;汉化软件 Passolo下载地址&#xff1a;https://www.xitongzhijia.net/soft/236115.html 使用步骤 1&#xff1a;新建 2&#xff1a;添加来源 -> 找到需要汉化的exe文件 3&#xff1a;目标语言 -> 添加语言 -> 简体中文 4&#xff1a;名称 -> 自定…

【数据结构】栈和队列 + 经典算法题

目录 前言 一、栈 二、栈的实现 三、栈的循环遍历演示 四、栈的算法题 // 一、队列 二、队列的实现 三、使用演示 四、队列的算法题 总结 前言 本文完整实现了栈和队列的数据结构&#xff0c;以及栈和队列的一些经典算法题&#xff0c;让我们更加清楚了解这两种数据…

W外链平台有什么优势?

W外链作为一种短网址服务&#xff0c;具备多项功能和技术优势&#xff0c;适用于多种场景&#xff0c;以下是其主要特点和优势&#xff1a; 短域名与高级设置&#xff1a;W外链提供了非常短的域名&#xff0c;这有助于提高用户体验&#xff0c;使其在社交媒体分享时更加便捷。…

GNURadio 平台实现拦阻干扰

信号流图如下&#xff1a; 先用带通滤波器截取一段噪声信号源的频谱&#xff0c;流图中为100khz-500khz&#xff0c;带宽为400kHz&#xff0c;再进行调制搬移到期望的信号频率上&#xff0c;流图中为2MHz上。 仿真结果信号频谱图如下所示&#xff1a; 假设被干扰的目标信号为A…

Java基础入门:从人机交互到Java核心概述

掌握CMD与Java开发环境&#xff1a;从基础到实战的全面指南 在当今数字化时代&#xff0c;计算机操作和编程技能已成为不可或缺的基础能力。无论你是刚刚迈入编程世界的新手&#xff0c;还是希望提升自己技术水平的开发者&#xff0c;了解如何高效使用命令行工具&#xff08;如…

接着上一篇stp 实验继续

理论看上一篇&#xff0c;我们直接实验 首先找出&#xff52;&#xff4f;&#xff4f;&#xff54; 桥 很明显 &#xff53;&#xff57;&#xff11; 为&#xff52;&#xff4f;&#xff4f;&#xff54; 桥&#xff0c;所谓&#xff53;&#xff57;&#xff11;  &a…

IDEA上Mybatis介绍和使用

MyBatis是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发。 创建项目 在springboot项目中添加Mybatis和MySQL依赖项。 找到数据库选项&#xff0c;点击新建 -> 数据库源&#xff0c;选择MySQL。 输入完成信息后&#xff0c;可以先进行测试&#xff0c;可以成功连接再…

影刀RPA在智能客服上的运用

随着人工智能技术的不断发展&#xff0c;智能客服系统逐渐成为企业提升服务效率和质量的重要工具。影刀RPA&#xff08;Robotic Process Automation&#xff0c;机器人流程自动化&#xff09;作为一种模拟人类用户行为的技术&#xff0c;通过自动化执行重复性高、规则明确的任务…

2024年MathorCup国家级大数据竞赛,必须要知道的竞赛重点!

2024年MathorCup大数据竞赛正在报名中&#xff0c;在越来越多同学报名参赛的同时&#xff0c;也有非常多的同学来咨询比赛相关问题。 01 比赛的级别是什么&#xff1f; 比赛主办方是中国优选法统筹法与经济数学研究会&#xff08;国家一级学会&#xff09;&#xff0c;因此一…

架构设计笔记-7-系统架构设计基础知识

目录 知识要点 单选 案例分析 1.质量属性 / 管道过滤器 / 数据仓库风格 2.面向对象风格 / 控制环路风格 3.软件架构风格 / 架构风格选择 4.体系结构方案对比 5.面向对象风格 / 基于规则风格 6.解释器风格 / 管道过滤器风格 7.面向对象风格 / 解释器风格 8.软件架构复…