1

NodeのOpenGLバインディングを作成しようとしています。OpenGL APIのサイズが非常に大きいため、これを手動で行うのは実用的ではないため、KhronosのOpenGLレジストリを使用しました。

提供されているファイルは解析が簡単ですが、重要な部分が欠落しているようです。これが、重要なパラメーターバッファーのサイズを計算する方法です。

このような出力バッファを必要とする関数定義の例を次に示します。COMPSIZE()式に注意してください。

GetTextureImageEXT(texture, target, level, format, type, pixels)
    return      void
    param       texture     Texture in value
    param       target      TextureTarget in value
    param       level       CheckedInt32 in value
    param       format      PixelFormat in value
    param       type        PixelType in value
    param       pixels      Void out array [COMPSIZE(target/level/format/type)]
    category    EXT_direct_state_access
    dlflags     notlistable
    glxflags    ignore ### client-handcode server-handcode
    extension   soft WINSOFT
    glfflags    capture-execute capture-handcode decode-handcode pixel-pack

この例は、問題をよく示しています。「pixels」パラメータには、ターゲット、レベル、フォーマット、およびタイプのパラメータに応じたサイズの出力バッファが必要であることは明らかです。しかし、そのサイズを計算するための実際の式をどこでどのように見つけることができますか?

私がオンラインで見つけた唯一の関連情報は、明らかにOpenGLのApple実装に属するcompsize.cと呼ばれるCソースファイルでした。

誰かが私がこれに関する難しいデータを見つけるのを手伝ってくれる?

4

1 に答える 1

0

ここで私自身の質問に答えます。

私が達成しようとしていたことは、OpenGLが機能することを意図した方法にちょうど適合しないというのが私の結論です。私が自動化したかった計算は、そのように行うにはあまりにも多くの要因に依存しているだけです。

明確にするために、私がやろうとしているのは、Node(GoogleのV8仮想マシンに基づくコマンドラインJavaScriptインタープリター)にOpenGLバインディングを提供することです。一部のOpenGL(または拡張)呼び出しは大量のデータを返すか、そのデータは重要なメモリレイアウトを持つ可能性があるため、Khronosの解析可能な仕様に基づいて自動生成されたコードを介して必要な出力バッファーを割り当てることにより、プログラマーを支援したいと考えていました。ファイル。GLEWなどのプロジェクトで拡張Cバインディングを生成するためにすでに使用されているものと同じです。

私が受け取った回答に基づいて(ありがとうございました!)、そのアイデアは素朴でした-そして、それについて考えると、適切なサイズのバッファを持っているだけでアクセス違反を回避できるかもしれないので、その意図は思ったほど役に立ちませんでしたが、そうではありませんプログラマーが取得した情報を使用できるようにします。結局、彼はとにかく正確なメモリレイアウトを知る必要があるので、バッファの割り当ては彼にとって問題にはなりません(少なくとも理論的には)。

これらすべてに照らして、出力バッファサイズの計算とそのコンテンツの処理は、次に上位のソフトウェア層に任せる方が適切です。また、私の知る限り、同じソフトウェアでOpenGL API全体を使用する人はいないため、1つのライブラリですべての可能な出力バッファ割り当てを処理する必要はありません。

回答してくれたすべての人に感謝します!

于 2013-03-16T10:15:03.580 に答える