OpenGL ES 2.0中的着色器Android

问题描述:

我想制作一些AR东西。我通过一些教程的几个步骤走像OpenGL ES 2.0中的着色器Android

我使用的OpenGL ES 2.0。特别是在第一篇教程中,他们为片段和顶点着色器实现了一些GLSL着色器代码。然后他们编译它。

我是否需要为我想用OpenGL绘制的每个原始对象实现这样的代码?或者,我可以重用着色器代码来绘制不同类型的形状和相同类型形状的不同实例吗?

此外:我只能重用着色器代码,或者我也可以重用编译着色器程序吗?

对几种几何形状重复使用相同的着色器是提高性能的常用方法,因为它们将被视为单次绘制调用。 如果设置着色器(glUseProgram),它将可用于任何数量的后续调用。

该教程是非常基本的,你应该把着色器代码抽象成更面向对象的方法。 例如:

public class Material{ 
    String mVertexShaderCode; 
    String mFragmentShaderCode; 
    int mProgram; 

    void initialize(){ 
     // do loadShader and attachShader here 
    } 

    void draw(){ 
    GLES20.glUseProgram(mProgram); 
    // do more draw stuff 
    } 
} 

也许这使得它更容易包装你的头周围,你可以如何使用和重复使用的着色器代码。

回答后续问题;是的,你可以重用两者。限制是如果您也重用编译的着色器,则不能使用不同的着色器特定属性。在您开始使用它们时,这些限制会变得很明显。

+0

是的,谢谢。这就是我想要做的。但是我仍然不明白的是这个'Material'类会是什么?它是否代表特定的几何对象?或者它画几个几何对象? – unlimited101

+0

它可以做。你(我)通常做的是将其附加到几何对象。当想要绘制几何图形时,着色器(程序)被设置并且网格被绘制,然后将其缓冲区注入到着色器中。如果您有多个对象使用相同的材​​质实例(并因此使用着色器),则不需要更改它们之间的材质。 – reden