【WebGL初学系列之四】纹理三角

WebGL自学教程——WebGL示例:3. 纹理三角形 3. 纹理三角形       上章中的三角形虽然看起来比较鲜艳,但很多时候并不实用。我们想在三角形上显示一幅图片,或者更恰当点说,我们想让一张图片中和三角形对应的那一部分显示出来。这可以通过实用纹理图像来实现。这是本章的目的。     为了让WebGL可以访问我们指定图像数据,我们需要将图像数据保存到WebGL内部的纹理对象中。首先,我们要创建纹理对象,使用WebGL函数createText 阅读详情

nbcoders.com地址:http://nbcoders.com/webgl-chu-xue-xi-lie-zhi-si-ai.html

 前面已经给三角形添加了颜色,为了让其更加丰富多彩,我们这里继续向它添加纹理图片。在实际的应用当中,纹理的添加也比直接绘制颜色要多得多,因为添加纹理就可以让很多形状看起来更加逼真了,好吧,废话少说了,还是接着写。

一:添加纹理

   首先来看,我们要给三角形添加纹理,所以我们必须要先创建纹理。创建纹理首先得创建一个WebGL的纹理对象,然后将要显示的纹理绑定到纹理对象中。这里创建一个纹理的对象使用WebGL的createTexture()函数进行创建吗,返回一个纹理对象,紧接着用bindTexture将纹理对象进行绑定,最后,将数据拷贝到纹理。这里使用的WebGL API为 void texImage2D(GLenum target, GLint level, GLenum internalformat,GLenum format, GLenum type, HTMLImageElement image),具体函数的参数细节这里不多说了,可以去查查API。此函数的作用是将内存中的图片数据拷贝到纹理存储器中。代码如下:

                //创建一个纹理对象区间
                textObj = webgl.createTexture();
                //绑定文理对象
                webgl.bindTexture(webgl.TEXTURE_2D, textObj);
                //获得html中的原始图片
                var img = document.getElementById("texImg");
                //将图片数据拷贝到纹理中
                webgl.texImage2D(webgl.TEXTURE_2D, 0, webgl.RGB, webgl.RGB, webgl.UNSIGNED_BYTE, img);

二:渲染纹理

    接下来,就是需要看纹理是如何使用和渲染出来的。
    来看看,Shader程序如何编写。要将三角形绘制纹理,首先我们得对片段着色器进行处理,片段着色器中添加一个Uniform变量对纹理对象进行访问。通过uniform变量对其进行访问,需要知道uniform变量的关联索引。uniform变量管理索引由程序在链接时自动生成,我们通过getUniformLocation函数进行获取其索引。
    sampleTexIndex = canvas.getUniformLocation(shaderProgramObject, "sTexture");
    三角形要绘制纹理的位置当然由定点着色器决定,所以需要一个定点着色器算好后,通过varying变量传入片段着色器。但是纹理和渲染又不同,纹理坐标是左上角是(0,0)点右下角是(1, 1)点。设纹理坐标为(x1,y1),渲染坐标为(x2,y2),计算公式如下:
    x1= (x2 + 1.0)/2.0;
    y1= 1.0 - (y2 + 1.0)/2.0;
    所以,最后着色器的代码如下

       <script id="shader-vs" type="x-shader/x-vertex">
            attribute vec3 v3Position;
            varying vec2 vTexCood;
            void main()
            {
                vTexCood = vec2((v3Position.x+1.0)/2.0, 1.0-(v3Position.y+1.0)/2.0);
                gl_Position = vec4(v3Position, 1.0);
            }
        </script>
           
        <script id ="shader-fs" type ="x-shader/x-fragment">
            #ifdef GL_FRAGMENT_PRECISION_HIGH
                precision highp float;
            #else
                precision mediump float;
            #endif
            varying vec2 vTexCood;
            uniform sampler2D sTexture;
            void main()
            {
                gl_FragColor = texture2D(sTexture, vTexCood);
               // gl_FragColor = vec4(1.0,1.0,1.0, 1.0);
            }
        </script> 

    图像数据在纹理存储器中,在使用之前,要给其打上一个标示符。在片段着色器中通过整个纹理标识进行访问。当上标识之前必须激活标识。纹理单元为TEXTURE0,TEXTURE1,TEXTURE2...等等。纹理单元的数量还是有一定的限制,必须在getParameter(MAX_TEXTURE_IMAGE_UNITS)的返回值范围之内。
                //激活纹理标示0
                webgl.activeTexture(webgl.TEXTURE0);
                webgl.bindTexture(webgl.texImage2D, textObj);
                webgl.uniform1i(sampleTexIndex, 0);
 
