限定符
在之前的博客中也提到了,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
1、修改顶点着色器让三角形上下颠倒;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变量。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)