use the ability of more advanced hardware to allow the use of multiple indicesです。これには明示的なシェーダコードが必要です。シェーダは、データのフォーマットを正しく理解して処理できるように、データのフォーマットを理解し理解する必要があります。この記述の一部はユニフォームで扱うことができますが、シェーダー内のロジックはすべての頂点に対してとなることに注意してください。シェーダを特にフォーマットの周りに構築するほうが効率的です。
最大の問題は、配列内の各頂点のデータが奇妙にフォーマットされていることです。ミスアライメントされたショーツなどがあります。処理するためには特別な注意が必要です。上記のように7バイトの頂点を処理するには、これを行う必要があるでしょう:明らか
uniform usamplerBuffer vertexData; //Format is unsigned bytes.
uniform samplerBuffer positionArray;
uniform samplerBuffer normalArray;
uniform samplerBuffer texCoordArray;
uint ExtractShortFromVertex(in uint firstIndex)
{
uint highByte = texelFetch(vertexData, firstIndex);
uint lowByte = texelFetch(vertexData, firstIndex + 1);
return (highByte << 8) | lowByte;
}
void main()
{
uint baseIndex = gl_VertexID * 7;
uint matrixIndex = texelFetch(vertexData, baseIndex);
uint positionIndex = ExtractShortFromVertex(baseIndex + 1);
uint normalIndex = ExtractShortFromVertex(baseIndex + 3);
uint texCoordIndex = ExtractShortFromVertex(baseIndex + 5);
vec4 position = texelFetch(positionArray, positionIndex);
vec4 normal = texelFetch(normalArray, normalIndex);
vec4 texCoord = texelFetch(texCoordArray, texCoordIndex);
//Do your stuff
}
をあなたがそこに直接データを持っている場合、あなたはそれを抽出するために、特殊なロジックが必要になるだろう。
vertexData
は、提示したGXデータを格納するバッファオブジェクト(buffer textureとしてアクセス)です。もちろん、実際の頂点データだけを指し、接頭語は90 0003
ではありません。あなたはまだ手動で処理する必要があります。したがって、CPUは依然としてデータへの高速アクセスを必要とするため、glDrawArrays
を呼び出すと、正しいプリミティブと描画回数を渡すことができます。
vertexData
の形式は、バイト単位のアクセスが必要なので、GL_R8UI
です。
"直接データ"を扱うのは、一連のバイトを浮動小数点数のような複雑な型に変換する必要があるため、面倒です。しかし、現代のGLSLには、それを実現させるべきである多くの機能があります。
Compute Shadersを使用して、各レンダリングコマンドの特定の側面を処理することができます。ここでの目標は、それらを間接的レンダリングコマンドに変えることです。
問題は、間接的なコマンドが異なる頂点数を持つことができる一方で、彼らがないできるが、均一データ、プログラム、またはプリミティブ型を変更で、ということです。そのため、異なるコマンド間でフォーマットが変更される間接コマンドのシーケンスを構築する方法はありません。 CPUがそれを知っておらず、それに基づいて異なる描画コールパラメータを発行することもありません。
どの時点で、CPUにコマンド自体を処理させることもできます。
これは可能な重複としてマークされていますが、私はリンクされた質問には、その場でプリミティブを変更することについて何も言及していませんね...はい、これはすでにサポートされている以上のインデックス作成を扱います。この質問の焦点。 – Tcll
GPUがその頂点データをそのまま処理することができない唯一の理由は、各頂点のデータが1つのインデックスではなく複数であるためです。だから、マルチインデックス技術はまさにあなたが必要とするものです。 GameCubeの仕様に合わせるだけです。 –