8

私のシェーダーは、同じ機能の多くを共有することがよくあります。たとえば、拡散/鏡面照明の計算。これを1回記述してから、さまざまなシェーダーでコードを再利用したいと思います。

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

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

4

2 に答える 2

6

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

于 2012-11-23T15:29:07.730 に答える
3

http://blackpixel.com/blog/494/xcode-using-includes-in-opengl-shaders/ [現在404]に基づくカスタムソリューションがあります。基本的には、 m4ツールを使用してファイルを前処理できると言われています。

GLSLソースファイルには、再利用したいフラグメントを含めるだけです。

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

...

void main (void) {
    ...
}

Xcodeで、すべての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%わかりません。

于 2012-11-23T15:46:37.127 に答える