网站软件下载,网站做的一样算不算侵权,网站弹出广告代码,企业建设官方网站作用及意义一、Shader
1、什么是Shader#xff0c;为什么要使用Shder
#xff08;1#xff09;shader运行在gpu上的小程序 #xff08;2#xff09;以前使用固定管线#xff0c;但缺点是灵活度不够#xff0c;无法满足复杂需求#xff0c;为了解决固定管线的缺点#xff0c;出…一、Shader
1、什么是Shader为什么要使用Shder
1shader运行在gpu上的小程序 2以前使用固定管线但缺点是灵活度不够无法满足复杂需求为了解决固定管线的缺点出现了可编程管线可编程管线允许开发者自定义渲染过程提高了灵活度。 3Shader是可编程管线的一部分用于对各个阶段的自定义shader可充分利用gpu并行计算能力提高渲染速度Shader可通过编程对gpu灵活控制。
2、两种Shader
Vertex Shader–顶点Shader用于处理3D几何图形的顶点。Fragment Shader–片元Shader用于处理像素颜色和纹理
3、Shader的输入与输出
接收顶点数据输出构造好的三角形接收片元数据为每个像素设置不同的颜色
4、最基本的图形–三角形
图形学中三角形是最基本的图形所有复杂图形都是由三角形组成的三角形是由顶点和片元组成的
二、标准坐标系与屏幕坐标系
1、标准设备坐标系
屏幕中心是00xy的范围在[-1,1]之间是shader的输出坐标系 2、屏幕坐标系
屏幕左上角是00屏幕右下角是widthheight屏幕坐标系的单位是像素OpenGL会自动将标准设备坐标转成屏幕坐标系。
3、应用在什么地方
标准设备坐标系是Shader的输出屏幕坐标系用于模型的最终显示
4、标准设备坐标系到屏幕坐标系
先将标准坐标系中的顶点1每个顶点成衣屏幕的宽/高也可以通过一个变换矩阵直接完成两步操作。
三、着色器Shader作用及语法
1、GLSLGraphics Language Shader Language 基本语法
语法类似于C语言支持向量、矩阵等数学运算 attribute vec4 vPosition; void main() { gl_Position vPosition; }
2、数据的传递 (1)一个opengl程序包含了2个shader一个是vertex shader(用于处理顶点)一个是Fragment shader用于处理像素。 (2)可以将opengl shader比喻成一个芯片每个芯片都有许多引脚每个引脚都有唯一的id比如上图引脚id1引脚1关联是vertex shader 的vPosition引脚2 关联的是fragment shader的vColor. (3)当我们将数据传递给引脚1的时候会自动传递给vPosition同理fragment shader 会自动传递给vColor。 (4)如何将数据传送给引脚不同类型数据方法不同 以vPosition为例第一步如图调用opengl提供的api的glGetAttribLocation 来获取到vPosition变量对应的引脚。第二步拿到引脚ID之后调用glEnableVertexattribArrray()使得引脚处于开启状态第三步调用glVertexAttribPointer(ID,…,vertexData)将准备好的vertex data当做输入参数传入api中最终传给vPosition。这样vertextShader就可以通过vPosition得到数据。 以vColor为例由于vColor是uniform类型的变量它只需要2步首先是glGetUniformLocation来获取引脚位置第二步通过glUniform4fv将数据传递给内部vColor。 vertex shader 主要有上图几种变量类型attribute 类型、uniforms类型、Samplers类型变量一种uniforms的特殊类型主要用于纹理绘制
3、如何创建、编译和使用Shader程序
/*** 创建shader加载shader程序*/private fun loadShader(type: Int, shaderCode: String): Int {val shader GLES20.glCreateShader(type)GLES20.glShaderSource(shader, shaderCode)GLES20.glCompileShader(shader)return shader}private fun linkProgram(vertexShader: Int, fragmentShader: Int) {// 创建空的opengl es 程序program GLES20.glCreateProgram()program?.let {// 将顶点着色器加入程序GLES20.glAttachShader(it, vertexShader)// 将片元着色器加入程序GLES20.glAttachShader(it, fragmentShader)// 链接到着色器程序GLES20.glLinkProgram(it)// 将程序加入到opengl30环境中GLES20.glUseProgram(it)val info GLES20.glGetProgramInfoLog(it)// 打印链接程序日志Log.e(wdf, info info)}}使用 // 创建定点着色程序val vertexShader loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode)// 创建片元着色程序val fragmentShader loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode)linkProgram(vertexShader, fragmentShader)