webGl shader的学习记录(六):如何画出一个渐变色填充的矩形

其实将两个两个三角形合并一下,就出现了。一个矩形

使用两种方式  一个是两个buffer 一个是单一的buffer

glcl代码

<script type="shader-source" id="vertexShader">
		//浮点数设置为中等精度
		precision mediump float;
		//接收 JavaScript 传递过来的点的坐标(X, Y)
		attribute vec2 a_Position;
		// 接收canvas的尺寸。
		attribute vec2 a_Screen_Size;
		//接收 JavaScript 传递过来的点的颜色信息(R, G, B, A)
		attribute vec4 a_Color;
		//将顶点着色器插值后的颜色颜色信息(R, G, B, A)传递给片元着色器。
		varying vec4 v_Color;
		void main(){
			// 将 canvas 的坐标值 转换为 [-1.0, 1.0]的范围。
			vec2 position = (a_Position / a_Screen_Size) * 2.0 - 1.0;
			// canvas的 Y 轴坐标方向和 设备坐标系的相反。
			position = position * vec2(1.0, -1.0);
			// 最终的顶点坐标。
			gl_Position = vec4(position, 0.0, 1.0);
			v_Color = a_Color;
		}
	</script>
<script type="shader-source" id="fragmentShader">
		//浮点数设置为中等精度
		precision mediump float;
		//用来接收顶点着色器传递过来的颜色。
		varying vec4 v_Color;
		void main(){
			// 将颜色处理成 GLSL 允许的范围[0, 1]。
			vec4 color = v_Color / vec4(255, 255, 255, 1);
			// 点的最终颜色。
			gl_FragColor = color;
		}
	</script>

