zoukankan      html  css  js  c++  java
  • OpenGL Shader Key Points (2)


    1.  Uniform

    1.1.  Uniform变量

    不是所有的变量都是跟顶点一一对应的,如变换矩阵,光源位置等。

    Uniform变量可以在任何类型的shader中使用,但只能作为输入值,不能在shader中给它赋值,只能在C/C++程序中指定。

    layout (location = 0) in vec3 VertexPosition;
    layout (location = 1) in vec3 VertexColor;
    out vec3 Color;
    uniform mat4 RotationMatrix;
    void main()
    {
    Color = VertexColor;
    gl_Position = RotationMatrix *vec4(VertexPosition,1.0);
    }
     


    在程序中指定uniform的值:

    GLuint location =glGetUniformLocation(programHandle,  "RotationMatrix");
    if( location >= 0 )
    {
    glUniformMatrix4fv(location, 1, GL_FALSE,  &rotationMatrix[0][0]);
    }


    API:

             遍历shader program所有的uniform变量

             glGetProgramiv

    glGetActiveUniform

    glGetActiveUniformName

    glGetUniformLocation

    1.2.  Uniform blocks

    单独的uniform变量是跟shader program绑定的,因而不能在多shader program中共享。

    Uniform blocks用来在不同的shaderprogram中共享uniform数据。

    API:

    glGetUniformBlockIndex //根据名称找到uniformblocks的索引

    glGetActiveUniformBlockiv //根据索引找到blocks的大小

    glGetUniformIndices//根据uniform blocks的各分量的名字找到索引

    glGetActiveUniformsiv//找到各分量的便宜量,这样就可以分配block并设置分量的值。

    1.2.1.  创建uniform buffer object (UBO):

    GL_UNIFORM_BUFFER

    glGenBuffers

    glBindBuffer

    glBufferData

    glBindBufferBase // UBO与uniformblocks绑定

  • 相关阅读:
    HDU-5384
    UVALive 5099
    ZOJ-2753
    HUD-5379
    HDU-5360
    HDU-5351
    HDU-5335
    HDU-5317
    HDU-2487
    常用十六进制颜色对照表代码查询
  • 原文地址:https://www.cnblogs.com/aiwz/p/6333113.html
Copyright © 2011-2022 走看看