WebGL之点精灵的旋转(Rotation Sprite)

本文介绍如何在WebGL中实现点上的纹理旋转效果。通过修改顶点坐标并使用旋转矩阵操作gl_PointCoord来达到目的。提供了包含顶点着色器和片元着色器的完整代码示例。
上一篇已经把WebGL如何在点(Point)上添加图片进行了说明,并且直接提供了源代码,理解起来应该不难;
矩形上面添加纹理,我们都知道是可以旋转的,那么点上面添加的纹理能不能进行旋转呢?答案是肯定的
我们只需要建立一个旋转矩阵,这个旋转直接去操作Shader里面的gl_PointCoord,这样就能达到旋转纹理的目的;
//顶点着色器
var
VSHADER_SOURCE =[ "attribute vec4 a_Position;", "uniform mat4 u_ProjMatrix;", "uniform float u_PointSize;", "void main() {", " gl_PointSize = u_PointSize;", " gl_Position = u_ProjMatrix * a_Position;", "}" ].join("\n")
//片元着色器
var FSHADER_SOURCE = [ 'precision mediump float;', "uniform sampler2D u_Sampler;", "uniform float u_Angle" "void main() {", " float x=gl_PointCoord.x-0.5;",//将顶点坐标进行偏移,使得旋转中心点位于(0.5,0.5) " float y=gl_PointCoord.y-0.5;",//将顶点坐标进行偏移,是的旋转中心点位于(0.5,0.5)
    " float nx=(cos(u_Angle) * x - sin(u_Angle ) * y);",//对x的旋转后的值
    
" float ny = (sin( u_Angle ) * x + cos( u_Angle ) * y);",//对y的旋转后的值

    
" gl_FragColor = texture2D( u_Sampler, vec2( nx+0.5,ny+0.5) );", //获取图片颜色

"}"
].join(
"\n")

function main() {

var canvas = document.getElementById('webgl');

var gl = getWebGLContext(canvas);

if (!gl) {
  console.log(
'Failed to get the rendering context for WebGL');

  return;
}

if (!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) {
  console.log(
'Failed to intialize shaders.');
  
return;
}

var projMatrix4=new Matrix4();
projMatrix4.setOrtho(
-1,1,-1,1,0.0,1.0);

var u_projMatrix=gl.getUniformLocation(gl.program,'u_ProjMatrix');
gl.uniformMatrix4fv(u_projMatrix,
false,projMatrix4.elements);

var u_Angle=gl.getUniformLocation(gl.program,'u_Angle');
gl.uniform1f(u_Angle,
3.14*0.25);

var position=gl.getAttribLocation(gl.program,'a_Position');
gl.vertexAttrib3f(position,
0.0,0.0,0.0); gl.clearColor(0, 0, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
loadImg(gl);
}

function loadImg(gl){

var image=new Image();
image.onload
=function(){ drawPic(gl,image) }
image.src
="pic.png";
}
function drawPic(gl,image){

var width=image.width;

var height=image.height;

var pointSize=gl.getUniformLocation(gl.program,"u_PointSize");
gl.uniform1f(pointSize,Math.max(width,height));
var texture=gl.createTexture();
//gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,1);

gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D,texture);
gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_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.uniform1i(gl.getUniformLocation(gl.program,
"u_Sampler"),0);
gl.texImage2D(gl.TEXTURE_2D,
0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,image);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawArrays(gl.POINTS,
0,1);
gl.bindTexture(gl.TEXTURE_2D,
null);
}

 本代码依赖了几个js代码文件,链接: https://pan.baidu.com/s/1VloeqssKtr9J42nH4SH-eA 提取码: 2jww    自行下载

转载于:https://www.cnblogs.com/wema/p/7084855.html