js代码 使用两个buffer的代码

 var canvas = document.getElementById('canvas');
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    var gl = canvas.getContext('webgl');
    console.log('当前的进度1');

    //创建顶点着色器
    var vertxShader = gl.createShader(gl.VERTEX_SHADER);
    var vertxShaderSource = document.querySelector('#vertexShader').innerHTML;
    gl.shaderSource(vertxShader,vertxShaderSource);//方法用于设置 WebGLShader 着色器(顶点着色器及片元着色器)的GLSL程序代码。
    gl.compileShader(vertxShader);//用于编译一个GLSL着色器,使其成为为二进制数据,然后就可以被WebGLProgram对象所使用.
    //创建片元着色器
    var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
    var fragmentShaderSource = document.querySelector('#fragmentShader').innerHTML;
    gl.shaderSource(fragmentShader,fragmentShaderSource);
    gl.compileShader(fragmentShader);
    //创建可以使用的program;
    var program = gl.createProgram();
    gl.attachShader(program,vertxShader);//方法负责往 WebGLProgram 添加一个片段或者顶点着色器。
    gl.attachShader(program,fragmentShader);//方法负责往 WebGLProgram 添加一个片段或者顶点着色器
    gl.linkProgram(program);//方法链接一个给定的WebGLProgram 到已附着的顶点着色器和片段着色器。
    gl.useProgram(program);//方法将定义好的WebGLProgram 对象添加到当前的渲染状态中。


    var a_Screen_Size = gl.getAttribLocation(program,'a_Screen_Size');
    gl.vertexAttrib2f(a_Screen_Size,canvas.width,canvas.height);


    //取到顶点着色器中的相关变量
    var a_Position = gl.getAttribLocation(program,'a_Position');
    var a_Color = gl.getAttribLocation(program,'a_Color');
    //允许变量使用
    gl.enableVertexAttribArray(a_Position);
    gl.enableVertexAttribArray(a_Color);
    //创建出一个弧顶的矩形
    // var positions = [
    //
    //     30, 30, 0, 255, 0, 1,    //V0
    //     300, 300, 0, 255, 0, 1,  //V2
    //     300, 30, 0, 255, 0, 1,    //V3
    //     30, 30, 255, 0, 0, 1,    //V0
    //     30, 300, 255, 0, 0, 1,   //V1
    //     300, 300, 255, 0, 0, 1,  //V2
    // ]
    var positions = [
        30, 30,   //V0
        30, 300,   //V1
        300, 300,  //V2
        30, 30,    //V0
        300, 300,  //V2
        300, 30,    //V3
    ]
    // // //颜色的变化
    var colors =[];
    let color = randomColor();
    colors.push(randomColor().r,  randomColor().g,  randomColor().b,  randomColor().a);
    colors.push( randomColor().r,  randomColor().g,  randomColor().b,  randomColor().a);
    colors.push( randomColor().r,  randomColor().g,  randomColor().b,  randomColor().a);
    colors.push( randomColor().r,  randomColor().g,  randomColor().b,  randomColor().a);
    colors.push( randomColor().r,  randomColor().g,  randomColor().b,  randomColor().a);
    colors.push( randomColor().r,  randomColor().g,  randomColor().b,  randomColor().a);
    console.log('colors:',colors)
    // 随机生成一个颜色。
    // let buffer = gl.createBuffer();
    // // 绑定缓冲区为当前缓冲
    // gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
    // // 设置 a_Position 属性从缓冲区读取数据方式
    // gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 24, 0);
    // // 设置 a_Color 属性从缓冲区读取数据方式
    // gl.vertexAttribPointer(a_Color, 4, gl.FLOAT, false, 24, 8);
    // // 向缓冲区传递数据
    // gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
    // 创建一个顶点缓冲区
    var positionBuffer = gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER,positionBuffer);
    // 设置 a_Position 变量读取 positionBuffer 缓冲区的方式。
    var size = 2;
    var type = gl.FLOAT;
    var normalize = false;
    var stride = 0;
    var offset = 0;
    gl.vertexAttribPointer(
        a_Position, size, type, normalize, stride, offset);


    var colorBuffer = gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER,colorBuffer);
    var size = 4;
    var type = gl.FLOAT;
    var normalize = false;
    var stride = 0;
    var offset = 0;
    gl.vertexAttribPointer(
        a_Color, size, type, normalize, stride, offset);

    //开始绘画
    gl.bindBuffer(gl.ARRAY_BUFFER,positionBuffer);
    gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(positions),gl.STATIC_DRAW);
    gl.bindBuffer(gl.ARRAY_BUFFER,colorBuffer);
    gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(colors),gl.STATIC_DRAW);





    gl.clearColor(0,0,0,1)
    /*渲染*/
    gl.clear(gl.COLOR_BUFFER_BIT);
    if (positions.length > 0) {
        gl.drawArrays(gl.TRIANGLES, 0, positions.length / 2);
    }




    function randomColor() {
        return {
            r: Math.random() * 255,
            g: Math.random() * 255,
            b: Math.random() * 255,
            a: Math.random() * 1
        };
    }

