webgl绘制功能

使用webgl绘制五角星

核心代码:

let vertexShaderString = `
attribute vec4 a_position;
void main(){
    gl_Position = a_position;
}
`
let fragmentShaderString = `
void main(){
    gl_FragColor = vec4(0.0,0.0,1.0,1.0);
}
`
function draw(){
let webglDiv = document.querySelector("#webglCanvas");
let webgl = webglDiv.getContext("webgl");
webgl.viewport(0, 0, webglDiv.width, webglDiv.height);
let vsshader = webgl.createShader(webgl.VERTEX_SHADER);
let fsshader = webgl.createShader(webgl.FRAGMENT_SHADER);

webgl.shaderSource(vsshader, vertexShaderString);
webgl.shaderSource(fsshader, fragmentShaderString);

webgl.compileShader(vsshader);
webgl.compileShader(fsshader);
let program = webgl.createProgram();
webgl.attachShader(program, vsshader);
webgl.attachShader(program, fsshader)

webgl.linkProgram(program);
webgl.useProgram(program);

webgl.program = program;
let arr = [0,0.54,
    0.1,0.2,
    0.46,0.2,
    0.18,-0.02,
    0.28,-0.37,
    0,-0.15,
    -0.28,-0.37,
    -0.18,-0.02,
    -0.46,0.2,
    -0.1,0.2
]

let aPosition = webgl.getAttribLocation(webgl.program,"a_position");
let pointPosition = new Float32Array(arr);
let lineBuffer = webgl.createBuffer();
webgl.bindBuffer(webgl.ARRAY_BUFFER,lineBuffer);
webgl.bufferData(webgl.ARRAY_BUFFER,pointPosition,webgl.STATIC_DRAW);
webgl.enableVertexAttribArray(aPosition);
webgl.vertexAttribPointer(aPosition,2,webgl.FLOAT,false,2*4,0);
webgl.clearColor(0, 0, 0, 1.0);
webgl.clear(webgl.COLOR_BUFFER_BIT);
webgl.drawArrays(webgl.LINE_LOOP,0,10);
}

WebGL 绘制带宽度的曲线可以通过使用顶点着色器和片段着色器来实现。具体步骤如下: 1. 定义曲线的顶点:可以使用一个数组来存储曲线的顶点坐标和宽度,例如对于一个二次贝塞尔曲线,可以按照步长(例如 0.01)来计算曲线上的点,并计算出每个点的法向量,然后将顶点坐标和法向量乘以宽度得到具体的顶点坐标。 2. 创建顶点着色器:顶点着色器的作用是将顶点的坐标和法向量传递给片段着色器,并计算出对应的屏幕坐标和法向量。在传递顶点数据时,需要使用 attribute 变量来声明变量类型和名称,例如: ``` attribute vec3 aVertexPosition; attribute vec3 aNormal; ``` 在顶点着色器中,需要使用 varying 变量来声明传递到片段着色器的变量类型和名称,例如: ``` varying vec3 vPosition; varying vec3 vNormal; ``` 然后在顶点着色器中,可以使用 gl_Position 变量来计算出屏幕坐标,例如: ``` void main() { vPosition = aVertexPosition; vNormal = aNormal; gl_Position = projectionMatrix * modelViewMatrix * vec4(aVertexPosition, 1.0); } ``` 3. 创建片段着色器:片段着色器的作用是根据顶点数据计算出每个像素的颜色。在传递顶点数据时,需要使用 varying 变量来声明变量类型和名称,例如: ``` varying vec3 vPosition; varying vec3 vNormal; ``` 然后在片段着色器中,可以使用这些变量来计算出每个像素的颜色,例如: ``` void main() { vec3 color = vec3(1.0, 0.0, 0.0); // 设置曲线的颜色 float width = 0.1; // 设置曲线的宽度 vec3 normal = normalize(vNormal); vec2 offset = vec2(normal.y, -normal.x) * width; // 计算法向量的偏移量 vec2 position = (gl_FragCoord.xy + offset) / resolution; // 计算屏幕坐标 gl_FragColor = vec4(color, 1.0); // 设置像素的颜色 } ``` 4. 绘制曲线:在绘制曲线前,需要启用深度测试和混合功能,可以使用以下代码: ``` gl.enable(gl.DEPTH_TEST); gl.enable(gl.BLEND); gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); ``` 然后使用 gl.drawArrays 函数来绘制曲线,例如: ``` gl.drawArrays(gl.TRIANGLE_STRIP, 0, vertexCount); ``` 其中,vertexCount 表示顶点数量。 需要注意的是,绘制带宽度的曲线需要使用深度测试和混合来实现遮挡关系和半透明效果,可以使用 gl.depthFunc 和 gl.blendFunc 函数来设置相应的参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值