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

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;",
        "    float y=gl_PointCoord.y-0.5;",
        "    float nx=(cos(u_Angle) * x - sin(u_Angle ) * y);",
        "    float ny = (sin( u_Angle ) * x + cos( u_Angle ) * 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);
}
时间: 2024-10-09 01:58:38

WebGL之点精灵的旋转(Rotation Sprite)的相关文章

创建3D模型/添加屏幕监听,点击屏幕时,精灵带有旋转的移动

 3D模型创建 //3D models auto model = Sprite3D::create("Sprite3DTest/boss1.obj"); model->setScale(4); model->setTexture("Sprite3DTest/boss.png"); model->setPosition3D(Vec3(s.width/2, s.height/2, 0)); addChild(model); EventListene

WebGL递归处理和移动?旋转?缩放

3D世界只有三种运动方式:移动.旋转.放大缩小. 使用setTimeout函数可以实现反复的循环处理,那么具体的做法是怎样的呢?setTimeout函数的第一个参数是调用的函数,第二个参数是需要经过多长时间(毫秒)后调用这个函数.如果第一个参数指定为当前所运行的函数的话,那么就可以实现持续循环了.    ?函数A被调用    ?在函数A中,使用setTimeout,并传入函数A作为参数    ?经过指定的时间后,函数A被调用    按照上面的步骤,把WebGL中绘图部分写成递归函数,就可以持续循

【WebGL初学系列之五】旋转,平移,缩放

nbcoder.com地址:http://nbcoders.com/webgl-chu-xue-xi-lie-zhi-wu-ai.html 最近把WebGL做的相关Demo已经放在 http://www.nbcoders.com 上了,这样就可以直观的进行看效果. 地址:    http://lab.nbcoders.com/ixshells/ 本文旋转平移缩放Demo的地址: http://lab.nbcoders.com/ixshells/Html/ScaleRotateTranslate.

Unity 精灵物体的创建 Sprite.create

参考链接:http://www.cnblogs.com/BuladMian/p/6226744.html 创建预制体精灵 优点:创建大量相同精灵,只用调用一个预制体精灵,避免了 计算机大量重复创建会导致过多的浪费 public GameObject preb; 新建精灵物体 优点:可以及时创建,使用几句代码就可以实现,不必拖拽预制体 如果每次创建新的精灵,每次拖拽预制体,是件非常麻烦的事情 导致编程人员大量不必要的冗余操作 SpriteRenderer spr = gameObject.GetC

基于HTML5 WebGL实现3D飞机叶轮旋转

在上一篇<基于HT for Web矢量实现2D叶轮旋转>中讲述了叶轮旋转在2D拓扑上的应用,今天我们就来讲讲叶轮旋转在3D上的应用. 在3D拓扑上可以创建各种各样的图元,在HT for Web系统中提供了一些常规的3D模型,但是对于那些比较复杂的模型,比如汽车.人物等模型就无能为力了,那再项目中需要用到这样的模型该肿么办呢?这时候就需要借助专业的3ds Max工具来建模了,然后通过3ds Max工具将模型导出成obj文件,然后再项目中引用导出的obj文件,这样就能成功的使用上复杂的图元了. 在

cocos2dx 3.x以上(Sprite精灵类的相关属性与创建)

// //  MainScene.cpp //  helloworld // //  Created by apple on 16/9/19. // // #include "MainScene.hpp" Scene * MainScene::createScene() { auto scene = Scene::create(); //    CCScene * scene = CCScene::create();// 创建场景 //创建层 MainScene *layer = Ma

Cocos2d-x Lua中Sprite精灵类

Cocos2d-x Lua中Sprite精灵类 精灵类是Sprite,它的类图如下图所示. Sprite类图 Sprite类直接继承了Node类,具有Node基本特征.此外,我们还可以看到Sprite类的子类有:PhysicsSprite和Skin.PhysicsSprite是物理引擎精灵类,Skin是皮肤精灵类用于骨骼动画.创建Sprite精灵对象创建精灵对象有多种方式,其中常用的函数如下:cc.Sprite:create ().创建一个精灵对象,纹理[ 纹理(texture),表示物体表面细

15、Cocos2dx 3.0游戏开发找小三之Sprite:每个精灵都是上辈子折翼的天使

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30475395 Sprite Sprite 可以说是游戏中最重要的组成元素: 它描述了游戏中的精灵,是 Node 的一个最重要也最灵活的子类. Sprite 很重要,它代表了游戏中一个最小的可见单位, 同时Sprite 也很灵活,它装载了一个平面纹理,具有丰富的表现力,而且 可以通过多种方式加载. 如果说 Scene 和 Layer 代表了宏观的游戏元素

NGUI研究之Sprite精灵与精灵动画的使用

 学习了几天Unity3D强大的NGUI插件,觉得NGUI中最大的亮点之一就是Sprite精灵.我们先说说精灵是什么东西?它可以在一张大图中去截取一部分(大图就是整体图像集合,而截取的小图就是一个精灵),然后起一个精灵的名称,使用时通过精灵的名称就能直接绘制,并且精灵还可以播放动画.总之真的非常强大.本节我们学习如何创建自己的精灵文件.基本使用不了解的看NGUI研究之开始学习制作第一个例子 首先我们在Project中创建一个Prefab对象,默认给它Transform变换属性,暂时我们给Pr