ios代码如何把数据传到顶点着色器和片元着色器中?
从上图中可以看到有三个通道可以传数据到顶点、片元着色器中(Attributes、Uniforms、TextureData)
- 属性(Attributes)只能传数据到顶点着色器(有以下三种)
1.顶点数据x,y,z,w
2.投影矩阵、模型矩阵
3.纹理坐标(图片映射坐标) - Uniforms(统一批次的)可以传数据(如变换矩阵 通道 颜色值)到顶点着色器以及片元着色器
- 纹理(TextureData)可以传纹理数据到顶点着色器以及片元着色器,但是纹理数据传到顶点着色器是没有意义(顶点着色器是处理顶点的)
顶点着色器部分
attribute vec4 Position; //顶点坐标
attribute vec2 TextureCoords; //纹理坐标
varying vec2 TextureCoordsVarying; //顶点着色器桥接到片元着色器
void main (void) {
gl_Position = Position;
TextureCoordsVarying = TextureCoods;
}
正投影
使用的API:
GLFrumstum::SetOrthographic(GLfloat xMax,GLfloat yMin,GLfloat yMax,GLfloat zMin,GLfloat zMax);
透视投影
GLFrustum类通过setPerspective 方法为我们构建一个平截头体,API如下:
GLFrustum::SetPerspective(float fFov,float fAspect,float fNear,float fFar);
参数:
fFov:垂直方向上的视场角度
fAspect:窗口的宽度与高度的纵横比
fNear:近裁剪面距离
fFar:远裁剪面距离
纵横比 = 宽(w)/高(h)
对于正投影与透视投影:
- 正投影 -> 显示2D(一样大的)
- 透视投影 -> 3D图形 (远小近大)
固定管线下的8种存储着色器:
固定着色器: 里面封装了顶点着色器和片元着色器
//GLShaderManager 的初始化
GLShaderManger shaderManager
shaderManager.InitializeStockShaders();
- 单元着色器:它是一种最简单的着色器
//着色器所有的方法名字都是用 UserStockShader
GLShaderManager::UserStockShader(GLT_SHADER_IDENTITY,GLfloat vColor[4]);
参数1: 存储着色种类-单元着色器
参数2: 颜色
使用场景:绘制默认OpenGL坐标系(-1,1)下图形,图形所有片段都会以一种颜色填充
- 平面着色器: 它是用的最多的一种
GLShaderManager::UserStockShader(GLT_SHADER_FLAT,GLfloat mvp[16],GLfloat vColor[4]);
参数1:存储着色器种类-平面着色器
参数2:允许变化的4*4矩阵
参数3:颜色
使用场景:在绘制图形时,可以应用变换(模型/投影变化).
- 上色着色器
GLShaderManager::UserStockShader(GLT_SHADER_SHADED,GLfloat mvp[16]);
参数1:存储着色器种类-上色着色器
参数2:允许变化的4*4矩阵
使用场景:在绘制图形时,可以应用变换(模型/投影变化) 颜色将会平滑地插入到顶点之间称为平滑着色.
- 默认光源着色器
GLShaderManager::UserStockShader(GLT_SHADER_LIGHT,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]);
参数1:存储着色器种类-默认光源着色器
参数2:模型4*4矩阵
参数3:投影4*4矩阵
参数4:颜色值
使用场景:在绘制图形时,可以应用变换(模型/投影变化) 这种着色器会使绘制的图形产生阴影和光照的效果.
- 点光源着色器
GLShaderManager::UserStockShader(GLT_SHADER_POINT_LIGHT,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vColor[4]);
参数1:存储着色器种类-点光源着色器
参数2:模型4*4矩阵
参数3:投影4*4矩阵
参数4:点光源的位置
参数5:颜色值
使用场景:在绘制图形时,可以应用变换(模型/投影变化) 这种着色器会使绘制的图形产生阴影和光照的效果.它与默认光源着色器非常相似,区别只是光源位置可能是特定的。
- 纹理替换矩阵着色器
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_REPLACE,GLfloat mvMatrix[16],GLint nTextureUnit);
参数1:存储着色器种类-点光源着色器
参数2:模型4*4矩阵
参数3:纹理单元
使用场景:在绘制图形时,可以应用变换(模型/投影变化) 这种着色器通过给定的模型试图投影矩阵。使用纹理单元来进行颜色填充,其中每个像素点的颜色是从纹理中获取的。
- 纹理调整着色器
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat mvMatrix[16],GLfloat vColor[4],GLint nTextureUnit);
参数1:存储着色器种类-点光源着色器
参数2:模型4*4矩阵
参数3:颜色值
参数4:纹理单元
使用场景:在绘制图形时,可以应用变换(模型/投影变化) 这种着色器通过给定的模型试图投影矩阵。着色器将一个基本色乘以一个取自纹理单元nTextureUnit的纹理。将颜色与纹理进行混合后才填充到片段中。
8.纹理光源着色器
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFE,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4],GLint nTextureUnit);
参数1:存储着色器种类-纹理光源着色器
参数2:模型4*4矩阵
参数3:投影4*4矩阵
参数4:点光源位置
参数5:颜色值(几何图形的基本色)
参数6:纹理单元
使用场景:在绘制图形时,可以应用变换(模型/投影变化) 这种着色器通过给定的模型试图投影矩阵。着色器将一个纹理通过漫反射照明计算进行调整(相乘)。
网友评论