1

頂点シェーダーを使用して、投影を実装しようとしています。

個別の頂点シェーダーで gl_Position の設定を処理し、別の頂点シェーダーでフラグメント シェーダーに必要な値を設定する方法はありますか?

問題は、最初の頂点シェーダーの main() 関数のみが呼び出されることです。

編集:複数の独立したシェーダーを使用する代わりに、シェーダー ソースを組み合わせることで、機能させる方法を見つけました。これが最善の方法かどうかはわかりませんが、うまく機能しているようです。

main_shader.vsh

attribute vec4 src_color;

varying vec4 dst_color; // forward declaration

void transform(void);

void main(void)
{
    dst_color = src_color;
    transform();
}

transform_2d.vsh

attribute vec4 position;

void transform(void)
{
    gl_Position = position;
}

次に、次のように使用します。

char merged[2048];
strcat(merged, main_shader_src);
strcat(merged, transform_shader_src);
// create and compile shader with merged as source
4

1 に答える 1

2

OpenGL ES では、シェーダー ソースを連結することが唯一の方法ですが、OpenGL には、必要なことを実行できる興味深い関数がいくつかあります。

GL_ARB_shader_subroutine (OpenGL 4.0 コアの一部) - これでほとんどのことができます。

GL_ARB_separate_shader_objects (OpenGL 4.1 コアの一部) - この拡張機能を使用すると、異なるプログラムで頂点シェーダーとフラグメント シェーダーを使用 (混合) できるため、1 つの頂点シェーダーと複数のフラグメント シェーダーがある場合 (たとえば、異なる効果用)、この拡張機能が適しています。 .

これが少し話題から外れていることは認めますが、知っておくとよいと思います (また、誰かに役立つかもしれません)。

于 2012-01-20T10:55:27.787 に答える