美文网首页
OpenGL ES 光照计算(v15)

OpenGL ES 光照计算(v15)

作者: 忆痕无殇 | 来源:发表于2019-07-17 16:47 被阅读0次

    一:顶点着色器

    precision highp float;
    
    varying lowp vec2 vTextCoor;
    varying lowp vec4 varyColor;
    uniform sampler2D colorMap;
    
    void main()
    {
       vec4 weakMask = texture2D(colorMap, vTextCoor);
        vec4 mask = varyColor;
        float alpha = 0.3;
        
        vec4 tempColor = mask * (1.0 - alpha) + weakMask * alpha;
        gl_FragColor = tempColor;
    }
    
    // gl_Position
    // gl_PointSize
    
    2:顶点着色器任务

    1:矩阵变换位置
    2:计算光照公式生成逐顶点颜色
    3:生成/变换纹理坐标
    总结:它可以用于执行自定义计算,实施新的变换,照明或者传统的固定功能所不允许的基于顶点的效果。

    3:顶点着色器内建特殊变量
    gl_VertexID
    gl_InstanceID
    gl_Position
    gl_PointSize
    gl_FrontFacing
    
    4:内建Uniform--统一变量

    参考:https://blog.csdn.net/linuxheik/article/details/79582106
    shader中与外部连接的常量,初始化之后不能够修改其值。否则会引起编译错误。
    在shader中定义

    uniform mat4 projectionMatrix;
    uniform mat4 modelViewMatrix;
    

    在外部调用

      //11.找到myProgram中的projectionMatrix、modelViewMatrix 2个矩阵的地址。如果找到则返回地址,否则返回-1,表示没有找到2个对象。
        GLuint projectionMatrixSlot = glGetUniformLocation(self.myProgram, "projectionMatrix");
        GLuint modelViewMatrixSlot = glGetUniformLocation(self.myProgram, "modelViewMatrix");
    
    5:顶点着色器内建常量
    const mediump int gl_MaxVertexAttribs = 16;             //顶点着色器中属性的最大数量
    const mediump int gl_MaxVertexUniformVectors = 256;     //顶点着色器中统一变量的最大数量
     const mediump int gl_MaxVertexOutputVectors = 16;     //顶点着色器中输出向量的最大数量
    const mediump int gl_MaxVertexTextureImageUnits = 16;  //顶点着色器中纹理单元的最大数量
    const mediump int gl_MaxCombinedTextureImageUnits = 32;//顶点着色器和片元着色器中纹理单元最大数量的总和
    
    
    6:内建特殊变量
    变量 描述
    gl_VertexID 输入变量,用于保存顶点的整数索引。highp 精度的整数变量
    gl_InstanceID 输入变量,用于保存实例化绘图调用中图元的实例编号。highp 精度的整数变量,通常情况下为 0
    gl_Position 输出变量,用于输出顶点作为的裁剪坐标。highp 精度的浮点变量
    gl_PointSize 用于指定点精灵的尺寸,单位为像素。highp 精度的浮点变量
    gl_FrontFacing 不由顶点着色器直接写入,而是根据顶点着色器生成的位置值和渲染的图元类型生成,它是一个布尔变量

    6:顶点着色器矩阵变换

    MVP(矩阵变换)
    模型--->视图--->投影

    二:片元着色器

    precision highp float;
    
    varying lowp vec2 vTextCoor;
    varying lowp vec4 varyColor;
    uniform sampler2D colorMap;
    
    void main()
    {
    
        vec4 weakMask = texture2D(colorMap, vTextCoor);
        vec4 mask = varyColor;
        float alpha = 0.3;
        
        vec4 tempColor = mask * (1.0 - alpha) + weakMask * alpha;
        gl_FragColor = tempColor;
    }
    //gl_FragColor
    
    2:片元着色器业务

    1:计算颜色
    2:获取纹理
    3:往像素点中填充颜色值【纹理值/颜色值】
    总结:它可以用于图片。视频。图形中每个像素的颜色填充【比如给视频添加滤镜,实际上就是将视频中每个图片的像素点颜色填充进行修改】

    3:内建常量
    const mediump int gl_MaxFragmentInputVectors = 15; //片元着色器出入的最大数量
    const mediump int gl_MaxTextureImageUnits = 16;//可用纹理图像单元的最大数量
    const mediump int gl_MaxFragmentUniformVectors = 224;//片元着色器可用vec4 uniform变量的最大数量
    const mediump int gl_MaxDrawBuffers = 4; //多重渲染目标最大支持数量
    
    4:内建特殊变量
    变量 描述
    gl_FragCoord 只读变量,这个变量保存片元的窗口相对坐标
    gl_ForntFacing 只读变量,这个布尔变量是正面图元时为true否则为false
    gl_PointCoord 只读变量,可以在渲染点精灵的时候使用,保存了点精灵的纹理坐标,这个坐标在点精灵光栅化期间自动生成,处于(0,1)区间。
    gl_FragDepth 一个只写输出变量,在片元着色器写入时,覆盖片元的固定功能深度值,尽量减少手动实现深度值写入,这个功能需要谨慎使用,因为它可能禁用许多GPU的深度优化,例如:许多GPU都有“Early-z”的功能,在执行片元着色器之前进行深度测试,使用“Early-z”的好处就是不能通过深度测试的片元就不会被着色(从而降低了着色器的调用次数,提高了性能)但是使用gl_FragDepth,就必须禁用该功能,因为GPU在执行着色器之前不知道深度值。
    5:内建函数

    常用内建函数

    函数 说明
    dot 点乘
    cross 叉乘
    texture2D 用于对纹理采样
    normalize 对于一个向量规格化
    clamp 将一个向量固定在一个最小值和最大值之间
    pow 幂函数(对矢量和标量同样有效,下同)
    exp,log 指数函数,对数函数
    abs 绝对值
    sqrt 平方根
    max,min 最值
    ceil,floor 去大于实参的最小整数,取小于实参的最大整数
    sin,cos,tan 正三角函数
    asin,acos,atan 反三角函数
    length 向量长度
    distance 两个向量的距离
    matrixCompMult 矩阵对应元素分别相乘
    transpose,determinant,inverse 矩阵的转置,行列式,逆
    lessThan,greaterThan,equal 小于,大于,等于(对实参向量对应位置的每个分量做大小比较,生成布尔向量)

    相关文章

      网友评论

          本文标题:OpenGL ES 光照计算(v15)

          本文链接:https://www.haomeiwen.com/subject/vlgnkctx.html