webgl实现画圆

首先这里要熟悉一下模型矩阵具体请参考https://blog.csdn.net/baidu_38766085/article/details/79722222

这里给出一份演示

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        body{
            margin: 0;
            padding: 0;
        }
    </style>
</head>
<body>
<canvas id="cvs" width="800" height="800"></canvas>
<div></div>

<script id="vertex" type="text/v-shader">
  precision highp float;
  attribute vec3 position;
  uniform mat4 mat;
  varying vec4 color;
  void main(){
    gl_Position=mat*vec4(position,1.0);

    color=vec4(gl_Position.x,gl_Position.y,gl_Position.z,0.8);}
</script>
<script  id="fragment" type="text/f-shader">
#ifdef GL_ES
    precision mediump float;
#endif
    varying vec4 color;
    void main(){
        gl_FragColor=color;
    }
</script>

<script type="text/javascript">
    (function(global){
        var cvs = document.getElementById("cvs");
         var gl = cvs.getContext("experimental-webgl");
        var vertex = gl.createShader(gl.VERTEX_SHADER);
        var fragment = gl.createShader(gl.FRAGMENT_SHADER);
        var paogram = gl.createProgram();

        gl.shaderSource(vertex,document.getElementById("vertex").text);
        gl.shaderSource(fragment,document.getElementById("fragment").text);
        gl.compileShader(vertex);
        gl.compileShader(fragment);
        gl.attachShader(paogram,vertex);
        gl.attachShader(paogram,fragment);
        gl.linkProgram(paogram);
        gl.useProgram(paogram);
        var drawY=function(rX,rY,r,m){
            var arr= new Array();
            var addAng=360/m;
            var angle=0;
            for(var i = 0;i<m;i++){
                arr.push(Math.sin(Math.PI/180*angle)*r,Math.cos(Math.PI/180*angle)*r,0);
                arr.push(0.0,0.0,0.0);
                angle=angle+addAng;
                arr.push(Math.sin(Math.PI/180*angle)*r,Math.cos(Math.PI/180*angle)*r,0);
            }
            return arr;
        }
       
        var ms = 90;
        data=drawY(0,0,0.5,ms);
        var positionIndex = gl.getAttribLocation(paogram,"position");
        var matIndex = gl.getUniformLocation(paogram,"mat");
        console.log(gl.getShaderInfoLog(vertex));
        var mM=[
            1,0,0,0,
            0,1,0,0,
            0,0,1,0,
            0,0,0,1
        ];
        console.log(gl.getShaderInfoLog(fragment));


        global.rotateX=function (angle){
            var c = Math.cos(Math.PI/180*angle);
            var s = Math.sin(Math.PI/180*angle);
            var mM1=mM[1],mM5=mM[5],mM9=mM[9];
            mM[1] = c*mM[1] - s*mM[2];
            mM[5] = c*mM[5] - s*mM[6];
            mM[9] = c*mM[9] - s*mM[10];

            mM[2]=s*mM1+c*mM[2];
            mM[6]=s*mM5+c*mM[6];
            mM[10]=s*mM9+c*mM[10];

        };
        global.rotateY=function (angle){
            var c = Math.cos(Math.PI/180*angle);
            var s = Math.sin(Math.PI/180*angle);
            var mM0=mM[0],mM8=mM[8],mM4=mM[4];
            mM[0] = c*mM[0] + s*mM[2];
            mM[4] = c*mM[4] + s*mM[6];
            mM[8] = c*mM[8] + s*mM[10];

            mM[2] = c*mM[2]-s*mM0;
            mM[6] = c*mM[6]-s*mM4;
            mM[10] = c*mM[10]-s*mM8;
        };
        global.rotateZ=function (angle){
            var c = Math.cos(Math.PI/180*angle);
            var s = Math.sin(Math.PI/180*angle);
            var mM0=mM[0],mM4=mM[4],mM8=mM[8];
            mM[0] = c*mM[0]-s*mM[1];
            mM[4] =  c*mM[4]-s*mM[5];
            mM[8] =  c*mM[8]-s*mM[9];

            mM[1]=s*mM0+c*mM[1];
            mM[5]=s*mM4+c*mM[5];
            mM[9]=s*mM8+c*mM[9];
        };
        global.moveX= function(distance){
            mM[0]=mM[0]+distance*mM[3];
            mM[4]=mM[4]+distance*mM[7];
            mM[8]=mM[8]+distance*mM[11];
            mM[12]=mM[12]+distance*mM[15];
        };
        global.moveY= function(distance){
            mM[1]=distance*mM[3]+mM[1];
            mM[5]=distance*mM[7]+mM[5];
            mM[9]=distance*mM[11]+mM[9];
            mM[13]=distance*mM[15]+mM[13];
        };
        global.moveZ= function(distance){
            mM[2]=distance*mM[3]+mM[2];
            mM[6]=distance*mM[7]+mM[6];
            mM[10]=distance*mM[11]+mM[10];
            mM[14]=distance*mM[15]+mM[14];
        };
        global.scaleFun=function(scale){
            mM[0]=scale*mM[0];
            mM[4]=scale*mM[4];
            mM[8]=scale*mM[8];
            mM[12]=scale*mM[12];
            mM[1]=scale*mM[1];
            mM[5]=scale*mM[5];
            mM[9]=scale*mM[9];
            mM[13]=scale*mM[13];
            mM[2]=scale*mM[2];
            mM[6]=scale*mM[6];
            mM[10]=scale*mM[10];
            mM[14]=scale*mM[14];
        };
        var buffer = gl.createBuffer();
        gl.bindBuffer(gl.ARRAY_BUFFER,buffer);
        gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(data),gl.STATIC_DRAW);
        gl.vertexAttribPointer(positionIndex,3,gl.FLOAT,false,0,0);

        gl.enableVertexAttribArray(positionIndex);
        var dis= 0.05;
        var angle=0.5;
        function fun(){

            rotateX(angle);
            rotateY(angle);
            rotateZ(angle);

            gl.uniformMatrix4fv(matIndex,false,new Float32Array(mM));
            gl.clearColor(0.5, 0.5, 0.5, 1);
            gl.clear(gl.COLOR_BUFFER_BIT);
            gl.drawArrays(gl.TRIANGLES,0,ms*3);
            requestAnimationFrame(fun);
        }
        fun();

    })(window);
