带颜色三角形

<html>
<head>11</head>
<body>
<canvas id = "test" width = "200" height = "200">canvas </canvas>
<script >
//顶点着色器
var vertexShaderSource =
    'attribute vec4 a_Position;\n' +
    'attribute vec4 a_Color;\n' +
    'varying vec4 v_Color;\n' +     //varying变量
    'void main() {\n' +
    'gl_Position = a_Position;\n'+  //设置坐标
    'v_Color = a_Color;\n' + //将数据传给片元着色器
    '}\n';

//片元着色器
var fragmentShaderSource =
    'precision mediump float;\n' +
    'varying vec4 v_Color;\n' +     //varying变量
    'void main() {\n' +
    'gl_FragColor = v_Color;\n'+ //设置颜色
    //'gl_FragColor = vec4(gl_FragCoord.x/200, 0.0, gl_FragCoord.y/ 200.0, 1.0);\n'+ //设置颜色
    '}\n';

//创建着色器方法,输入参数:渲染上下文,着色器类型,数据源
function createShader(gl, type, source)
{
    //创建着色器对象
    var shader = gl.createShader(type);
    //提供数据源
    gl.shaderSource(shader,source);
    //编译着色器
    gl.compileShader(shader);
    //链接
    var success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
    if(success)
    {
        return shader;
    }
    console.log(gl.getShaderInfoLog(shader));
    gl.deleteShader(shader);
    
}
//将顶点着色器和像素着色器链接到一个着色程序
function createProgram(gl, vertexShader, fragmentShader)
{
    var program = gl.createProgram();
    gl.attachShader( program, vertexShader);
    gl.attachShader( program, fragmentShader);
    gl.linkProgram( program );
    var success = gl.getProgramParameter(program, gl.LINK_STATUS);
    if(success)
    {
        console.log("link right");
        return program;
    }
    console.log(gl.getProgramInfoLog(program));
    gl.deleteProgram(program);
}
    var canvas = document.getElementById("test");
    //创建webgl渲染上下文
    var gl = canvas.getContext("webgl");
    //var gl = WebGLUtils.setupWebGL(canvas);
    if(!gl)
    {
        console.log("wrong");
    }
    else
    {
        console.log("right");
    }
    //初始化着色器

    var vertexShader = createShader(gl,gl.VERTEX_SHADER,vertexShaderSource);
    var fragmentShader = createShader(gl,gl.FRAGMENT_SHADER, fragmentShaderSource);
    var program = createProgram(gl, vertexShader, fragmentShader);
    gl.useProgram(program);
    //创建顶点数组
    var vertices = new Float32Array([
    0.0, 0.5,  1.0,0.0, 0.0, 0.1,      //第一个点
    -0.5, -0.5, 0.0,1.0, 0.0,0.3,    //第二个点
    0.5, -0.5, 0.0, 0.0, 1.0,0.5,    //第三个点
    ]);
    var numberVertices = 3;
    //创建缓冲区对象
    var vertexBuffer = gl.createBuffer();
    //将缓冲区对象绑定到目标
    gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
    //向绑定的缓冲区对象中写入数据
    gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
    
    var FSIZE = vertices.BYTES_PER_ELEMENT;
    //获取位置变量并传递顶点位置
    var thePosition = gl.getAttribLocation(program, 'a_Position');
    //将缓冲区对象分配给位置变量
    gl.vertexAttribPointer(thePosition, 2, gl.FLOAT, false, FSIZE * 6, 0 );
    //启动缓冲区
    gl.enableVertexAttribArray(thePosition);
    
    var theColor = gl.getAttribLocation(program, 'a_Color');   
    gl.vertexAttribPointer(theColor, 3, gl.FLOAT, false, FSIZE * 6, FSIZE * 2 );    
    gl.enableVertexAttribArray(theColor);
 
    //清除颜色
    gl.clearColor(0.0,0.0,0.0,1.0);
    gl.clear(gl.COLOR_BUFFER_BIT);
    //绘制点
     gl.drawArrays(gl.TRIANGLES, 0, numberVertices);

    
    </script>
</body>
</html>

 

### 使用 CSS 实现三角形交替颜色效果 可以通过纯 CSS 的方式来创建三角形,并利用伪类 `:nth-child` 或者 `:nth-of-type` 来实现交替的颜色效果。以下是具体方法: #### 方法一:使用 CSS 边框技巧 通过设置不同方向的透明边框和指定一侧的颜色,可以构建一个三角形。然后结合 `:nth-child(odd)` 和 `:nth-child(even)` 来定义奇偶项的不同颜色。 ```css .triangle { width: 0; height: 0; border-style: solid; border-width: 7px 10px 7px 0; /* top | right | bottom | left */ } .triangle:nth-child(odd) { border-right-color: blue; /* 奇数项颜色 */ } .triangle:nth-child(even) { border-right-color: red; /* 偶数项颜色 */ } ``` 上述代码中,`.triangle` 类用于生成右指三角形[^1]。`:nth-child(odd)` 定义了奇数索引下的蓝色三角形,而 `:nth-child(even)` 则设置了偶数索引下红色的三角形。 #### 方法二:使用 SVG 路径 如果希望更加灵活地控制形状或者支持更多的浏览器功能,可以选择使用 SVG 创建三角形并应用不同的填充颜色。 ```html <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"> <!-- 奇数 --> <polygon points="50,0 100,100 0,100" fill="blue"/> <!-- 偶数 --> <polygon points="50,0 100,100 0,100" fill="red"/> </svg> ``` 对于多个三角形的情况,可以在 HTML 中重复 `<svg>` 元素,并分别调整其 `fill` 属性以匹配所需的交替颜色模式。 --- ### 性能考虑 无论是采用 CSS 还是 SVG 方式,在实际开发过程中都需要注意页面性能的影响。频繁的操作 DOM 结构可能会引发重排 (reflow)[^2] 或重绘 (repaint),因此建议尽量减少动态样式的更改频率。例如,预先设定好所有的样式并通过 JavaScript 控制显示隐藏即可有效降低开销。 另外值得注意的是单位的选择也可能间接影响到渲染效率。像 px 是绝对长度单位适合固定尺寸设计;em/rem 取决于上下文字体大小适用于响应式布局;vw/vh 表达视口百分比非常适合全屏展示需求[^3]。但在本案例里由于只是单纯制作静态图形所以无需特别关注这些细节差异。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值