webGL编程指南 第五章 TexturedQuad_Clamp_Mirror

这篇具有很好参考价值的文章主要介绍了webGL编程指南 第五章 TexturedQuad_Clamp_Mirror。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我会持续更新关于wegl的编程指南中的代码。

当前的代码不会使用书中的缩写,每一步都是会展开写。希望能给后来学习的一些帮助

git代码地址 :空

上一章节中我们学习了如何使用varyting变量绘制图片,本章节,我们学习texParameteri的使用文章来源地址https://www.toymoban.com/news/detail-740705.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport">
    <title>Document</title>
    <style>
        #canvas {
            width: 100vw;
            height: 100vw;
            border: 1px solid greenyellow;
        }
    </style>
</head>

<body>
    !!!!!需要指出的是要选择当前文件夹下的sky.jpg!!!!!!
    <!-- <input type="file" accept="image/*" onchange="loadFile(event)"> -->
    <input type="file" onchange="loadFile(event)">
    <canvas id="canvas"></canvas>
    <script>
        // let imgSrc = 'https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3740843900,2506868884&fm=15&gp=0.jpg.'
        let vexterSource = `
        precision mediump float;
        attribute vec4 a_Position;
        attribute vec2 a_TexCoord;
        varying   vec2 v_TexCoord;
        void main(){
            gl_Position = a_Position;//顶点坐标
            v_TexCoord = a_TexCoord;//纹理坐标系下的坐标
        }
    `
        let fragmentSource = `
        precision mediump float;
        uniform sampler2D u_Sampler;//纹理
        varying vec2      v_TexCoord;//纹理坐标系下的坐标
        void main(){
            gl_FragColor = texture2D(u_Sampler,v_TexCoord);
        }
    `
        let canvas = document.getElementById('canvas');
        let gl = canvas.getContext('webgl');

        //创建顶点着色器
        let vertextShader = gl.createShader(gl.VERTEX_SHADER);
        //给顶点着色器赋值
        gl.shaderSource(vertextShader, vexterSource);
        //编译顶点着色器
        gl.compileShader(vertextShader);

        //创建片元着色器
        let fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
        //给片元着色器赋值
        gl.shaderSource(fragmentShader, fragmentSource)
        //编译片元着色器
        gl.compileShader(fragmentShader)
        //检测着色器创建是否正确
        if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
            alert(gl.getShaderInfoLog(fragmentShader));
        }
        //创建程序
        let program = gl.createProgram();
        //给程序赋值
        gl.attachShader(program, vertextShader); 
        gl.attachShader(program, fragmentShader);
        //连接程序
        gl.linkProgram(program);
        //使用此着色器
        gl.useProgram(program);


        //变量的处理
        //获取顶点着色器中的变量a_Position
        let a_Position = gl.getAttribLocation(program, 'a_Position');
        //获取顶点着色器中的变量a_TexCoord
        let a_TexCoord = gl.getAttribLocation(program, 'a_TexCoord');
        //获取片元着色器中的变量u_Sampler
        let u_Sampler = gl.getUniformLocation(program, 'u_Sampler');
        //顶点坐标与纹理坐标
        let vertexTexCoords = new Float32Array([ 
            -0.5,0.5,-0.3,1.7,
            -0.5,-0.5,-0.3,-0.2,
            0.5,0.5,1.7,1.7,
            0.5,-0.5,1.7,-0.2
        ])
        let f32Seize = vertexTexCoords.BYTES_PER_ELEMENT;
        //给定点设置坐标 几何图形与纹理的坐标
        let vertexBuffer = gl.createBuffer();
        //绑定buffer
        gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
        //绑定数据
        gl.bufferData(gl.ARRAY_BUFFER, vertexTexCoords, gl.STATIC_DRAW);
        //给a_Position赋值
        gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, f32Seize * 4, 0);
        //使用此变量
        gl.enableVertexAttribArray(a_Position);
        //纹理坐标
        let texCoordBuffer = gl.createBuffer();
        //绑定buffer
        gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
        //绑定数据
        gl.bufferData(gl.ARRAY_BUFFER, vertexTexCoords, gl.STATIC_DRAW);
        //给a_TexCoord赋值
        gl.vertexAttribPointer(a_TexCoord, 2, gl.FLOAT, false, f32Seize * 4, f32Seize * 2);
        //使用此变量
        gl.enableVertexAttribArray(a_TexCoord);
        gl.clearColor(0, 0, 0, 1.0);
        //获取图片的素材 
        const loadFile = (event) => {
            var file = event.target.files[0];
            var reader = new FileReader();
            reader.onload = function (event) {
                // 文件里的文本会在这里被打印出来 
                let img = new Image();
                img.src = event.target.result;
                img.onload = () => {
                    let texture = gl.createTexture(); 
                    showImage(texture,img)
                }
            };
            reader.readAsDataURL(file);



        };
        function showImage(texture, img) { 
            document.body.appendChild(img)
            gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 1);
            //开始0号纹理通道
            gl.activeTexture(gl.TEXTURE0);
            //想目标绑定纹理对象
            gl.bindTexture(gl.TEXTURE_2D, texture);
            //配置纹理的参数
            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);
            //设置着色器参数
            gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, img);
            //设置纹理数据
            gl.uniform1i(u_Sampler, 0) 
            gl.clear(gl.COLOR_BUFFER_BIT);
            gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)
        }
    </script>