</script>
</body>
</html>

在这里编写了一个方法 drawY

该方法支持四个参数 圆心X 圆心Y 半径 面数 不过这里没有 对圆心进行解释了

这里介绍一些面数 我们绘制模型是采用的三角形进行绘制的所以这里的圆其实是很多个三角形进行拼接拼上的

具体运行效果




  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: WebGL 是一种基于 JavaScript 和 OpenGL 的 3D 图形库,它可以在 Web 浏览器中渲染 3D 图形,从而实现浏览器中的 3D 视觉效果。实现阴影效果可以使用 WebGL 中的阴影映射技术,简单来说,就是在场景中添加光源,然后从光源的角度渲染场景,生成一张深度图,再将深度图应用到场景中的物体上,就可以实现阴影效果了。同时,还可以使用其他技术,例如环境映射和法线映射,来增强场景的真实感和深度感。总之,WebGL 提供了丰富的工具和技术,使得在 Web 浏览器中实现 3D 阴影效果成为可能。 ### 回答2: WebGL是一种基于Web的图形渲染技术,可以实现高性能的3D图形渲染。要实现阴影效果,可以借助WebGL的功能来完成。 首先,要实现阴影效果,需要一个光源。在WebGL中,可以通过设置光源的位置和方向来控制光的照射效果。 其次,还需要一个或多个需要投射阴影的物体。通过在渲染过程中为这些物体添加一个额外的"shadow"属性,可以标识它们需要投射阴影。 然后,在渲染阴影之前,需要创建一个用于渲染阴影的额外场景。在该场景中,只包含需要投射阴影的物体。这个场景可以使用一个特殊的着色器来渲染,这个着色器和其他场景使用的着色器可能稍有不同,因为它只关注渲染阴影而不需要考虑光照。 接下来,在渲染主场景之前,需要对每个需要投射阴影的物体进行阴影计算。这可以通过使用光源的位置和方向来确定每个像素是否在阴影之中。可以使用阴影映射技术(Shadow Mapping)来完成这个计算过程,这个过程涉及渲染一个特殊的深度贴图来表示场景中的深度信息。 最后,在主场景渲染过程中,可以使用计算得到的阴影信息来对物体进行阴影投射。可以使用对阴影贴图进行采样的方式,来判断像素是否位于阴影之中。 综上所述,WebGL通过设置光源、创建阴影场景、进行阴影计算和使用阴影信息投射,可以实现3D场景中的阴影效果。 ### 回答3: WebGL是一种在网页浏览器上运行3D图形的技术,它使用JavaScript和OpenGL的子集来实现。要实现阴影效果,我们可以借助WebGL的着色器程序和纹理功能。 首先,为了产生阴影,我们需要一个光源。可以使用WebGL的光照功能来定义光源的位置和类型,例如平行光或点光源。 接下来,我们需要为阴影接收器(即产生阴影的物体)和阴影投射器(即光源)创建阴影贴图。阴影贴图是一个与场景大小相同的二维纹理,它记录了物体与光源之间的相对位置关系。 然后,我们需要通过在阴影投射器和阴影接收器之间进行渲染来生成阴影贴图。我们可以使用投射阴影的算法,如阴影映射或体积光,来计算每个像素的阴影强度。 在渲染阶段,我们可以在顶点着色器和片段着色器中应用阴影贴图。顶点着色器将物体的顶点位置转换为世界坐标和光源坐标,并将它们传递给片段着色器。片段着色器使用阴影贴图来计算每个像素的阴影强度,并将其与物体的颜色进行混合。 最后,我们可以通过在片段着色器中使用深度测试来控制阴影的渲染顺序,并使用透明度来调整阴影的强度和透明度。 总体来说,WebGL通过使用光照、阴影贴图和着色器程序来实现阴影效果。这样可以使3D场景更加逼真和生动,并增强用户对物体之间关系的认知。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值