美文网首页iOSOpenGL+Metal
OpenGL ES _ 着色器_ 顶点着色器详解

OpenGL ES _ 着色器_ 顶点着色器详解

作者: 酷走天涯 | 来源:发表于2016-08-16 17:13 被阅读1945次

    OpenGL ES _ 入门_01
    OpenGL ES _ 入门_02
    OpenGL ES _ 入门_03
    OpenGL ES _ 入门_04
    OpenGL ES _ 入门_05
    OpenGL ES _ 入门练习_01
    OpenGL ES _ 入门练习_02
    OpenGL ES _ 入门练习_03
    OpenGL ES _ 入门练习_04
    OpenGL ES _ 入门练习_05
    OpenGL ES _ 入门练习_06
    OpenGL ES _ 着色器 _ 介绍
    OpenGL ES _ 着色器 _ 程序
    OpenGL ES _ 着色器 _ 语法
    OpenGL ES_着色器_纹理图像
    OpenGL ES_着色器_预处理
    OpenGL ES_着色器_顶点着色器详解
    OpenGL ES_着色器_片断着色器详解
    OpenGL ES_着色器_实战01
    OpenGL ES_着色器_实战02
    OpenGL ES_着色器_实战03

    学习是一件开心的额事情

    提醒广大网友,当你看到这篇文章的时候,以后写的关于OpenGL 更多的便是代码实战了!

    本节学习目标

    • 内置的属性输入变量
    • 用户定义的属性变量
    • 如何把顶点数据通过应用程序发送到着色器程序
    • 特殊输出变量

    在讲解内容之前,先看一张图

    GLSL 顶点着色器的输入和输入变量

    先讲讲这个图!箭头的方向表示输入和输出

    • uniform 变量,程序中保持常量
    • attribute 变量,除了标准的顶点状态,他们还可以根据顶点进行更新
    • varying 变量,用于向片段管线传递数据,这些数据包括颜色,纹理坐标和其它基于片段的数据

    内置的属性输入变量

    这些变量反应了当前的OpenGL 状态

    |变量|类型|指定函数|描述|
    |---|
    |gl_Vertex|vec4|glVertex|顶点的全局空间坐标|
    |gl_Color|vec4|glColor|主颜色值|
    |gl_SecondaryColor|vec4|glSecondaryColor|辅助颜色|
    |gl_Normal|vec4|glNormal|光照法线|
    |gl_MultiTexCoordn|vec4|glMultiTexCoord(n,...)|纹理单元n的纹理坐标,n取值为0·7|
    |gl_FogCoord|float|glFogCoord|雾坐标|
    |gl_VertexID|int|-|自上次渲染开始,当前的索引|
    |gl_InstanceID|int|glDrawArraysInstanced,<p>glDrawElementsInstanced|相关图元的实例ID|


    用户定义的属性变量

    用户定义的属性变量都是全局变量,在OpenGL 应用程序将值传递给着色器程序。
    用户定义的属性变量类型可以是 float、vec和mat

    着色器程序和应用程序的关系图

    如上图,着色器程序和应用程序是两块独立的程序,我们要在应用程序中,链接着色器程序,着色器程序执行后,对OpenGL 进行渲染。如果想要了解更多着色器程序相关的内容请点击这里

    接下来,我们重点讲讲如何给着色器中的自定义变量赋值.
    1.首先你要拿到这个变量的索引
    GLint glGetAttribLocation(GLuint program,const char *name)
    2.指定program下次执行时,那个索引应该和name相关联
    void glBindAttribLocation(Glint program,GLuint index,const char *name)
    3.给索引设置关联的值
    void glVertexAttrib{1234}{sfd}(GLuint index,TYPE values);
    void glVertexAttrib{123}{sfd}v{GLuint index,const TYPE *values};
    void glVertexAttrib4{bsifd ub us ui}v{GLuint index,TYPE values};
    void glVertexAttrib4Nub{GLuint index,TYPE values};
    void glVertexAttrib4N{bpsi ub us ui}v{GLuint index,const Type};
    void glVertexAttribI{1234}{i ui}(GLuint index,TYPE values);
    void glVertexAttriI4{psi ub us ui}v{Glint index,const TYPE *values};

    特殊输出变量

    gl_Position 指定了着色器在推出执行之后顶点的最终位置。这个变量必须写入到着色器中.
    gl_Position 输出顶点的位置计算公式:
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    如果想要让顶点着色器的结果与固定功能的管线保持一致,可以使用下面的代码设置:
    gl_Postition = transform()
    gl_PointSize 用于控制点的输出大小,如果想要顶点着色器程序内部控制点的大小,可以调用glEnable(GL_VERTEX_PROGRAM_POINT_SIZE) 函数,它将覆盖当前可能已指定的任何点的大小值。
    用户定义的裁剪平面,可以编写一个齐次坐标写入到gl_ClipVertex 变量中。为了正确的处理裁剪,被指定的平面以及写入到gl_ClipVertex 的坐标必须位于相同的坐标空间中。普通的裁剪空间是在视觉坐标坐标系中的,可以把当前的顶点变换到视觉坐标戏中便于进行裁剪:
    gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;

    技能提高:
    顶点着色器能够为顶点设置正面和背面颜色值,在默认情况下,不管顶点着色器内部怎么设置这些顶点,实际选择的将是正面颜色,那怎么显示背面的颜色呢?
    调用 glEanable(GL_VERTEX_PROGRAM_TWO_SIDE 值为参数),就可以根据底层图元的方向来选择颜色.

    顶点着色器中使用纹理贴图
    1.查询是否可以使用纹理贴图
    glIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS)
    2.顶点着色器不能使用mipmap选择,但是可以使用texture*Load 函数手工选择mipmap

    相关文章

      网友评论

        本文标题:OpenGL ES _ 着色器_ 顶点着色器详解

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