WebGL开发:加载图片配准

简介: WebGL开发:加载图片配准

WebGL可以加载图片纹理,图片可以根据设定的坐标变化,设置图片的尺寸等等。

一般在加载图片的时候,关键的是设置图片的像素位置坐标,如下边的坐标形式,按照顺序排列图片的位置。
image.png
图片的像素位置设置好以后,设置图片的尺寸,默认可以根据图片的长和宽进行加载,当x1和y1是0,0的时候,从左上角进行图片的加载,要想离开一点可以将x1和y1值调大些。
image.png
WebGL的vertex-shader(顶点着色器)中,需要将屏幕坐标,变换成渲染空间的坐标,下边一段是从WebGL基础网站复制下的,直接可以用,上边有英文说明。

attribute vec2 a_position; 

            attribute vec2 a_texCoord; 

            uniform vec2 u_resolution; 

            varying vec2 v_texCoord;  

            void main() { 

        // convert the rectangle from pixels to 0.0 to 1.0  

         vec2 zeroToOne =  a_position / u_resolution;  

        // convert from 0->1 to 0->2 

        vec2 zeroToTwo = zeroToOne * 2.0; 

        // convert from 0->2 to -1->+1 (clipspace) 

        vec2 clipSpace = zeroToTwo - 1.0; 

        gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1); 

        // pass the texCoord to the fragment shader 

         // The GPU will interpolate this value between points.

         v_texCoord = a_texCoord;

                 }

WebGL的fragment-shader(片段着色器)中,我们只需要设置图片的颜色即可了,这也是参照webgl基础网站的代码。

precision mediump float; 

    // our texture 

    uniform sampler2D u_image;

    uniform vec2 u_res; 

       //the texCoords passed in from the vertex shader. 

        varying vec2 v_texCoord; 

    void main() 

    {  

             gl_FragColor = texture2D(u_image, v_texCoord);  

     }

当然说了以上这些,加载一张图片还是比较简单的,如果下边的背景是一个地图控件的话,如何让加载的图片和地图进行联动配准。

下边简要说一下思路:

一般地图都是按照web墨卡托进行切片的,第一级的切片尺寸是256*256,对应的经纬度范围是[-180,-90,180,90],根据这些我们就能换算第一级的时候,经纬度在第一级的切片像素位置,具体的算法参照以下的网址。

// -- converts latlon to pixels at zoom level 0 (for 256x256 tile size) , inverts y coord )

// -- source : http://build-failed.blogspot.cz/2013/02/displaying-webgl-data-on-google-maps.html

根据地图的四至范围,使用的是左上角的坐标,就能换算出来对应在第一级切片的像素位置。这样就能构建地图的变换矩阵translateMatrix,再根据地图的缩放级别,构建地图的缩放矩阵scaleMatrix,在地图发生变化的时候,往vertex-shader中传递矩阵,用矩阵和坐标进行相乘,就能使坐标发生变化,从而使图片进行覆盖变化。

gl_Position =u_matrix * a_position;

白色的图片是以半透明加载上去的,在地图移动时进行变化,半透明要改变shader中的颜色透明度。

gl_FragColor = vec4(floor(255.0 color 0.75) / 255.0);
image.png
webgl加载图片的效率也是相当高的,上边图片的大小是6M左右。

相关文章
|
存储 前端开发 JavaScript
three.js 纹理
纹理是添加到材料中的图像或颜色,以提供更多细节或美感。纹理是Three.js中必不可少的主题。在本节中,我们将了解如何将基本纹理应用于我们的材质。
108 0
|
前端开发
Threejs - 加载视频纹理渲染 实现一个3D视频播放器
Threejs - 加载视频纹理渲染 实现一个3D视频播放器
2150 0
Threejs - 加载视频纹理渲染 实现一个3D视频播放器
|
存储 编解码 缓存
webgl系列之抗锯齿和深度缓存
前言 大家好我是Fly 哥, 这是今年webgl 系列的第三篇文章, 如果你之前的两篇文章没看的话,建议先看一下,然后再来看这一篇文章 Webgl 系列之buffer的使用 webgl系列之对光栅化的理解 上一篇文章,任何虚拟3维世界的转换到二维屏幕中通过「采样」 也就判断屏幕上的每个像素中心点是不是在三角形内部的得到了 下面这幅图: 图片 走样之前 这时候有同学问, 这不像三角形哇, 这个其实用个专业的词—— 「锯齿」 , 我的理解 一个三角形经过光栅化后, 得到屏幕上每一个像素点 组成的像素点的集合。那到底是经过什么样的处理得到下面这张图: 图片 final 反走样 其实出现上面
webgl系列之抗锯齿和深度缓存
|
4月前
|
缓存 图形学
Unity3D学习笔记12——渲染纹理
Unity3D学习笔记12——渲染纹理
47 2
|
6月前
|
图形学
【实现100个unity特效之2】使用shader和shader Graph实现2d图片描边效果(附源码)
【实现100个unity特效之2】使用shader和shader Graph实现2d图片描边效果(附源码)
340 0
|
存储 异构计算
threejs实战_3d纹理
threejs加载3d纹理
213 0
threejs实战_3d纹理
|
前端开发 JavaScript
threejs实战_canvans纹理
threejs加载canvas纹理
162 0
|
编解码 数据可视化 图形学
webgl系列之对光栅化的理解
前言 周末没事的学习了光栅化进一步理解, 从底层去学习,遇到问题才会从容不迫, 并同时把这些知识分享给大家, 如果大家没时间看视频的话,废话不多说, 直接开始吧, 这里先做一个概念的铺垫在3D即将渲染到我们屏幕当中来的时候。而接下来我们要做的是把这个标准立方体绘制到屏幕上,这样才能最终被我们所看见。 不清楚的同学看下这篇文章吧 可视化入门跳转到坐标系转换那里 我们简单看下这张图: 图片 变换过程 而光栅化的过程发生在哪里 ,其实 就是物体通过MVP变换,把摄像机观测的空间压缩成了一个标准立方体。然后将标准的立方体【-,1,】绘制到屏幕上的这些过程 图片 转换 在做这步操作之前,我们首
webgl系列之对光栅化的理解
【ThreeJs】(1)四大组件:场景、相机、物体、渲染器 | 创建一个矩形 | THREE脑图
【ThreeJs】(1)四大组件:场景、相机、物体、渲染器 | 创建一个矩形 | THREE脑图
380 0
【ThreeJs】(1)四大组件:场景、相机、物体、渲染器 | 创建一个矩形 | THREE脑图
|
存储 缓存 算法
OpenGL图像渲染以及渲染问题解决方案
在绘制3D场景的时候,我们需要决定哪些部分是对观察者可见的,或者哪些部分是对观察者不可见的,对于不可见的部分,应该及早丢弃。例如在一个不透明的墙壁后,就不应该有渲染,这种情况叫做隐藏面消除(Hidden surface elimination).
637 0
OpenGL图像渲染以及渲染问题解决方案