Git Product home page Git Product logo

learn-webgl's Introduction

着色器

顶点着色器

    attribute vec4 a_Position; // 定义变量,可以在js中使用
    attribute float a_Size; 
    void main() {
        gl_Position = a_Position; // 顶点的位置
        gl_PositionSize = a_Size; // 顶点尺寸
    }

顶点着色器用于描述顶点位置和尺寸相关信息, js里使用该变量的api如下

const a_Position = gl.getAttribLocation(program, 'a_Position') gl.vertexAttrib3f(a_Position, controller.x, controller.y, controller.z)

片源着色器

    void main() {
        gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
    }

片源着色器用来描述颜色的

在webgl环境下着色器的使用

    // 创建着色器
    const v_shader:WebGLShader  = gl.createShader(gl.VERTEX_SHADER);
    const f_shader:WebGLShader = gl.createShader(gl.FRAGMENT_SHADER)
    // 添加着色器源码
    gl.shaderSource(v_shader, vShaderSource)
    gl.shaderSource(f_shader, fShaderSource)
    // 编译着色器源码
    gl.compileShader(v_shader)
    gl.compileShader(f_shader)
    if (!gl.getShaderParameter(v_shader, gl.COMPILE_STATUS)) {
        console.warn('linkProgram error', 'v_shader')
    }
    if (!gl.getShaderParameter(f_shader, gl.COMPILE_STATUS)) {
        console.warn('linkProgram error', 'f_shader')
    }
    // 创建程序 和链接着色器
    const program:WebGLProgram = gl.createProgram();
    gl.attachShader(program, v_shader);
    gl.attachShader(program, f_shader);
    // 链接程序
    gl.linkProgram(program);
    const linked = gl.getProgramParameter(program, gl.LINK_STATUS)
    // 使用程序
    gl.useProgram(program)
    if (!linked) {
        console.warn('linkProgram', linked)
    }
    return program

最后使用gl.drawArrays(gl.TRIANGLES, 0, n)将点画出来就行 ,画多个点的时候可以使用缓冲区

    // 创建一个缓冲区
    const verticesBuffer: WebGLBuffer = gl.createBuffer()
    if (!verticesBuffer) {
        console.error(verticesBuffer, vertices)
        return -1
    }
    //链接缓冲区
    gl.bindBuffer(gl.ARRAY_BUFFER, verticesBuffer)
    // 填充缓冲区的数据    
    gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW)
    // 将缓冲区和顶点着色器的变量关联
    gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0)
    // 启用缓冲区
    gl.enableVertexAttribArray(a_Position)

启用之后就可以使用缓冲区里的顶点绘制了

learn-webgl's People

Contributors

fwfx1234 avatar

Stargazers

 avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.