不使用外部库的Webgl循环

不使用外部库的Webgl循环,webgl,Webgl,我是webgl新手,现在我能够创建三角形和正方形 我发现很难理解如何在没有任何外部脚本或库的情况下创建圆。var vertexShaderText= var vertexShaderText = [ 'uniform vec2 u_resolution;', '', 'attribute vec2 a_position;', '', 'void main()', '{', '', 'vec2 clipspace =

我是webgl新手,现在我能够创建三角形和正方形

我发现很难理解如何在没有任何外部脚本或库的情况下创建圆。

var vertexShaderText=
    var vertexShaderText =
    [
    'uniform vec2 u_resolution;',
    '',
    'attribute vec2 a_position;',
    '',
    'void main()',
    '{',
    '',
    'vec2 clipspace = a_position / u_resolution * 1.0 ;',
    '',
    'gl_Position = vec4(clipspace * vec2(2.5, 2.0), 0, 1);',
    '}'
    ].join("\n");
    var fragmentShaderText =
    [
    'precision mediump float;',
    '',
    'void main(void)',
    '{',
    '',
    'gl_FragColor = vec4(0, 0, 0, 1.0);',
    '',
    '}'

    ].join("\n");
var uni = function(){
    var canvas = document.getElementById("game-surface");
    var gl = canvas.getContext("webgl");
    console.log("This is working");

    gl.clearColor(0.412,0.412,0.412,1);
    gl.clear(gl.COLOR_BUFFER_BIT);


    var vertextShader = gl.createShader(gl.VERTEX_SHADER);
    var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);

    gl.shaderSource(vertextShader,vertexShaderText);
    gl.shaderSource(fragmentShader,fragmentShaderText);

    gl.compileShader(vertextShader);
    gl.compileShader(fragmentShader);

    if(!gl.getShaderParameter(vertextShader,gl.COMPILE_STATUS)){
        console.error("Error with vertexshader",gl.getShaderInfoLog(vertextShader));
        return;
    }
    if(!gl.getShaderParameter(fragmentShader,gl.COMPILE_STATUS)){
        console.error("Error with fragmentShader",gl.getShaderInfoLog(fragmentShader));
        return;
    }



    var program =gl.createProgram();
    gl.attachShader(program,vertextShader);
    gl.attachShader(program,fragmentShader);
    gl.linkProgram(program);
    gl.useProgram(program);
    if(!gl.getProgramParameter(program,gl.LINK_STATUS)){
        console.error("Error linking program",gl.getProgramInfoLog(program));
        return;
    }
    gl.validateProgram(program);
    if(!gl.getProgramParameter(program,gl.VALIDATE_STATUS)){
        console.error("Error validating",gl.getProgramInfoLog(program));
    }

    var circle = {x: 0, y:0, r: 75};
    var ATTRIBUTES = 2;
    var numFans = 64;
    var degreePerFan = (2* Math.PI) / numFans;
    var vertexData = [circle.x, circle.y];

    for(var i = 0; i <= numFans; i++) {
      var index = ATTRIBUTES * i + 2; // there is already 2 items in array
      var angle = degreePerFan * (i+0.1);
      vertexData[index] = circle.x + Math.cos(angle) * circle.r;
      vertexData[index + 1] = circle.y + Math.sin(angle) * circle.r;
    }

    var vertexDataTyped = new Float32Array(vertexData);

    var buffer = gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
    gl.bufferData(gl.ARRAY_BUFFER, vertexDataTyped, gl.STATIC_DRAW);

    var resolutionLocation = gl.getUniformLocation(program, "u_resolution");
    gl.uniform2f(resolutionLocation, canvas.width, canvas.height);

    gl.enableVertexAttribArray(positionLocation);

    var positionLocation = gl.getAttribLocation(program, "a_position");
    gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, ATTRIBUTES * Float32Array.BYTES_PER_ELEMENT, 0);
    gl.drawArrays(gl.TRIANGLE_FAN, 0, vertexData.length/ATTRIBUTES);




};
[ “统一vec2 u_分辨率;”, '', '属性向量2 a_位置;', '', “void main()”, '{', '', 'vec2 clipspace=a_位置/u_分辨率*1.0;', '', ‘gl_Position=vec4(clipspace*vec2(2.5,2.0,0,1);’, '}' ].加入(“\n”); var fragmentShaderText= [ “精密中泵浮动;”, '', “无效主管道(无效)”, '{', '', “gl_FragColor=vec4(0,0,0,1.0);”, '', '}' ].加入(“\n”); var uni=函数(){ var canvas=document.getElementById(“游戏界面”); var gl=canvas.getContext(“webgl”); console.log(“这正在工作”); gl.clearColor(0.412,0.412,0.412,1); 总账清除(总账颜色缓冲位); var vertextShader=gl.createShader(gl.vertext\u着色器); var fragmentShader=gl.createShader(gl.FRAGMENT\u着色器); gl.shaderSource(vertextShader,vertexShaderText); gl.shaderSource(fragmentShader,fragmentShaderText); gl.compileShader(vertextShader); gl.compileShader(碎片着色器); if(!gl.getShaderParameter(vertextShader,gl.COMPILE_状态)){ console.error(“vertexshader错误”,gl.getShaderInfoLog(vertexshader)); 回来 } if(!gl.getShaderParameter(fragmentShader,gl.COMPILE_状态)){ console.error(“fragmentShader错误”,gl.getShaderInfoLog(fragmentShader)); 回来 } var program=gl.createProgram(); gl.attachShader(程序,vertextShader); gl.attachShader(程序、碎片着色器); 总账链接程序(程序); gl.useProgram(程序); if(!gl.getProgramParameter(程序、总账链接状态)){ console.error(“错误链接程序”,gl.getProgramInfoLog(程序)); 回来 } 总账验证程序(程序); if(!gl.getProgramParameter(程序,gl.VALIDATE_状态)){ console.error(“错误验证”,gl.getProgramInfoLog(程序)); } 变量圆={x:0,y:0,r:75}; var属性=2; var numFans=64; 变量degreePerFan=(2*Math.PI)/numFans; var vertexData=[circle.x,circle.y];
对于(var i=0;很抱歉,但您需要给我们更多信息。您能否编辑您的问题以包含您尝试过的内容(代码片段、错误等)我实际上创建了这个圆,你能帮我吗,我想沿着大圆的圆周生成多达10个随机圆。我有一个想法,可以使用生成的顶点,但不知道如何访问它。你可以看看我在下面发布的答案。不要用答案向我们展示你的尝试。答案是解决方案,而不是q的更多部分uestion。使用“编辑”修改问题文本以显示您的代码。我实际上无法帮助您解决问题,我只是主持人之一。请编辑您的问题并将此代码添加到其中,然后删除此“答案”,因为它不是您问题的解决方案。