1
  1. Windows は GL v1.1 のみを提供しています。Windows でコーディングを開始するために OpenGL バイナリ (+hearders) の最新バージョンをダウンロードする方法と、それらを見つける正確な場所は?
  2. MacOS、Linux、および Windows の 3 つのプラットフォームすべてで完全にサポートされている最新バージョンの OpenGL はどれですか?
4

4 に答える 4

0

Windows 用の更新された SDK はありませんgl.h。OpenGL 1.1 用のみが提供されています。Window OpenGL で追加機能を使用するには、拡張ヘッダーglext.hを使用する必要があります。これは Khronos から入手でき、新しい拡張機能が利用可能になると更新されます。wglGetProcAddressGL (または拡張機能) の新しいバージョンで使用できる関数への関数ポインターを取得するために使用できます。追加機能にアクセスする手順は、プラットフォームごとに異なります。たとえば、X11 を使用している場合は を使用できglXGetProcAddressARB、プラットフォームに EGL がある場合は を使用できますeglGetProcAddress

プラットフォームと SDK によっては、プラットフォームが更新された GL SDK を提供している場合、#define GL_GLEXT_PROTOTYPESを含める前に単純にを使用することもできます。glext.h明らかに、Windows では更新された SDK が提供されていないため、これは不可能ですが、Linux、Mac、iOS、および Android では可能です。どちらの方法でも、使用している GL コンテキストがコア API の関数をサポートしているか、関数を提供する拡張機能が利用可能であることを確認する必要があります ( を参照glGetString) GL_EXTENSIONS)。機能が含まれています。したがって、「ランタイム リンク」glGetProcAddressメソッドを使用すると、関数が使用できない場合に が返されるだけで、多少安全ですNULL。利用できない関数を使用すると、未定義の動作が発生し、クラッシュする可能性があります。

特定のプラットフォームでサポートされている最新バージョンに関しては、これはビルドに使用した SDK ではなく、ビデオ ドライバーに依存します。OpenGL コンテキストを作成すると、構築した GL SDK のバージョンに関係なく、コンテキストがサポートする OpenGL のバージョンがglGetStringw/によって示されます。GL_VERSIONバージョンが保証するすべての機能と、報告された拡張機能によって提供されるすべての機能を使用できます。

于 2015-06-06T19:43:09.953 に答える
0
  1. 一般に、OpenGL wikiには、お使いのプラットフォーム (OS およびグラフィック カード) 用の最新の OpenGL をダウンロードするためのすべてのリンクがあります。特に Windows の場合、Visual Studio を使用している場合、NuGet パッケージ マネージャーには、「nupengl.core」と呼ばれる事前にパッケージ化された適切な OpenGL ディストリビューションがあります。

  2. Arcticが言ったように、4.5 が最新の標準です。ビルドでサポートされているかどうかは、OS ではなくグラフィック カードによって異なります。

于 2015-06-08T12:45:32.520 に答える
0

OpenGL は単なる標準です。OpenGL Khronos グループは OpenGL 実装のヘッダーのみを提供していると思いますが、他には何も提供していません。グラフィックス カードのベンダーは、OS カーネルにリンクされているグラフィックス カード用のドライバーを提供しています。ここでの問題は、ドライバーの仕組みがわからないことです。したがって、ベンダーは、ソフトウェア実装者がカードを駆動できるようにするために、ユーザー モード ライブラリにドライバーを提供する必要があります。これは、多くの場合、ユーザー モード プログラムからリンクできるユーザー モード ライブラリの形式で、OpenGL/Direct3D 実装の形式で提供されます。

また、私は専門家ではありませんが、OpenGL コンテキストを作成し、このコンテキストをコンテンツをレンダリングするための実際のウィンドウであるプラットフォーム依存のコンテキストにリンクする必要があることはわかります。これは、スレッドが OpenGL コマンドを実行するときにどこに描画するかを OS に伝える必要があることを意味します。それ以外の場合、OpenGL コマンド/コード行は、ウィンドウ/デバイス コンテキストにリンクされていないため、何もしません。

たとえば、Linux には /dev/dri/card0 というファイルがあり、これは Intel/AMD ベースのコンピューターに統合されたグラフィックス カードです。OpenGL ライブラリの実装は、次の形式でシステム コールを実行します。ioctl()は、このキャラクター デバイスを呼び出してカードを駆動します。その下には、ハードウェア ベンダーによって提供されるドライバーがあり、それ自体をカーネルに登録し、このドライバーがグラフィックス ドライバーであり、/dev/dri/card0 を含む特定のタイプのデバイスをサポートすることをカーネルに通知します。キャラクターデバイス。また、PCI 構成スペースの読み取り時にグラフィックス カードが返すデバイス ID である PCI ID も渡す可能性があります。したがって、OS カーネルは、このデバイスが登録時にドライバーが提供した ID と同じ ID を持っているため、このドライバーを特定のキャラクターデバイスに使用する必要があることを識別できます。

glut、freeglut、GLFW など、提供されているライブラリがいくつかありますが、これらは非常に悪いものです。多くの場合、リンクの問題が発生し、この名前に値するゲーム/3D 開発者はそれらを使用しないため、それらはしばしば機能せず、作業が非常に困難です。これらのライブラリは、ウィンドウとユーザー入力機能のみを提供します。したがって、これらのライブラリは、ウィンドウを作成し、X サーバーを使用して Linux でユーザー入力を取得するのに 5 行のコードが必要であり、Windows では 1 行のコードとウィンドウのプロシージャと呼ばれるものであるという意味で、まったく役に立ちません。自分で実装するのは本当に簡単です。実際、これらのライブラリ (freeglut、GLFW など) は、OS カーネル開発者が提供するプラットフォーム依存の API を使用します。彼らはこれらをいくつかにラップするだけです#ifdef(マクロ) クロスプラットフォーム機能を提供します。最終的に、これらのライブラリが行う作業を再現することは些細なことであり、多くの場合、これらのライブラリを実際に使用するよりも優れています。

