2016-09-28 22 views
0

私はいくつかのARのものを作りたいです。私は、私は、OpenGL ES 2.0を使用していますAndroid用OpenGL ES 2.0のシェーダ

のようないくつかのチュートリアルのいくつかの手順を歩きました。特に、最初のチュートリアルでは、フラグメントと頂点シェーダ用のGLSLシェーダコードを実装しています。そしてそれをコンパイルします。

OpenGLで描画したいすべてのプリミティブオブジェクトに対してこのようなコードを実装する必要がありますか?シェイダーコードを再利用して、異なるタイプのシェイプと同じタイプのシェイプの異なるインスタンスを描画することはできますか?

さらに、シェーダコードを再利用することはできますか?また、コンパイル済みシェーダプログラムを再利用することはできますか?

答えて

1

複数のジオメトリに対して同じシェーダを再利用することは、単一の描画呼び出しとして扱われるため、パフォーマンスを向上させる一般的な方法です。 シェーダ(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

はい、ありがとうございます。それが私がやりたいことです。しかし、私がまだ理解していないことは、この「マテリアル」クラスはまさにどんなものでしょうか?特定の幾何学的オブジェクトを表していますか?それとも、いくつかの幾何学的オブジェクトを描画しますか? – unlimited101

+0

どちらでも可能です。あなたが通常やっていることは、ジオメトリオブジェクトにアタッチすることです。ジオメトリを描画したいときは、シェーダ(プログラム)が設定され、その後バッファがシェーダに注入されてメッシュが描画されます。マテリアル(つまりシェーダ)の同じインスタンスを使用する複数のオブジェクトがある場合、その間にマテリアルを変更する必要はありません。 – reden