</body>

</html>

到了这里,关于webGL编程指南 第五章 TexturedQuad_Clamp_Mirror的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ Primer Plus第五章编程练习答案

    答案仅供参考,实际运行效果取决于运行平台和运行软件 1.编写一个要求用户输入两个整数的程序。该程序将计算并输出这两个整数之间包括这两个整数)所有整数的和。这里假设先输入较小的整数。例如,如果用户输入的是2和则程序将出29之间所有整数的和为44 2.使用array对

    2024年02月09日
    浏览(49)
  • 曲线艺术编程 coding curves 第五章 谐波图形(谐振图形) HARMONOGRAPHS

    原作:Keith Peters https://www.bit-101.com/blog/2022/11/coding-curves/ 译者:池中物王二狗(sheldon) blog: http://cnblogs.com/willian/ 源码:github: https://github.com/willian12345/coding-curves 曲线艺术编程系列第 5 章 这一篇幅建立在对第四章利萨茹曲线的讨论之上。事实上谐波图形并不是一类曲线,它是一

    2024年02月08日
    浏览(34)
  • Linux高性能服务器编程 学习笔记 第五章 Linux网络编程基础API

    我们将从以下3方面讨论Linux网络API: 1.socket地址API。socket最开始的含义是一个IP地址和端口对(ip,port),它唯一表示了使用TCP通信的一端,本书称其为socket地址。 2.socket基础API。socket的主要API都定义在sys/socket.h头文件中,包括创建socket、命名socket、监听socket、接受连接、发

    2024年02月07日
    浏览(53)
  • Liunx shell编程及自动化运维实现--第五章三剑客

    正则表达式(RE)是一种字符模式,用于再查找过程中匹配指定的字符,在大多数程序中,正则表达式都被置于两个正斜杠之间:例如//就是由正斜杠界定的正则表达式,他将匹配被查找的行中任何位置出现的相同模式。在正则表达式中,元字符时最重要的概念。 定义:元字

    2024年02月21日
    浏览(38)
  • webGL编程指南实战教程

    学习路线: 如果你是在校大学生,有足够的时间去学习:前端数学(几何+线性代数)图形学webglshader threejsthree.js源码 如果你是工作中使用,需要快速出产成品:前端threeJs。 教程主要分为四大部分: webgl容器(坐标系) webgl渲染管线 webgl关键名词 案例实战 在2D绘图环境中的

    2024年02月03日
    浏览(29)
  • 第五章:HTTP 协议

    HTTP(Hypertext Transport Protocol)协议;中文叫 超文本传输协议 ,是一个基于TCP/IP的应用层通信协议 这个协议详细规定了 浏览器 和万维网 服务器 之间互相通信的规则。 协议中主要规定了两个方面的内容: 客户端:用来向服务器发送数据,可以被称之为 请求报文 服务端:向客

    2024年04月26日
    浏览(23)
  • 第五章 数组

    🔥 博客主页 : 小羊失眠啦. 🔖 系列专栏 : C语言 🌥️ 每日语录 : 不怕路长,只怕志短。 ❤️ 感谢大家点赞👍收藏⭐评论✍️ 数组是一组相同类型元素的集合 ,但我们需要创建多个相同类型的变量时,只需要创建一个类型的数组,就相当于同时创建很多相同类型的变

    2024年02月15日
    浏览(33)
  • 第五章——动态规划1

    有N个·物品和容量是V的背包,每个物品有价值vi和权重(价值)wi属性,每件物品只能用一次(要么用0次,要么用1次),在背包能装得下的情况下,挑一部分物品装入背包,怎样挑才能保证这些物品的价值最大。 f(i,j)集合表示所有选法里面的最大值 f(N,V)表示从前N个物品选,

    2024年02月01日
    浏览(35)
  • 第五章——动态规划2

    像二维数组一样,设置行和列,只不过这里的列是斜着的,如圈出来的7,坐标可以表示为(4,2) 集合划分,所有路径可以分成俩类,某点左上方一类,右下方一类。 我们先把7去掉,左边计算的就是从起点到8路径的最大值,8的坐标是i-1,j-1,即左边状态可以表示为f[i-1,j-1]含义是

    2024年02月16日
    浏览(28)
  • linux第五章(系统维护)

    一。进程管理命令 1.ps命令:显示进程信息 2.pstree命令:以树状形式进行展示 3.top命令:查看进程信息 4.kill命令:结束某个进程 二。磁盘管理 1.lsblk:对磁盘的使用情况进行查看 2.df:查看占系统的多少数据 3.du:查看文件或者目录在磁盘的占用量,不是真实大小 4.fdisk:查看磁

    2024年01月19日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包