2012-11-23 11 views
6

私のシェイダーは多くの場合同じ機能を共有しています。例えば、拡散/鏡面照明の計算。私はこれを一度書いてから別のシェーダーにコードを再利用したいと思います。再利用可能なglslコードを書くには?

Glslはファイルに関する知識がなく、Cのようなプリプロセッサディレクティブ#includeをサポートしていません。

私はglslが複数のcstringからソースをコンパイルすることをサポートしていることを知っていますが、どのcstringを含めるべきかあなたはどのように知っていますか?独自のバージョンのインクルードを実装していますか?あるいは、あなたのシェイダーごとに何らかのメタファイルを作成しますか?

答えて

4

最初の実行時に(またはグラフィックオプションが変更されたときに)組み立てられることが多い大規模プロジェクトのシェーダでは、ベンダー固有の機能がすべて含まれ、ユーザーのマシンと設定に最適化されます。また、シェーダだけでなく、レンダリングパイプラインのいくつかのステージもあります。
GLSLは、リクエストに応じてPHPスクリプトが嘔吐するHTML \ CSS \ JavaSriptコードとして扱うことができます。また、ループでのテンティング、コードインジェクション(テクスチャルックアップの量など)と同じ技術を使用できます。また、グラフィックデザイナーにとっては、チェックリスト、入力フィールドなどのパラメータ化によってシェーダソースを簡単に制御できるため、独自のシェイダーを生成することができます。

1

http://blackpixel.com/blog/494/xcode-using-includes-in-opengl-shaders/ [404]に基づいたカスタムソリューションがあります。基本的には、m4ツールを使用してファイルを前処理することができます。 「コピーバンドルリソース」に、すべてのglslのファイルを追加し、Xcodeで

include(Utils.glsl) 
include(Colors.glsl) 

... 

void main (void) { 
    ... 
} 

:GLSLソースファイルで

はちょうどあなたが再利用したい所望の断片が含まれます。

は、このシェルスクリプトを「スクリプトの実行」フェーズを追加します。

#!/bin/sh 

cd ${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME} 
find . -name "*.fsh" | while read file; do 
    echo Preprocess $file 
    m4 "$file" > "$file.tmp" 
    mv "$file.tmp" "$file" 
done 

exit 0 

スクリプトは、シェーダが.fsh拡張子を前提としています。シェーダの拡張機能に合わせて変更するのは簡単です。

警告:あなたのシェーダはほとんどの人に簡単にアクセスできます。あなたはそれを開発のために使用し、それらを解放する前に文字列に変換することができます(あなたがそれを暗号化しなければ本当の保護ではありません...)。

また、シェーダ間の共有があまりないと、多くの未使用コードが発生します。私はシェイダーのコンパイラはそれを世話するだろうと思うが、私はいくつかのパフォーマンスのペナルティがあるかどうか100%ではない。

関連する問題