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

编程入门 行业动态 更新时间:2024-10-09 17:21:48

WebGL之点<a href=https://www.elefans.com/category/jswz/34/1769738.html style=精灵的旋转(Rotation Sprite)"/>

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

上一篇已经把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代码文件,链接: 提取码: 2jww    自行下载

转载于:.html

更多推荐

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

本文发布于:2024-02-06 13:29:28,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1749480.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:精灵   WebGL   Sprite   Rotation

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!