1

HLSL から GLSL に切り替えています

頂点バッファの頂点属性を定義するときは、呼び出す必要があります

glVertexAttribPointer(  GLuint      index, 
    GLint   size, 
    GLenum      type, 
    GLboolean   normalized, 
    GLsizei     stride, 
    const GLvoid *      pointer);

インデックスを渡します。しかし、シェーダーでどのインデックスがどのセマンティックにマップされるかを指定するにはどうすればよいでしょうか?

たとえばgl_Normal。頂点シェーダーで使用する場合、これをインデックス 1 のジェネリック頂点属性にするように指定するにはどうすればよいgl_Normalですか?

4

1 に答える 1

7

GLSLには「セマンティック」のようなものはありません。属性インデックスと頂点シェーダー入力だけがあります。

頂点シェーダー入力には2種類あります。3.1で削除された種類(「gl_」で始まる種類)とユーザー定義の種類。削除された種類は;で設定できません。glVertexAttribPointerこれらの各変数には、独自の特別な機能がありました。gl_Normal持っていたglNormalPointergl_Color持っていたglColorPointer、など。しかし、これらの関数はコアOpenGLにはもう存在しません。

ユーザー定義の頂点シェーダー入力は、属性インデックスに関連付けられています。名前付きの各入力には、次のいずれかの方法でインデックスが割り当てられます。最も優先されるものからデフォルトの順になります。

  1. GLSL 3.30またはARB_explicit_attrib_location拡張構文layout(location = #)を使用します。ここ#で、は属性インデックスです。したがって、という入力がある場合はposition、次のようにインデックス3を指定します。

    layout(location = 3) in vec4 position;
    

    これは、これを処理するための私の好ましい方法です。Explicit_attrib_locationは、まだサポートされているほとんどすべてのハードウェア(Intel以外)で使用できます。

  2. を介した明示的な関連付けglBindAttribLocation。プログラムをリンクする前に、この関数を呼び出します。上記を行うには、次のようにします。

    GLuint program = glCreateProgram();
    glAttachShader(program, some_shader);
    glBindVertexAttrib(program, 3, "position");
    glLinkProgram(program);
    

    複数の属性を設定できます。実際、同じインデックスに複数の属性名を設定できます。そのアイデアは、一連のマッピングを自動的に設定し、OpenGLに実際のシェーダーコードで機能するものを認識させることです。したがって、「位置」と「軸」をインデックス3にマップすることができます。これらの両方の入力を持つこのシステムにシェーダーを配置しない限り、問題はありません。

  3. OpenGLに割り当てさせます。他の方法のいずれかで属性インデックスを属性に割り当てない場合、GLSLリンカーがそれを割り当てます。でリンク後の属性を取得できますglGetAttribLocation

    OpenGLはインデックスを任意に割り当てるので、これはお勧めしません。したがって、という名前の属性を使用するすべてのシェーダーはposition、異なるインデックスに位置を持っている可能性があります。それは良い考えではないと思います。したがって、シェーダーで明示的に設定できない場合は、リンクする前に、少なくともOpenGLコードで明示的に設定してください。このようにして、属性インデックス0の意味、インデックス1の意味などに関する規則を設定できます。

于 2012-03-05T04:15:28.373 に答える