OpenGL ES _ 着色器_顶点着色器和片断着色器详解

一、顶点着色器

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


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,

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

二、片段着色器

输入值和输出值

片段着色器内置变量


输入值:片段着色器接受顶点管线最终输出的迭代值,这些值包括片段的位置,已解析的主颜色和辅助颜色,一系列的纹理坐标以及片段的雾坐标距离。

下面这个表格,将是对这些变量的详细介绍

变量 类型 描述
gl_FragCoord vec4 片断的位置,包含z成分,它表示固定功能所计算的深度值,只读
glFrontFacing bool 只读,指定这个片段是否属于一个正面图元
gl_Color vec4 片段着色器的主色
gl_SecondColor vec4 片段的辅助颜色
gl_TexCoord[n] vec4 片段的第n纹理坐标
gl_FogFragCoord float 片段的雾坐标 要么指定为视觉空间中的图元的z坐标,或者差值雾坐标
gl_PointCoord vec2 gl_PointCoord是片元着色器的内建只读变量,它的值是当前片元所在点图元的二维坐标。点的范围是0.0到1.0。如果当前的图元不是一个点,那么从gl_PointCoord读出的值是未定义的。  

特殊的输出值
在片段着色器中,特殊的输入值经过组合,产生片断的最终值.
gl_FragColor 是片断的最终颜色。
gl_FragDepth 片断的深度值
gl_FragData 允许把数据写入到额外的缓冲区中

如何渲染多个缓冲区

片段着色器可以使用gl_FragData 数组,把值同时输出到多个缓冲区,在数组元素gl_FragData[n] 中写入一个值将导致这个颜色被写入到缓冲区中一个适当的片段中,这个片段位于传递给glDrawBuffers()函数的数组的第n个元素中,片断着色器把值写入到gl_FragColor 或者gl_FragData 中,但是不能同时写入到两者中.

三、内建变量

(1)内建变量gl_FragCoord

屏幕空间坐标与通过OpenGL的glViewport所定义的视口密切相关,并且可以直接使用GLSL内建变量gl_FragCoord从片段着色器中直接访问。gl_FragCoord的x和y分量代表了片段的屏幕空间坐标(其中(0, 0)位于左下角)。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值