三:完整代码 最后,给出完整代码
  <html>
 <head>
        <script type="text/javascript" src="../Js/InitWebGL.js"></script>
        <script id="shader-vs" type="x-shader/x-vertex">
            attribute vec3 v3Position;
            varying vec2 vTexCood;
            void main()
            {
                vTexCood = vec2((v3Position.x+1.0)/2.0, 1.0-(v3Position.y+1.0)/2.0);
                gl_Position = vec4(v3Position, 1.0);
            }
        </script>
 
        <script id ="shader-fs" type ="x-shader/x-fragment">
            #ifdef GL_FRAGMENT_PRECISION_HIGH
                precision highp float;
            #else
                precision mediump float;
            #endif
            varying vec2 vTexCood;
            uniform sampler2D sTexture;
            void main()
            {
                gl_FragColor = texture2D(sTexture, vTexCood);
               // gl_FragColor = vec4(1.0,1.0,1.0, 1.0);
            }
        </script>
 
        <script>
            var v3PositionIndex = 0;
            var sampleTexIndex = -1;
            var triangleBuffer = null;
            var triangleBuffer = null;
            var textObj = null;
 
            function initData(webgl)
            {
                //顶点坐标
                var jsArrayData = [
                     0.0, 1.0, 0.0,
                    -1.0, 0.0, -1.0,
                     1.0, 0.0, 0.0
                ]
 
                //创建一个webgl能够访问的缓冲
                triangleBuffer = webgl.createBuffer();
                //绑定buffer
                webgl.bindBuffer(webgl.ARRAY_BUFFER, triangleBuffer);
                //将js数据拷贝到buffer上
                webgl.bufferData(webgl.ARRAY_BUFFER, new Float32Array(jsArrayData), webgl.STATIC_DRAW);
 
                //创建一个纹理对象区间
                textObj = webgl.createTexture();
                //绑定文理对象
                webgl.bindTexture(webgl.TEXTURE_2D, textObj);
                //获得html中的原始图片
                var img = document.getElementById("texImg");
                //将图片数据拷贝到纹理中
                webgl.texImage2D(webgl.TEXTURE_2D, 0, webgl.RGB, webgl.RGB, webgl.UNSIGNED_BYTE, img);
 
            }
 
            function renderScene(webgl)
            {
                //清空屏幕
                webgl.clearColor(0.0, 0.0, 0.0, 1.0);
                webgl.clear(webgl.COLOR_BUFFER_BIT);
 
                //绑定顶点数据
                webgl.bindBuffer(webgl.ARRAY_BUFFER, triangleBuffer);
                //启动开关
                webgl.enableVertexAttribArray(v3PositionIndex);
                //制定数据索引原则
                webgl.vertexAttribPointer(v3PositionIndex, 3, webgl.FLOAT, false, 0, 0);
 
                //插值计算
                webgl.texParameteri(webgl.TEXTURE_2D, webgl.TEXTURE_MIN_FILTER, webgl.NEAREST);
                webgl.texParameteri(webgl.TEXTURE_2D, webgl.TEXTURE_MAG_FILTER, webgl.NEAREST);
                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);
 
                //激活纹理标示0
                webgl.activeTexture(webgl.TEXTURE0);
                webgl.bindTexture(webgl.texImage2D, textObj);
                webgl.uniform1i(sampleTexIndex, 0);
 
                //绘制数据
                webgl.drawArrays(webgl.TRIANGLES, 0, 3);
            }
 
            function init()
            {
                //获取webgl canvas
                var canvas = initCanvas("webglCanvas");
 
                //初始化shader程序
                var bind1 = [v3PositionIndex, "v3Position"];
                var bindData = new Array();
                bindData.push(bind1);
                var shaderProgramObject = initShaders(canvas, "shader-vs", "shader-fs", bindData);
 
                //获取Uniform变量在链接时生成的索引
                sampleTexIndex = canvas.getUniformLocation(shaderProgramObject, "sTexture");
                canvas.useProgram(shaderProgramObject);
 
                //初始化顶点数据
                initData(canvas);
 
                //渲染场景
                renderScene(canvas);
            }
        </script>
 </head>
 <body onload ="init()">
  <canvas id="webglCanvas" style="border:1px solid red" width="600" height="600"></canvas>
        <img id = "texImg" src="../Img/1.jpg" width="600" height="600"><img/>
 </body>
