WebGL增加顶点颜色

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=gb2312">
<script type="text/javascript" src="glMatrix-0.9.5.js"></script>


<script id="shader-vs" type="x-shader/x-vertex">
attribute vec3 v3Position;
attribute vec3 av3Color;
varying vec3 vv3Color;
void main(void)
{
    vv3Color = av3Color;
    gl_Position = vec4(v3Position, 1.0);
}
</script>


<script id="shader-fs" type="x-shader/x-fragment">
#ifdef GL_FRAGMENT_PRECISION_HIGH
    precision highp float;
#else
    precision mediump float;
#endif
varying vec3 vv3Color;
void main(void)
{
    gl_FragColor = vec4(vv3Color, 1.0);
}
</script>


<script>
function ShaderSourceFromScript(scriptID)
{
    var shaderScript = document.getElementById(scriptID);
    if (shaderScript == null) return "";


    var sourceCode = "";
    var child = shaderScript.firstChild;
    while (child)
    {
        if (child.nodeType == child.TEXT_NODE ) sourceCode += child.textContent;
        child = child.nextSibling;
    }


    return sourceCode;
}


var webgl = null;
var vertexShaderObject = null;
var fragmentShaderObject = null;
var programObject = null;
var triangleBuffer = null; 
var v3PositionIndex = 0;
var triangleColorBuffer = null;
var v3ColorIndex = 1;


function Init()
{
    var myCanvasObject = document.getElementById('myCanvas');
    webgl = myCanvasObject.getContext("experimental-webgl");


    webgl.viewport(0, 0, myCanvasObject.clientWidth, myCanvasObject.clientHeight);


    vertexShaderObject = webgl.createShader(webgl.VERTEX_SHADER);
    fragmentShaderObject = webgl.createShader(webgl.FRAGMENT_SHADER);


    webgl.shaderSource(vertexShaderObject, ShaderSourceFromScript("shader-vs"));
    webgl.shaderSource(fragmentShaderObject, ShaderSourceFromScript("shader-fs"));


    webgl.compileShader(vertexShaderObject);
    webgl.compileShader(fragmentShaderObject);


    if(!webgl.getShaderParameter(vertexShaderObject, webgl.COMPILE_STATUS)){alert(webgl.getShaderInfoLog(vertexShaderObject));return;}
    if(!webgl.getShaderParameter(fragmentShaderObject, webgl.COMPILE_STATUS)){alert(webgl.getShaderInfoLog(fragmentShaderObject));return;}


    programObject = webgl.createProgram();


    webgl.attachShader(programObject, vertexShaderObject);
    webgl.attachShader(programObject, fragmentShaderObject);


    webgl.bindAttribLocation(programObject, v3PositionIndex, "v3Position");
    webgl.bindAttribLocation(programObject, v3ColorIndex, "av3Color");


    webgl.linkProgram(programObject);
    if(!webgl.getProgramParameter(programObject, webgl.LINK_STATUS)){alert(webgl.getProgramInfoLog(programObject));return;}


    webgl.useProgram(programObject);
    


    var jsArrayData = [
   -1.0, -1.0, 0.0, 
        -1.0, 1.0, 0.0,//上顶点
         1.0, -1.0, 0.0,//左顶点
         1.0, 1.0, 0.0];//右顶点


    triangleBuffer = webgl.createBuffer();
    webgl.bindBuffer(webgl.ARRAY_BUFFER, triangleBuffer);
    webgl.bufferData(webgl.ARRAY_BUFFER, new Float32Array(jsArrayData), webgl.STATIC_DRAW);
    
//增加顶点颜色
    var jsArrayColor = [
         1.0, 0.0, 0.0, 
         0.0, 1.0, 0.0,//上顶点
         0.0, 0.0, 1.0,//左顶点
         1.0, 1.0, 0.0];//右顶点


    triangleColorBuffer = webgl.createBuffer();
    webgl.bindBuffer(webgl.ARRAY_BUFFER, triangleColorBuffer);
    webgl.bufferData(webgl.ARRAY_BUFFER, new Float32Array(jsArrayColor), webgl.STATIC_DRAW);
    


    webgl.clearColor(0.0, 0.0, 0.0, 1.0);
    webgl.clear(webgl.COLOR_BUFFER_BIT);


    webgl.bindBuffer(webgl.ARRAY_BUFFER, triangleBuffer);
    webgl.enableVertexAttribArray(v3PositionIndex); 
    webgl.vertexAttribPointer(v3PositionIndex, 3, webgl.FLOAT, false, 0, 0);


    webgl.bindBuffer(webgl.ARRAY_BUFFER, triangleColorBuffer);
    webgl.enableVertexAttribArray(v3ColorIndex); 
    webgl.vertexAttribPointer(v3ColorIndex, 3, webgl.FLOAT, false, 0, 0);


    webgl.drawArrays(webgl.TRIANGLE_STRIP, 0, 4);


}
</script>
</head>
<body οnlοad='Init()'>
<canvas id="myCanvas" style="border:1px solid red;" width='600px' height='450px'></canvas>
</body>

</html>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值