着色器如何在Android OpenGL中工作?

时间:2019-05-21 05:00:44

标签: android opengl-es

在开发Andoird OpenGL时,创建的顶点和片段着色器如何工作?

我基本上遵循OpenGL ES上的Android开发人员指南示例。但是,在创建着色器时,首先会创建一个包含代码段的String。我试图了解此字符串段如何与其余过程联系在一起,但我做不到。

 private final String vertexShaderCode =
            "attribute vec4 vPosition;"+
            "void main(){"+
            "   gl_position = vPosition;"+
            "}";

1 个答案:

答案 0 :(得分:0)

看看图形管道:

enter image description here

顶点着色器的主要工作是将每个顶点的位置从相机(现实世界)空间转换/转换为称为 Normalized Device Space 的特殊空间。 。输出位置存储在内置变量gl_Position中。每个顶点由顶点着色器的一个实例执行。因此,如果您有100个顶点,则将执行100个顶点着色器实例。

您发布的顶点着色器代码实际上并没有进行任何重大转换:gl_position = vPosition,但这很好,因为作者希望输入位置已经在 Normalized Device Space 中。 >

然后在归一化设备空间中,将这些位置组装为基本体(例如三角形)。接下来,在栅格化阶段,这些基元被分解为片段(为简单起见,可以将其视为像素)。然后,每个片段进入片段着色器以计算该片段的颜色。每个片段都由片段着色器的一个实例执行。

一次,在管道中仅使用一对顶点着色器和片段着色器。这是由OpenGL ES命令glUseProgram(program)指定的,其中程序只是一对顶点和片段着色器。

您发布的字符串是顶点着色器的源代码,您还将看到相应片段着色器的源代码。我们使用OpenGL ES命令来创建着色器,设置其源代码(您看到的字符串段),对其进行编译,将它们附加到程序,链接该程序并使用该程序。

为了真正理解所有这些内容,建议您阅读this book。上图是从那本书中拍摄的。