</html>>
四:效果展示

【WebGL初学系列之一】WebGl基础知识 在今年中,Web技术已经得到了巨大的发展,现在许多 阅读详情

相关推荐

【高频考点精讲】前端工程师必会的10种WebGL基础概念解析

🧑‍🏫:全栈老李📅:2025 年 5 月🧑‍💻:前端初学者、进阶开发者🚀:本文由全栈老李原创,转载请注明出处。最近在后台收到不少同学私信,说想系统学习WebGL但被各种晦涩概念劝退。作为在图形学领域摸爬滚打多年的"全栈老李",今天就用最接地气的方式带大家拆解WebGL的10个核心概念,保证你看完就能上手写3D效果!(文末有老李准备的面试彩蛋,评论区见~)

全栈老李的博客 1086

WebGL纹理贴图

WebGL纹理贴图 本文是WebGL电子书的1.12节内容 在实际的工程中创建三维场景往往会使用纹理贴图,简单地说就是把png、jpg等格式图片显示在WebGL三维场景中,比如一个产品的三维模型上贴一个商标。一张图片从数据结构的角度看, 文件中包含的信息就是和颜色缓冲区中的RGB或RGBA数据一样,.jpg格式图片数据包含RGB红绿蓝三个颜色分量,.png格式图片的数据除了RGB三个分量还包含透明...

u014291990的博客 4851

WebGL实例(001): 绘制三角形

原生WebGL API用于绘制图形时相对复杂,因为它要求你直接与GPU通信并管理顶点数据、着色器、纹理等。下面是一个使用原生WebGL API来绘制一个简单三角形的基本示例代码。这个例子假设你已经有了一个HTML页面,其中包含一个``元素。

大剑师兰特的GIS世界 1992

一起学 WebGL:绘制图片

大家好,我是前端西瓜哥。本文为系列文章中的一篇,请先阅读:纹理映射会根据纹理图像,将光栅化后的每个片元(像素点)设置对应颜色值。这些像素也称为。

fe_watermelon的博客 2098

初探WebGL和JavaScript

我们了解了WebGL的基本概念,包括画布、上下文、顶点和着色器,并通过一个简单的示例演示了如何使用WebGL绘制一个彩色的三角形。WebGL(Web Graphics Library)是一种基于JavaScript API的图形渲染技术,它可以让开发者在网页上实现高性能的3D图形和动画效果。上下文(Context):WebGL的上下文对象是一个用于操作WebGL图形渲染的接口,通过该接口可以设置渲染状态、绘制图形、处理纹理等。接下来,我们创建WebGL程序对象,并将顶点着色器和片元着色器附加到程序中。

syntax_api860的博客 241

基于WebGL的三维地球可视化项目实战

WebGL Earth 是一个基于 WebGL 技术实现的开源三维地球可视化框架,能够高效地在浏览器中渲染全球地形、地图数据及地理信息图层。其核心优势在于无需安装插件即可实现跨平台、高性能的三维地球展示,广泛应用于 GIS(地理信息系统)、城市规划、环境监测、虚拟旅游等领域。本项目基于 OpenGL ES 2.0 的 WebGL API,结合 JavaScript 和着色器语言(GLSL),实现了对地球模型的构建、纹理映射、光照渲染以及交互控制。

weixin_42163404的博客 797

webgl纹理贴图机制

在计算机图形学中,为了模拟更加真实的效果,需要给每个像素赋予不同的颜色值,这种情况下如果手动指定每个像素点的rgb值,将会是一件难以完成的任务。这就需要有一种机制,能够让我们把图片素材渲染到模型的一个或者多个表面上,这种机制叫做纹理贴图,本文将详细介绍在webgl中如何把一张真实图像贴到计算器图形上的。

qq_37987033的博客 3279

哨兵一号数据snap预处理_利用SNAP软件进行Sentinel-1A卫星微波影像的预处理

利用SNAP软件对雷达影像进行预处理,主要包括热噪声去除、轨道文件校正、辐射定标、滤波校正、多普勒地形校正,最终获得入射角和后向散射信息。数据:本次实验所用数据为哨兵一号(Sentinel-1A)干涉宽幅模式(Interferometric Wideswath,IW)下经过多视处理和地距转换的GRD格式产品一般处理流程如下:0 SNAP软件安装软件安装:安装成功后打开SNAP后如图所示:1 数据...

weixin_30000407的博客 1万+

WebGL之使用纹理

