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代码文件,链接: https://pan.baidu.com/s/1VloeqssKtr9J42nH4SH-eA 提取码: 2jww    自行下载

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值