複数のシェーダー間で関数を共有する


10

簡単な質問:

GLSLで、複数のシェーダー間で関数を共有する方法はありますか、またはそれらを必要とするすべてのシェーダーですべての関数を定義する必要がありますか?

回答:


12

ヘッダーファイルでいくつかの関数を定義し、シェーダーに#includeできます。C / C ++とは少し異なりますが、プロトタイプだけではなく(シェーダーには個別のコンパイルとリンクの概念がないため)、ヘッダーに関数の本体を配置しますが、それ以外はC / C ++と同じです。ヘッダー。


2
少なくとも#includeは3.30までのバージョンのGLSLでは実際にはサポートされていないことに注意してください。まともなシェーダーフレームワークは、この機能を提供するために言語を拡張する必要があります(Cgを含む)。
Sean Middleditch、2012

7

#includeが使用できない場合は、glShaderSourceの引数を使用して、共有するものを指定します。例:

char *sharedcode = "...shared code here...";
char *fs1 = "...fragment shader 1...";
char *fs2 = "...fragment shader 2...";

char *awesomeeffect1[] = {sharedcode, fs1};
char *awesomeeffect2[] = {sharedcode, fs2};

glShaderSource (shader1, 2, awesomeeffect1, NULL);
glShaderSource (shader2, 2, awesomeeffect2, NULL);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.