また、Windows はそのままで OpenGL 1.1 のサポートのみを提供します。したがって、これらの関数をすぐに利用でき、Visual Studio IDE で定義できます。これらの関数が茶色で強調表示されていることからわかります。マウスを上に置くと、関数のシグネチャが表示されます。GLEW (GLFW ではない) ライブラリは、初心者 (私のような) が 1.1 以上の OpenGL でコーディングを開始するのに非常に便利であることがわかりました。GLEW ライブラリは OpenGL 関数の存在をテストし、Windows で GetProcAdress() または wglGetProcAddress() を使用してプロシージャ アドレスを取得します。これはクロスプラットフォームです (詳細はこちら: https://www.khronos.org/opengl/wiki/ Load_OpenGL_Functions)。このライブラリには、glew32.lib という名前の 1 つの静的 .lib ファイル、glew32.dll という名前の 1 つの .dll (実行可能ファイルのディレクトリに置く)、および glew.h という名前のプログラムに含める 1 つのヘッダーが必要です。インクルード ディレクトリとライブラリ ディレクトリを Visual Studio に追加する方法については説明しませんが、Google のどこかで調べることができます。GLEW が提供する OpenGL 関数は、マクロの形式になります。Visual Studio では紫色で表示されます。

たとえば、Windows で WinAPI と Visual Studio を使用して GLFW と同じことを行う単純な OpenGL プログラムは、次のようになります。

#include <windows.h>
#include <glew.h>
#include <gl/GL.h>
#include <iostream>

#pragma comment(lib, "glew32")
#pragma comment(lib, "opengl32")
#pragma comment(lib, "glu32")

HDC dc;
HGLRC rc;

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg)
    {
    case WM_PAINT:
    {

    }
    break;
    case WM_LBUTTONDOWN:
    {

    }
    break;
    case WM_CLOSE:
    {
        DestroyWindow(hwnd);
    }
    break;
    case WM_DESTROY:
    {
        PostQuitMessage(0);
    }
    break;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
        break;
    }
}

int wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) {
    WNDCLASS wc = { };
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = L"Window";
    RegisterClass(&wc);
    HWND hwnd = CreateWindowExW(0, L"Window", L"Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
    ShowWindow(hwnd, nCmdShow);
    AllocConsole();
    freopen_s((FILE**)stdout, "CONOUT$", "w", stdout);
    MSG msg = { };

    PIXELFORMATDESCRIPTOR pfd = {
            sizeof(PIXELFORMATDESCRIPTOR),  //  size of this pfd  
            1,                     // version number  
            PFD_DRAW_TO_WINDOW |   // support window  
            PFD_SUPPORT_OPENGL |   // support OpenGL  
            PFD_DOUBLEBUFFER,      // double buffered  
            PFD_TYPE_RGBA,         // RGBA type  
            24,                    // 24-bit color depth  
            0, 0, 0, 0, 0, 0,      // color bits ignored  
            0,                     // no alpha buffer  
            0,                     // shift bit ignored  
            0,                     // no accumulation buffer  
            0, 0, 0, 0,            // accum bits ignored  
            32,                    // 32-bit z-buffer      
            0,                     // no stencil buffer  
            0,                     // no auxiliary buffer  
            PFD_MAIN_PLANE,        // main layer  
            0,                     // reserved  
            0, 0, 0                // layer masks ignored  
    };
    dc = GetDC(hwnd);
    int  index;
    index = ChoosePixelFormat(dc, &pfd);
    SetPixelFormat(dc, index, &pfd);
    rc = wglCreateContext(dc);
    wglMakeCurrent(dc, rc);

    GLenum res = glewInit();
    if (res != GLEW_OK) {
        printf("GLEW init failed: %s!", glewGetErrorString(res));
    }
    else {
        printf("GLEW init success!\n");
    }
    
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);
    SwapBuffers(dc);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

このプログラムは、空白のウィンドウを作成し、コンソールを作成し、「GLEW init sucess!」と出力する必要があります。コンソールで、ウィンドウの背景を黒にします。このコードは本当に些細なことであり、これが GLFW が「クロスプラットフォーム」API の下で行うことであることがわかります。私が言ったように、私は初心者ですが、この場合、ピクセル フォーマット構造でダブル バッファリングを有効にしたため、OpenGL 呼び出しはダブル バッファに書き込むと思います。実際に画面に何かをレンダリングするには、ウィンドウの dc で SwapBuffers() を呼び出して、ダブル バッファを実際に描画されるメイン バッファと交換する必要があります。

于 2021-11-04T13:51:55.453 に答える
0

OpenGL はオープン スタンダードです。最新バージョンは、GPU 用にインストールしたドライバーによって異なります。

1.1 以降の opengl を使用するには、glew (ドライバーでサポートされている機能を公開します) とコンテキスト作成用のフレームワークが必要です。

GLFW、GLUT、SDL

もっと。

現在の最新の OpenGL 実装: 4.5

于 2015-06-06T18:33:27.207 に答える