现在我们已经创建好了一个可以旋转的 3D 的立方体,接下来是时候使用贴图来代替每个面的单一的颜色了。

qq_35094120的博客 1914

SPSS27 paired t-test 中的Cohen’s D – Effect Size for T-Test

两组数据是相关的且是连续的。

moonlightpeng的博客 910

R语言dlnm包避坑指南:手把手教你配置交叉基矩阵(附温度分层与滞后多项式设置)

本文详细介绍了R语言dlnm包在配置交叉基矩阵时的实用技巧与避坑指南,特别针对温度分层与滞后多项式设置提供了具体参数配置建议。通过解析`crossbasis()`函数的核心参数、温度分析的分层策略以及不同基函数的适用场景,帮助研究者高效构建分布滞后非线性模型,避免常见错误并优化模型性能。

weixin_34094282的博客 403

WebGL 技术储备指南

WebGL 是 HTML 5 草案的一部分,可以驱动 Canvas 渲染三维场景。WebGL 虽然还未有广泛应用,但极具潜力和想象空间。本文是我学习 WebGL 时梳理知识脉络的产物,花点时间整理出来与大家分享。 示例 WebGL 很酷,有以下 demos 为证: 寻找奥兹国 赛车游戏 划船的男孩(Goo Engine Demo) 本文的目标 本文的预期读者是

多多 9075

N32串口DMA接收不定长数据:空闲中断与DMA通道的协同处理

本文详细解析了在N32系列MCU中,利用串口空闲中断与DMA通道协同处理不定长数据的核心机制与实战方法。通过剖析空闲中断的触发时机、DMA的配置要点以及两者协同工作的关键时序,提供了避免数据错乱的避坑指南和完整的代码实现,旨在帮助开发者构建高效、可靠的嵌入式串口通信子系统。

weixin_29191669的博客 125

开启 3D 之旅 - 你的第一个 WebGL 三角形

这篇教程介绍了如何在WebGL中绘制一个彩色三角形。文章首先解释了WebGL的基本概念,将其与Canvas、Three.js进行对比,强调学习底层WebGL的重要性。核心部分讲解了WebGL的渲染管线原理,重点介绍了顶点着色器和片元着色器的作用。教程提供了完整的HTML代码示例,包括创建canvas元素、编写GLSL着色器代码以及JavaScript胶水代码,实现了一个简单的三角形绘制。通过这个基础示例,读者可以理解WebGL的基本工作原理,为后续3D图形开发打下基础。

waws520的博客 1174

杰理SDK入门教程(五):按键使用配置

摘要 杰理SDK提供IO按键和AD按键两种方案。IO按键通过GPIO电平检测实现,配置时需要设置板级宏定义和硬件连接,默认使用PB1引脚。AD按键基于ADC电压采样,通过电阻分压区分按键,需配置功能使能、硬件通道和键值适配。按键功能通过修改SDK中的key_table文件实现。两种方案适用于不同硬件场景,开发者可根据需求选择。

qq_42014563的博客 777

把数字化转型真正落到组织里:读懂 SAP 的 OCM 六维框架

摘要: SAP的变革管理框架(OCM)强调数字化转型不仅是技术任务,更需关注组织与人的适应性。OCM包含六大维度:变革战略(明确方向与风险)、变革领导力(统一关键管理者行动)、变革沟通(分层传递信息)、变革实现(细化岗位级影响)、变革赋能(按角色设计培训)和变革有效性(持续评估)。该框架贯穿项目全周期,尤其在云项目中,需从早期规划变革策略,避免后期高代价调整。OCM的核心是将系统设计转化为组织语言,确保业务真正采纳新方式运作。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1437

webGL学习资料【AI】

学习WebGL是一个循序渐进的过程,从3D图形基础到高级着色器编程。以下是为你整理的。

qq_25757181的博客 1040

AI 智能体(Agent)应用开发工程师 · 进阶面试 (五)

在有多位 Agent 共同参与决策时(如评审委员会、代码审查小组),它们可能提出截然相反的建议。共识机制就是用来在这种冲突中得出唯一行动方案的规则。常用机制:多数投票:每个 Agent 一票,根据投票结果决定。实现简单,但忽略了专业度差异。加权投票:根据 Agent 的角色重要性或历史表现赋予不同权重,例如首席架构师 Agent 的票权重是普通开发者 Agent 的 2 倍。管理者仲裁:由一个权限更高的 Manager Agent 听取各方理由后做出最终裁决。这类似于层级制组织决策。辩论收敛。

