怎么把Sierpinski镂垫中间去掉的三角形换成其他形状(比如换成下图的爱心形状),下面第一张图是下面代码的编译效果,第二张图是想要的效果(不是爱心形状也可),在我的代码的基础上进行修改


var NumTimesToSubdivide = 5; //递归次数
var NumTriangles = Math.pow(3,NumTimesToSubdivide); //产生的三角形个数
var NumVertices = 3 * NumTriangles; //顶点数
var points = []; //存放顶点坐标的数组,初始为空
window.onload = function main(){
var canvas = document.getElementById("webgl");
if(!canvas){
alert("获取canvas元素失败!");
return;
}
var gl = WebGLUtils.setupWebGL(canvas);
if (!gl){
alert("获取WebGL上下文失败! ");
return;
}
//
var vertices = [
vec2(-1.0,-1.0),vec2(0.0,1.0),vec2(1.0,-1.0)
];
//递归细分原始三角形
divideTriangle(vertices[0],vertices[1],vertices[2],NumTimesToSubdivide);
/*设置webGL相关属性*/
//设置视口(此处视口占满整个canvas)
gl.viewport(0,//视口左边界举例canvas左边界距离
0,//视口下边界距离canvas下边界距离
canvas.width,//视口宽度
canvas.height);//视口高度
gl.clearColor(1.0,1.0,1.0,1.0);
/*加载shader程序并为shader中attribute变量提供数据*/
//加载id分别为"vertex-shader","fragment-shader"的shader程序,
//并进行编译和链接,返回shader程序对象program
var program = initShaders(gl,"vertex-shader","fragment-shader");
gl.useProgram(program); //启用该shader程序对象
/*将顶点位置属性数据传输到GPU*/
var verticesBufferId = gl.createBuffer(); //创建buffer
gl.bindBuffer(gl.ARRAY_BUFFER,verticesBufferId); //将id为verticesBufferId的buffer绑定为当前Array Buffer
//为当前Array Buffer提供数据,传输到GPU
gl.bufferData(gl.ARRAY_BUFFER, //Buffer类型
flatten(points), //Buffer数据来源,flatten将points转换为GPU可接受的格式
gl.STATIC_DRAW); //表明将如何使用Buffer(STATIC_DRAW表明是一次提供数据,多遍绘制)
/*为shader属性变量与buffer数据建立关联*/
//获取名称为"a_Position"的shader attribute变量的位置
var a_Position = gl.getAttribLocation(program,"a_Position");
if(a_Position < 0){ //getAttribLocation获取失败则返回-1
alert("获取attribute变量a_Position失!");
return;
}
//指定利用当前Array Buffer为a_Position提供数据的具体方式
gl.vertexAttribPointer(a_Position, //shader attribu变量位置
2, //每个顶点属性有2个分量
gl.FLOAT, //数组数据类型(浮点型)
false, //不进行归一化处理
0, //相邻顶点属性地址相差0个字节
0); //第一个顶点属性在Buffer中偏移量为0字节
gl.enableVertexAttribArray(a_Position); //启用顶点属性数组
render(gl); //进行绘制
};
function render(gl) {
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawArrays(gl.TRIANGLES,
0,
NumVertices);
}
//将三角形的顶点坐标加入数组中
//a,b,c为三角形的三个顶点坐标
function triangle(a,b,c){
points.push(a);
points.push(b);
points.push(c);
}
//递归细分三角形 k用于控制细分次数
function divideTriangle(a,b,c,k){
if (k>0) { //k>0则继续细分
//计算三角形各边的中点
var ab = mult(0.5,add(a,b));
var ac = mult(0.5,add(a,c));
var bc = mult(0.5,add(b,c));
//出来中间的那个三角形,继续细分其它的三角形
divideTriangle(a,ab,ac,k-1);
divideTriangle(c,ac,bc,k-1);
divideTriangle(b,bc,ab,k-1);
}
else{
triangle(a,b,c); //递归结束时"绘制"三角形
}
}