添加滤镜的最后那段代码没生效那个图片怎么回事改一下那部分<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>PixiJS</title> <script src="https://pixijs.download/v6.5.8/pixi.min.js"></script> </head> <body> <script> // 创建Pixi应用 const app = new PIXI.Application({ width: 1000, height: 700 }); document.body.appendChild(app.view); // 绘制一个矩形 const rectangle = new PIXI.Graphics(); rectangle.beginFill(0x66CCFF); // 蓝色 rectangle.drawRect(0, 0, 100, 100); rectangle.endFill(); rectangle.x = 100; rectangle.y = 150; app.stage.addChild(rectangle); // 创建动画循环 app.ticker.add(() => { //rectangle.rotation += 0.01; // 每帧旋转0.01弧度(旋转) rectangle.rotation = 1 + Math.sin(Date.now() * 0.005) * 0.2;//左右摆动 }); // 加载并显示图片 const sprite = PIXI.Sprite.from('example.png'); sprite.x = 300; sprite.y = 200; // sprite.position.set(200, 200);//x、y app.stage.addChild(sprite); app.ticker.add(() => {// 创建动画循环 sprite.rotation -= 0.01; // 每帧旋转0.01弧度 +=表示顺时针转 -=表示逆时针 rotation属性表示物体的旋转角度,单位为弧度 //sprite.rotation -= 1 * Math.PI / 180; // 每帧逆时针旋转1度 }); // 创建带样式的文本 const style = new PIXI.TextStyle({ //创建文本样式 fill: "#ff55ff", fontSize: 36, stroke: "#5555ff" }); const text = new PIXI.Text("Hello PixiJS", style); app.stage.addChild(text); // 添加滤镜 const glowFilter = new PIXI.filters.GlowFilter({ distance: 15, outerStrength: 2, color: 0xFFD700 // 金色光晕 }); const displacementSprite = PIXI.Sprite.from('displacement_map.jpg'); const displacementFilter = new PIXI.filters.DisplacementFilter({ sprite: displacementSprite, scale: 20 }); sprite.filters = [glowFilter, displacementFilter]; // 波动动画 app.ticker.add(() =>{ displacementSprite.x += 1; // 水平位移变化 if (displacementSprite.x > displacementSprite.width) { displacementSprite.x = 0; } }); </script> </body> </html>
最新发布
09-03
对整threeJS体系进行全面剖析。整理出全面的教学大纲,涵盖内容面非常广。此教学版本为threeJS107版本。关于版本不建议大家使用低于90的版本学习。以下是课程目录1-ThreeJS概览(基本图形简介,什么是点线面如何绘制点线面,什么是材质,什么是几何体,什么是相机,什么是渲染器,什么是场景)2-相机和渲染器(详解相机类型,渲染器如何使用,针对不同场景怎么用,怎么调效果,怎么渲染,怎么输出画布,如何解决透明问题等等)3-创建平面几何(常见的几何体如何使用,如何使用简单的几何体绘制出自定义自己想要的几何体,关于几何体的性能剖析,如何解决性能,几何体的渲染原理)4-高级图形算法常见库(求直线的斜率  计算线段与圆的交点 计算线段的长度 判断折线是否在多边形内 等等)5-sprite精灵(怎么让一个图标永远朝向屏幕,精灵的属性,精灵材质原理等,广告提示框必用)6-骨骼游戏动画(什么是模型动画,常见游戏案例,如何让人头进行各种攻击动作)7-3d模型加载(常见模型格式,如何渲染不同格式,不同格式的特点,什么格式性能优越,模型渲染异常,贴图不显示等问题详解)8-高阶动态纹理(你所不知道的纹理用法,我说你不知道,你肯定不知道)9-漫游轨迹以及其动画路径(怎么绘制贝塞尔曲线,如何使用曲线上的路径,跟随路径移动的原理,相机如何运动,物体如何运动)10-着色器(什么是着色器。初识着色器基础,着色器材质怎么用,怎么使用着色器库)11-常见渲染以及透明度问题12-对象拾取以及拖拽(3d世界里面如何拖拽物体,拖拽的原理,mousemove mouseon等的事件效果)13-世界坐标以及组的问题(什么是相对坐标,什么是世界坐标,什么是当前坐标,怎么转化父子坐标系,组的优化,为什么用组,组的优势)14-指定对象旋转中心(什么是物体的几何体中心,如何改变中心,如何绕轴转动)15-层级对象渲染(多个场景一键切换,切换的优势,针对大项目的用法)16-拓展了解系列(不定期不断更新案例,各种酷炫效果bloom,halo等,以及各种3d图表,粒子案例等,不断构建你的3d实践能力)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值