下面是使用一个buffer写出来代码

   var canvas = document.getElementById('canvas');
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    var gl = canvas.getContext('webgl');
    console.log('当前的进度1');

    //创建顶点着色器
    var vertxShader = gl.createShader(gl.VERTEX_SHADER);
    var vertxShaderSource = document.querySelector('#vertexShader').innerHTML;
    gl.shaderSource(vertxShader,vertxShaderSource);//方法用于设置 WebGLShader 着色器(顶点着色器及片元着色器)的GLSL程序代码。
    gl.compileShader(vertxShader);//用于编译一个GLSL着色器,使其成为为二进制数据,然后就可以被WebGLProgram对象所使用.
    //创建片元着色器
    var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
    var fragmentShaderSource = document.querySelector('#fragmentShader').innerHTML;
    gl.shaderSource(fragmentShader,fragmentShaderSource);
    gl.compileShader(fragmentShader);
    //创建可以使用的program;
    var program = gl.createProgram();
    gl.attachShader(program,vertxShader);//方法负责往 WebGLProgram 添加一个片段或者顶点着色器。
    gl.attachShader(program,fragmentShader);//方法负责往 WebGLProgram 添加一个片段或者顶点着色器
    gl.linkProgram(program);//方法链接一个给定的WebGLProgram 到已附着的顶点着色器和片段着色器。
    gl.useProgram(program);//方法将定义好的WebGLProgram 对象添加到当前的渲染状态中。


    var a_Screen_Size = gl.getAttribLocation(program,'a_Screen_Size');
    gl.vertexAttrib2f(a_Screen_Size,canvas.width,canvas.height);


    //取到顶点着色器中的相关变量
    var a_Position = gl.getAttribLocation(program,'a_Position');
    var a_Color = gl.getAttribLocation(program,'a_Color');
    //允许变量使用
    gl.enableVertexAttribArray(a_Position);
    gl.enableVertexAttribArray(a_Color);
    //创建出一个弧顶的矩形
    var positions = [
        30, 30, 0, 255, 0, 1,    //V0
        300, 300, 0, 255, 0, 1,  //V2
        300, 30, 0, 255, 0, 1,    //V3
        30, 30, 255, 0, 0, 1,    //V0
        30, 300, 255, 0, 0, 1,   //V1
        300, 300, 255, 0, 0, 1,  //V2
    ]
    // var positions = [
    //     30, 30,   //V0
    //     30, 300,   //V1
    //     300, 300,  //V2
    //     30, 30,    //V0
    //     300, 300,  //V2
    //     300, 30,    //V3
    // ]
    // // //颜色的变化
    // var colors =[];
    // let color = randomColor();
    // colors.push(randomColor().r,  randomColor().g,  randomColor().b,  randomColor().a);
    // colors.push( randomColor().r,  randomColor().g,  randomColor().b,  randomColor().a);
    // colors.push( randomColor().r,  randomColor().g,  randomColor().b,  randomColor().a);
    // colors.push( randomColor().r,  randomColor().g,  randomColor().b,  randomColor().a);
    // colors.push( randomColor().r,  randomColor().g,  randomColor().b,  randomColor().a);
    // colors.push( randomColor().r,  randomColor().g,  randomColor().b,  randomColor().a);
    // console.log('colors:',colors)
    // 随机生成一个颜色。
    let buffer = gl.createBuffer();
    // 绑定缓冲区为当前缓冲
    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
    // 设置 a_Position 属性从缓冲区读取数据方式
    gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 24, 0);
    // 设置 a_Color 属性从缓冲区读取数据方式
    gl.vertexAttribPointer(a_Color, 4, gl.FLOAT, false, 24, 8);
    // 向缓冲区传递数据
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
    // 创建一个顶点缓冲区
    // var positionBuffer = gl.createBuffer();
    // gl.bindBuffer(gl.ARRAY_BUFFER,positionBuffer);
    // // 设置 a_Position 变量读取 positionBuffer 缓冲区的方式。
    // var size = 2;
    // var type = gl.FLOAT;
    // var normalize = false;
    // var stride = 0;
    // var offset = 0;
    // gl.vertexAttribPointer(
    //     a_Position, size, type, normalize, stride, offset);
    //
    //
    // var colorBuffer = gl.createBuffer();
    // gl.bindBuffer(gl.ARRAY_BUFFER,colorBuffer);
    // var size = 4;
    // var type = gl.FLOAT;
    // var normalize = false;
    // var stride = 0;
    // var offset = 0;
    // gl.vertexAttribPointer(
    //     a_Color, size, type, normalize, stride, offset);
    //
    // //开始绘画
    // gl.bindBuffer(gl.ARRAY_BUFFER,positionBuffer);
    // gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(positions),gl.STATIC_DRAW);
    // gl.bindBuffer(gl.ARRAY_BUFFER,colorBuffer);
    // gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(colors),gl.STATIC_DRAW);





    gl.clearColor(0,0,0,1)
    /*渲染*/
    gl.clear(gl.COLOR_BUFFER_BIT);
    if (positions.length > 0) {
        // gl.drawArrays(gl.TRIANGLES, 0, positions.length / 2);
        gl.drawArrays(gl.TRIANGLES, 0, positions.length / 6);
    }




    function randomColor() {
        return {
            r: Math.random() * 255,
            g: Math.random() * 255,
            b: Math.random() * 255,
            a: Math.random() * 1
        };
    }
发布了65 篇原创文章 · 获赞 18 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/huhudeni/article/details/103242626
今日推荐