美文网首页OpenGL
0012 -- GLSL语言学习(二)

0012 -- GLSL语言学习(二)

作者: 清风烈酒2157 | 来源:发表于2020-08-06 20:14 被阅读0次

    [toc]

    着色器与程序

    需要创建2个基本对象才能用着⾊器进⾏行行渲染: 着⾊器对象和程序对象.

    获取链接后着⾊器对象的⼀一般过程包括6个步骤:

    • 创建一个顶点着⾊器对象和一个⽚段着⾊器对象
    • 将源代码链接到每个着⾊器对象
    • 编译着⾊器对象
    • 创建一个程序对象
    • 将编译后的着⾊器对象连接到程序对象
    • 链接程序对象

    创建与编译⼀一个着⾊器

    
    GLuint glCreateShader(GLenum type);
    
    

    type — 创建着⾊器的类型,GL_VERTEX_SHADER 或者GL_FRAGMENT_SHADER
    返回值 — 是指向新着⾊器对象的句柄.可以调glDeleteShader删除

    void glDeleteShader(GLuint shader);
    

    shader — 要删除的着⾊色器器对象句句柄

    void glShaderSource(GLuint shader , GLSizei count ,const GLChar * const *string, const GLint *length);
    
    

    shader — 指向着⾊器对象的句柄
    count — 着⾊色器器源字符串串的数量,着⾊器可以由多个源字符串组成,但是每个着⾊色器器只有⼀一个main函数 string — 指向保存数量量的count 的着⾊色器器源字符串的数组指针
    length — 指向保存每个着⾊器字符串⼤小且元素数量量为count 的整数数组指针

    void glCompileShader(GLuint shader); 
    
    

    shader— 需要编译的着⾊器对象句柄

    
    void glGetShaderiv(GLuint shader , GLenum pname , GLint *params );
    
    

    shader — 需要编译的着⾊器对象句柄
    pname — 获取的信息参数,可以为 GL_COMPILE_STATUS/GL_DELETE_STATUS/ GL_INFO_LOG_LENGTH/GL_SHADER_SOURCE_LENGTH/ GL_SHADER_TYPE
    params — 指向查询结果的整数存储位置的指针.

    void glGetShaderInfolog(GLuint shader , GLSizei maxLength, GLSizei *length , GLChar *infoLog);
    
    

    shader — 需要获取信息⽇志的着⾊器对象句柄
    maxLength — 保存信息日志的缓存区⼤小
    length — 写⼊入的信息⽇志的⻓长度(减去null 终⽌止符); 如果不不需要知道⻓长度. 这个参数可以为Null infoLog — 指向保存信息⽇日志的字符缓存区的指针.

    GLUint glCreateProgram( )
    

    创建⼀一个程序对象
    返回值: 返回⼀一个执行新程序对象的句柄

    void glDeleteProgram( GLuint program ) 
    
    

    program : 指向需要删除的程序对象句柄

    //着⾊色器器与程序连接/附着

    void glAttachShader( GLuint program , GLuint shader );
    
    

    program : 指向程序对象的句柄
    shader : 指向程序连接的着⾊器对象的句柄

    //断开连接

    void glDetachShader(GLuint program);
    

    program : 指向程序对象的句柄
    shader : 指向程序断开连接的着⾊器对象句柄

    glLinkProgram(GLuint program)
    

    program: 指向程序对象句句柄

    链接程序之后, 需要检查链接是否成功. 你可以使⽤用glGetProgramiv 检查链接状态:

    void glGetProgramiv (GLuint program,GLenum pname, GLint *params);
    

    program: 需要获取信息的程序对象句句柄

    pname : 获取信息的参数,可以是:

    1. GL_ACTIVE_ATTRIBUTES
    2. GL_ACTIVE_ATTRIBUTES_MAX_LENGTH
    3. GL_ACTIVE_UNIFORM_BLOCK
    4. GL_ACTIVE_UNIFORM_BLOCK_MAX_LENGTH
    5. GL_ACTIVE_UNIFROMS
    6. GL_ACTIVE_UNIFORM_MAX_LENGTH
    7. GL_ATTACHED_SHADERS
    8. GL_DELETE_STATUS
    9. GL_INFO_LOG_LENGTH
    10. GL_LINK_STATUS
    11. GL_PROGRAM_BINARY_RETRIEVABLE_HINT
    12. GL_TRANSFORM_FEEDBACK_BUFFER_MODE
    13. GL_TRANSFORM_FEEDBACK_VARYINGS
    14. GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH
    15. GL_VALIDATE_STATUS

    params : 指向查询结果整数存储位置的指针

    从程序信息⽇日志中获取信息

    void glGetPorgramInfoLog( GLuint program ,GLSizei maxLength, GLSizei *length , GLChar *infoLog )
    

    program : 指向需要获取信息的程序对象句柄
    maxLength : 存储信息⽇志的缓存区⼤小
    length : 写⼊入的信息⽇志⻓长度(减去null 终⽌止符),如果不不需要知道⻓长度,这个参数可以为Null. infoLog : 指向存储信息⽇志的字符缓存区的指针

    void glUseProgram(GLuint program) 
    
    

    program: 设置为活动程序的程序对象句柄.

    FrameBuffer & RenderBuffer

    FrameBuffer : 帧缓冲区 包含Color Attachment / Depth Attachment / Stencil Attchment (颜色/深度/模板)
    RenderBufer : 渲染缓冲区 实际存储着Depth Buffer / Stencil Buffer,
    FrameBuffer是一个管理者,

    image.png

    为什么要用FrameBufferRenderBuffer?它们是什么关系?

    image.png

    相关文章

      网友评论

        本文标题:0012 -- GLSL语言学习(二)

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