0

ボタン、メニュー、リストなどの単純なウィジェットを備えた GUI フレームワークを作成しました。これは、最新の PC およびオンボード グラフィック (GL 1.4 のみをサポートすることが多い) を備えたノートブックで実行する必要があります。それを達成するために、opengl 1.x (「即時モード」、表示リストなど) で描画を行います。

今、私はいくつかの質問があります:

1) OpenGL 4.0+ 関数/シェーダーで描画するキャンバス ウィジェットを作成したい場合、問題はありますか? OpenGL 4.0+ と OpenGL 1.x を混在させることはできますか?

2) 他の OpenGL-GUI-API はどのように描画しますか? できるだけ多くの PC/ノートブックをサポートするために、すべて OpenGL 1.x を使用していますか? Blender-GUI が OpenGL 1.x を使用していることは知っていますが、これが最善の解決策ですか?

4

2 に答える 2

3

OpenGL 4.0+ 関数/シェーダーで描画するキャンバス ウィジェットを作成したい場合、問題はありますか? OpenGL 4.0+ と OpenGL 1.x を混在させることはできますか?

OpenGL 4.x 互換コンテキストを作成すると仮定すると、はい。NVIDIA、AMD、および Intel は互換性プロファイルをサポートしています (Intel が OpenGL を「サポート」する程度まで)。

他の OpenGL-GUI-API はどのようにそこに描画しますか? できるだけ多くの PC/ノートブックをサポートするために、すべて OpenGL 1.x を使用していますか? Blender-GUI が OpenGL 1.x を使用していることは知っていますが、これが最善の解決策ですか?

ベストは主観的な言葉です。オンラインで見つけられるOpenGL コード (あらゆる種類のコード) の多くは古いものです。下位互換性の欠点の 1 つは、人々が古いコードやチュートリアルをアップグレードする必要性をまったく感じないことです。

しかし、コア OpenGL 4.x で GUI をレンダリングすることを妨げるものは何もありません。結局のところ、すべての D3D10 ゲームがその GUI をレンダリングする方法は実質的に同じです (D3D10 では固定機能がなくなったため)。

于 2012-11-17T16:18:51.180 に答える
1

OpenGL 4.0+ と OpenGL 1.x を混在させることはできますか?

いいえ。OpenGL-1/2 互換性プロファイルは、OpenGL-3 でのみ使用できます。

技術的には、実際に利用可能な互換性プロファイルがあります。しかし、誰かがそれを使いたいと思った正当な理由はわかりません。OpenGL-4 機能を使用する場合、プログラムの内部構造の多くを変更する必要があるため、その互換性プロファイルはもはや重要ではありません。

Blender-GUI が OpenGL 1.x を使用していることは知っています

現在、OpenGL-4 互換にするために多くの開発が行われています。

それを達成するために、opengl 1.x (「即時モード」、表示リストなど) で描画を行います。

表示リストと即時モードの両方が、大きな障害になります。頂点配列は、OpenGL-1.1 以降で使用できます。頂点配列をセットアップしたら、OpenGL-4 をサポートするために最小限のコードしか必要ありません。基本的に必要なことは、適切なシェーダーを提供し、頂点配列を適切な属性に関連付けることによって、固定関数パイプラインを複製することだけです。OpenGL-4 の場合、頂点配列の状態を保持するために頂点配列オブジェクトも必要です。

シェーダーが必須でない限り、つまり、固定機能でも可能なことだけを行う限り、ごくわずかなランタイム条件のみで OpenGL-1.1 から OpenGL-4.x の全範囲をサポートする方法でこれを書くことができます。あなたのコードで。


コメントによる更新:

私は次のようなことを考えています: ソースファイルを仮定しましょうguiGL.c

#if GLPATH==2
#define GLPREFIX(x) glpath2_#x
#elif GLPATH==3
#define GLPREFIX(x) glpath3_#x
#endif

void GLPREFIX(draw_button)
{
#if GLPATH==2
    /* OpenGL 2 code here */
#endif

#if GLPATH==3
    /* OpenGL 3 code here */
#endif

    /* common code here */

}

ディスパッチャguiGLcommon.c

void draw_button()
{
    if(opengl_major_version <= 2) {
        glpath2_draw_button();
    } else {
        glpath3_draw_button();
    }
}

そしてMakefile

guiGL_glpath2.o: guiGL.c
    $(CC) -DGLPATH=2 -o guiGL_glpath2.o -c guiGL.c

guiGL_glpath3.o: guiGL.c
    $(CC) -DGLPATH=3 -o guiGL_glpath2.o -c guiGL.c

guiGL.o: guiGLcommon.c 
    $(CC) -o guiGL.o -c guiGLcommon.c

# ...

target: ...
    $(CC) -o target guiGL.o guiGL_path2.o guiGL_path3.o ...
于 2012-11-17T11:29:23.400 に答える