篮球界最会写bug的人;程序猿中打球最菜的人。 397

WebGL技术储备指南

摘要:WebGL 是 HTML 5 草案的一部分,可以驱动 Canvas 渲染三维场景。WebGL 虽然还未有广泛应用,但极具潜力和想象空间。本文是我学习 WebGL 时梳理知识脉络的产物,花点时间整理出来与大家分享。 文章出处:http://www.open-open.com/news/view/1eb8555 WebGL 是 HTML 5 草案的一部分,可以驱动 Canva

LateChangce的博客 1157

9.6华为OD机试真题 新系统 - 少儿爬山闯关积分游戏 (Java/Py/C/C++/Js/Go)

2026 华为OD机试真题9月6日华为OD上机新系统考试真题 100 分题型。

算法大师! 861

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

mGBA倒带与录像回放完全指南:失误一键撤销,操作永久存档

mGBA 是功能扎实的 Game Boy 系列模拟器,其中两个实用功能值得每个玩家了解:倒带(Rewind,让你把游戏回退到刚才的状态)和录像回放(把按键操作存成可无限重放的文件)。下面带你用最少的步骤把它们用起来。 ## 🎬 两个功能各自解决什么麻烦 想象你在打一段需要精确跳跃的关卡,起跳晚了 0.5 秒,角色直接掉坑里。如果开了倒带,按住快捷键画面就会往回倒,失误前的场景原样出现,你立刻

gitblog_00852的博客 880

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

WebGL基础简明教程1-简介

我也是个初学WebGL的人,这部分的内容是我在看完《WebGL编程指南》一书后的精简教程。看完之后我对三维世界重建了一些观念,这篇文章是尽量在有限的内容中,一下介绍几个重要的基本的概念,后面我会分几篇再详细介绍几个重要的概念。WebGL是利用HTML5的canvas绘制和渲染三维图形,再现代的浏览器中均支持。WebGL是从OpenGL ES中继承过来的。代码存储在我的GitHub中。 https

前端-后端学习之路 1755

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

探索WebGL的奇妙世界:《WebGL编程指南》随书代码推荐

探索WebGL的奇妙世界:《WebGL编程指南》随书代码推荐 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 《WebGL编程指南》是一本深入浅出的WebGL技术指南,旨在帮助开发者掌握从基础到高级的WebGL编程技巧。为了更好地辅助读者学习和实践,本书的作者特别提供了随书代码仓库,包含了书中所有章节的代码示例。这些代码不仅可以帮助读者理解书中的理论知识,还能通过实际操...

gitblog_06558的博客 816

如何使用WebGL制作3D游戏

Three.js是一个基于WebGL的JavaScript 3D库,这本书介绍了如何使用Three.js进行WebGL游戏开发。这是一本免费的着色器编程书籍,可以通过网站进行在线阅读。对于WebGL游戏开发的进阶,可以学习一些高级的WebGL技术,例如着色器编程、高级渲染技术等等。3. Three.js:一个基于WebGL的JavaScript 3D库,可以让您更轻松地创建和渲染3D场景。4. WebGL Academy:一个提供在线课程和教程的网站,可以帮助您学习WebGL的基础知识和高级技术。

m0_75198698的博客 562

掌握WebGL图形学:ICG-WebGL项目实战指南

ICG-WebGL是基于《交互式计算机图形学——基于WebGL的自顶向下方法(第七版)》教材的现代WebGL学习项目,为计算机图形学开发者和学习者提供了一套完整的WebGL编程实践体系。该项目重构了官方示例代码,采用现代前端开发工具链,包含12个章节的完整示例和练习题实现,帮助开发者从零构建WebGL图形渲染技能。 ## 项目概览:现代WebGL学习框架 ICG-WebGL项目不仅是一个代码库

gitblog_00079的博客 613

[转]WebGL中文教程

本文转自:http://www.hiwebgl.com/?p=42   WebGL中文教程 Lesson 0 从零开始Lesson 1 三角与方块的故事Lesson 2 添加颜色Lesson 3 动起来!Lesson 4 真正的3D物体Lesson 5 引入纹理Lesson 6 键盘输入和纹理过滤Lesson 7 平行光和环境光Lesson 8 深度缓存、透明度和混合Lesson 9 优化代...

weixin_34037173的博客 177
上一篇: 【WebGL初学系列之三】闪烁的颜色三角形
下一篇: 图像之魔棒工具实现
ixshells
博客等级 码龄14年 10粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值