设置多边形偏移

<html>
<head>11</head>
<body>
<canvas id = "test" width = "200" height = "200">canvas </canvas>
<script src = "webgltest/cuon-matrix.js"></script>
<script >
//顶点着色器
var vertexShaderSource =
    'attribute vec4 a_Position;\n' +
    'attribute vec4 a_Color;\n' +
    'uniform mat4 u_mvpMatrix;\n' +
    'varying vec4 v_Color;\n' +     //varying变量
    'void main() {\n' +
    //'gl_Position = u_ModelViewMatrix * a_Position;\n'+  //设置坐标
    'gl_Position = u_mvpMatrix * 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'+ //设置颜色
    '}\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,     2.5,     -5.0,     0.0,     1.0,     0.0,          //第一个点
    -2.5,     -2.5,     -5.0,    0.0,     1.0,    0.0,        //第二个点
    2.5,     -2.5,     -5.0,     1.0,     0.0,    0.0,        //第三个点
    0.0,     3.0,     -5.0,     1.0,     0.0,     0.0,          //第一个点
    -3.0,     -3.0,     -5.0,    1.0,     1.0,    0.0,        //第二个点
    3.0,     -3.0,     -5.0,     1.0,     1.0,    0.0,        //第三个点
    ]);
    var numberVertices = 6;
    //创建缓冲区对象
    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 * 3 );    
    gl.enableVertexAttribArray(theColor);
 
    //设置世界坐标系
    var modelMatrix = new Matrix4();
    modelMatrix.setRotate(30.0,0,0,1);    
    //设置视点、视线和上方向
    var viewMatrix = new Matrix4();
    viewMatrix.setLookAt(0, 0, 5, 0, 0, -100, 0, 1, 0);
    //投影矩阵
    var projMatrix = new Matrix4();
    var g_near = 1.0, g_far = 100.0;
    projMatrix.setPerspective(30, canvas.width / canvas.height,g_near, g_far);
    //模型视图投影矩阵
    var mvpMatrix = new Matrix4();
    //计算模型视图投影矩阵
    mvpMatrix.set(projMatrix).multiply(viewMatrix).multiply(modelMatrix);
    //获取投影矩阵
    var u_mvpMatrix = gl.getUniformLocation(program, 'u_mvpMatrix');
    //将投影矩阵传给u_ProjMatrix变量
    gl.uniformMatrix4fv(u_mvpMatrix, false, mvpMatrix.elements);
    //清除颜色
    //在绘制之前,清除深度缓冲区
    gl.clearColor(0.0,0.0,0.0,1.0);
    //开启隐藏面消除功能
    gl.enable(gl.DEPTH_TEST);
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
    
    //启用多边形偏移
    gl.enable(gl.POLYGON_OFFSET_FILL);
    //绘制绿色三角形
    gl.drawArrays(gl.TRIANGLES, 0, numberVertices / 2);
    //设置多边形偏移
    gl.polygonOffset(1.0,1.0);
    //绘制黄色三角形
    gl.drawArrays(gl.TRIANGLES, numberVertices / 2, numberVertices / 2);

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

多边形偏移是一种用于在计算机图形学中修改多边形表面的技术。通过对多边形的每个顶点进行偏移,可以修改多边形的表面位置,从而实现比如凸出或凹进的效果。 多边形偏移通常用于增加视觉效果,例如渲染立体感或创建阴影效果。在渲染立体模型时,通过对多边形进行适当的偏移,可以使模型的表面看起来更加真实,有一定的立体感。此外,多边形偏移还可以用于生成类似于蚊子网格的效果,使表面看起来更加细致。 多边形偏移的实现通常依赖于图形处理器(GPU)的功能。在渲染管线的几何处理阶段,通常有一个单独的过程来处理多边形偏移。具体实现的方法可以有多种,例如通过修改多边形的顶点坐标或修改深度缓冲区的值来实现偏移效果。 然而,多边形偏移也可能带来一些问题。如果偏移值过大,可能会导致多边形之间的重叠或遮挡关系发生错误。此外,多边形偏移还可能导致视觉上的锯齿或不连续的边缘效果。为了解决这些问题,通常需要调整偏移值或使用其他方法来平滑边缘效果。 总的来说,多边形偏移是一种在计算机图形学中常用的技术,通过修改多边形的表面位置来实现不同的视觉效果。虽然多边形偏移可能会引发一些问题,但通过合理调整参数和采用其他处理方式,可以获得更好的渲染结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值