大家好,今天小编来为大家解答以下的问题,关于深入解析OpenGL ES着色器技术,这个很多人还不知道,现在让我们一起来看看吧!
顶点着色器
从编程角度来看,顶点着色器是描述顶点着色器程序源代码或可执行文件的代码指令。顶点着色器包含以下部分:
顶点着色器输入。顶点着色器的输入是顶点数组提供的顶点数据。通过传入顶点着色器,可以进行矩阵变换、顶点颜色或光照计算等,这样输出就可以用于后续的图元组装、光栅化,然后到片段着色器。的操作。统一变量。顶点着色器中的常量数据通常被传递到计算出的旋转矩阵中以实现模型-视图-投影坐标转换采样器。将在后续纹理处理中使用的特殊变量。纹理获取不会传递指向GLSL 的指针,而是通过纹理ID 绑定在内存中查找。一种特殊的统一变量类型,表示顶点着色器使用的纹理;
顶点着色器示例
一个简单的顶点着色器代码
第2行指定使用的着色器版本;第3行和第4行分别指定position和color的属性位置索引为1和2;第5行描述了统一变量u_MVPMatrix,开发者可以自定义该变量。传入计算出的模型-视图-投影矩阵;第6 行声明了一个描述顶点纹理坐标的输出变量,存储每个顶点纹理输出。其中,gl_Position是一个内置变量,需要将变换后的顶点坐标写入到该变量中;第9行是将矩阵变换后的坐标输出写入gl_Position;第10行是读入顶点纹理坐标并将其写入v_texCoord变量以供后续片段着色器写入。
片段着色器
片段着色器包含以下部分:
在顶点着色器中生成的插值数据输入。顶点着色器的输出由基元进行转换,并作为输入变量传递给片段着色器。统一变量。这些变量在片段着色器上不会改变。采样器。片段着色器使用特殊变量来访问着色器中的纹理图像。
片段着色器示例
一个简单的片段着色器代码
第2行指定着色器语言版本;第3 行设置精度限定符;第4行声明一个输入变量,该变量由顶点着色器输出并由图元转换为片段着色器的输入变量;第5行表示输出颜色的位置属性索引为0;第6行声明了一个统一变量,用于后续设置输入纹理;第9行,s_Texturemap是sampler2D类型的统一变量,内置函数texture会从纹理图中提取并读取并加载相应的纹理。开发过程包括使用glActiveTexure激活当前纹理单元,以便后续的glBindTexture调用可以将纹理绑定到当前活动单元。
着色器装载和使用
要执行着色器渲染,需要创建两个基本对象,即着色器对象和程序对象。下面将分为4个部分来介绍Shader渲染所需的所有前期步骤:
创建和编译着色器创建和链接程序获取和设置统一变量获取和设置属性1. 创建和编译着色器创建和编译着色器代码图1中,使用glCreateShader(GLenum着色器)创建着色器对象; 2是使用glShaderSource(GLuint Shader,GLsizei count,const GLchar* const *string,const GLint *length)向着色器提供着色器源代码; 3是指定shader后进行编译,使用glCompileShader(GLuint shader)。经过这个链接,着色器的创建和编译就完成了。后续代码第四步是提供查询编译是否错误以及shader对象的相关信息,使用glGetShaderiv(GLuint shader, GLenum pname, GLint *params);另外,如果想进一步检索信息日志,可以在步骤5中使用glGetShaderInfoLog(GLuint Shader, GLsizei maxLength, GLsizei *length, GLchar *infoLog)。最后,如果着色器对象没有创建或者有其他错误,可以使用第6步中的glDeleteShader(GLuint着色器)来删除着色器对象的句柄并释放内存。
2. 创建和链接程序创建和链接程序代码的第一步,通过glCreateProgram()方法创建程序对象,该方法返回一个指向该对象的句柄;第二步,使用glAttachShade(GLuintprogram,GLuintshader)来连接program对象和shader。连接,值得注意的是,每个程序对象都需要连接一个顶点着色器和一个片段着色器;完成程序对象与着色器的连接后,可以通过步骤3的glLinkProgram(GLuint程序)完成程序对象的链接,即最终的可执行程序;第4步是完成链接后断开程序对象与着色器的连接,使用glDetachShader(GLuint program, GLuint Shader);步骤5、6与上面的着色器信息查询相同,同样程序链接完成后,可以通过glGetProgramiv(GLuint program, GLenum pname, GLint *params)查看链接状态,并获取相关信息日志程序通过glGetProgramInfoLog(GLuint program, GLsizei maxLength, GLsizei *length, GLchar *infoLog);上一章第七步如果程序对象创建错误或者没有成功链接,可以使用glDeleteProgram(GLuint程序)删除程序对象。
3. 统一变量的获取和设置通常我们在shader中自定义uniform变量,并在后续代码编写时加载所需的自定义数据。最常见的是u_MVPMatrix。通过预先计算坐标变换矩阵,我们可以输入坐标。对象的世界坐标转换为视口坐标。具体方法称为glGetUniformLocation(GLuint program, const GLchar* name),其中name指定uniform变量的位置,与shader源码中的名称相同。该方法返回的GLint位置返回值可以作为统一变量加载方法glUniform1f中的参数进行赋值。类推不同的uniform变量,加载方法也有不同的功能,如glUniform1f(GLint location, GLfloat x)、glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)等。以下代码是一个示例。 1是shader中定义的统一变量,2是加载相关统一变量的方法。
深入解析OpenGL ES着色器技术和的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!
【深入解析OpenGL ES着色器技术】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
我一直想学习opengl编程,感觉着色器是一个很重要的地方。
有7位网友表示赞同!
终于有人分析了opengl es的着色器,太棒了!
有15位网友表示赞同!
想要开发高质量的游戏图形,了解着色器的原理是必不可少的啊。
有16位网友表示赞同!
这篇文章能让我更好地理解着色器代码是怎么工作的吗?
有15位网友表示赞同!
我已经接触过一些基础的GPU编程知识,想深入学习着色器方面的细节!
有16位网友表示赞同!
OpenGL ES 的着色器功能真的是很强大,看这篇文章希望能学会怎么利用它们。
有8位网友表示赞同!
平时在项目中直接使用着色器程序,现在想看看底层原理是什么样的。
有7位网友表示赞同!
这篇解析详细吗?能覆盖到不同类型的着色器吗?
有16位网友表示赞同!
希望看到一些代码示例,方便理解和应用!
有13位网友表示赞同!
最近在学习3D引擎开发,这篇文章刚好可以帮助我深入了解图形渲染机制。
有13位网友表示赞同!
以前不知道着色器的工作原理,现在想多了解了!
有9位网友表示赞同!
感觉着色器是移动游戏中的核心技术之一,非常值得深入学习!
有15位网友表示赞同!
文章分析的透彻吗?能涵盖各个层面?
有7位网友表示赞同!
可以分享一些常见的着色器代码库吗?
有19位网友表示赞同!
看了这篇文章后感觉要花很多时间才能真正掌握着色器的知识体系...
有19位网友表示赞同!
希望作者以后能继续更新关于OpenGL ES的教程或者案例!
有15位网友表示赞同!
学习opengl es真的很有挑战性,这篇分析可以给我一些启发。
有8位网友表示赞同!