2、使用uniform定义一个水平偏移量,在顶点着色器中使用这个偏移量把三角形移动到屏幕右侧。
着色器是使用一种叫GLSL的类C语言写成的。GLSL是为图形计算量身定制的,它包含一些针对向量和矩阵 *** 作的有用特性。
着色器的开头总是要声明版本,接着是输入和输出变量、uniform和main函数。每个着色器的入口点都是main函数桥掘,在这个函数中我们处理所有的输入变量,并将结果输出到输出变量中。
虽然着色器是各自独立的小程序,但是它们洞猛都是一个整体的一部分,出于这样的原因,我们希望每个着色器都有输入和输出,这样才能进行数据交流和传递。
GLSL定义了in和out关键字专门来实现这个目的。每个着色器使用这两个关键字设定输入和输出,只要一个输出变量与下一个着色器阶段的输入匹配,它就会传递下去。但在顶点和片段着色器中会有点不同。
如果我们打算从一个着色器向另一个着色器发送数据,我们必须在发送方着色器中声明一个输出,在接收方着色器中声明一个类似的输入。当类型和名字都一样的时候,OpenGL就会把两个变量链接到一起,它们之间就能发送数据了(这是在链接程序对象时完成的)。
Uniform是一种从CPU中的应用向GPU中的着色器发送数据的方式,但uniform和顶点属性有些不同。首先,uniform是全局的(Global)。全局意味着uniform变量必须在每个着色器程序对象中都是独一无二的,而且它可以被着色器程序的任意着色器在任意阶段访问。第二,无论你把uniform值设置成什么,uniform会一直保存它们的数据,直到它们被重置或更新。
1、顶点坐标的 Y 值 乘以 -1,即 使三角形反转。(图形向量转换)
2、 渲染阶段,在程序中设定offset 值,传送给着色器。
3、glGetUniformLocation方法:获取着色器程序中,指定为uniform类型变量的id。
4、glUniform1f(GLint location, GLfloat v0)location指明要更改的uniform变量的位置;v0指明在指定的uniform变量中要使用的新敏颤核值。
5、offset = 0.5
glUniform1f(glGetUniformLocation(self.program, "xOffset"), offset)将0.5的值赋给GLSL程序中的xOffset变量。
GLSL几个要点
限定符
在之前的博客中也提到了,GLSL中的限定符号主要有:
attritude:一般用于各个顶点各不相同的量。如禅山顶点颜色、坐标等。 输入
uniform:一般用于对于3D物体中所有顶点都相同的量。比如光源位置,统一变换矩阵等。
varying:表示易变量,一般用于顶点着色器传递到片元着色器的量。输出,vetexshader和fragshader数据的传递
const:常量。
privatestaticfinalStringVERTEX_SHADER="attribute vec4 position\n"+
"attribute vec4 inputTextureCoordinate\n"+
"attribute vec4 inputTextureCoordinate2\n"+
"\n"+
"varying vec2 textureCoordinate\n"+
"varying vec2 textureCoordinate2\n"+
"\n"+
"void main()\n"+
"{\n"+
" gl_Position = position\n"+
" textureCoordinate = inputTextureCoordinate.xy\n"+
" textureCoordinate2 = inputTextureCoordinate2.xy\n"+
"}"
publicstaticfinalStringALPHA_BLEND_FRAGMENT_SHADER="varying highp vec2 textureCoordinate\n"+
" varying highp vec2 textureCoordinate2\n"+
"\n"+
" uniform sampler2D inputImageTexture\n"+
" uniform sampler2D inputImageTexture2\n"+
"\n"+
" uniform lowp float mixturePercent\n"+
"\n"+
" void main()\n"+
" {\n"+
" lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate)\n"饥袭卖+
" lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2)\n"+
"\n"+
" gl_FragColor = vec4(mix(textureColor.rgb, textureColor2.rgb, textureColor2.a * mixturePercent), textureColor.a)\n"+
" }"
以上是一个典型的顶点着色器和片段着色器
inputTextureCoordinatetextureCoordinate2 顶点传入
position 绑定烂逗顶点坐标
inputImageTexture
inputImageTexture2 创建并绑定纹理
inputTextureCoordinate
inputTextureCoordinate2绑定纹理坐标
textureCoordinate2作为片段着色器的输出 最终生成gl_FragColor
对于抖音特效,其实就改变gl_Position 和 gl_FragColor
OpenGL着色语言(GLSL―OpenGLShadingLanguage)是用来在OpenGL中着色编程的语言,也即开发人员写的短小的自定义程序,他们是在图形卡的GPU(GraphicProcessorUnit图形处理单元)上执行的,代替了固定的渲染管线的一部分,使渲染管线中不同层次具有可编程型。比如:视图转换、投影转换等。GLSL(GLShadingLanguage)的着色器代码分成2个部分:VertexShader(顶点着色器)和Fragment(片断着色器),有时还会有GeometryShader(几丛铅何着色器)。渗闭好负责运行顶点着色的是顶点着色器。它可以得到当前OpenGL中的状态,GLSL内置变量进行传递。GLSL其使用C语言作为基础高阶着色语言,避免了态首使用汇编语言或硬件规格语言的复杂性。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)