2014-08-30 3 views
2

다음 코드는 OpenGL glGenBuffers 메서드를로드하려고 시도하지만 실패합니다. 그 이유와 해결 방법에 대해 논평하는 데 도움을 줄 수 있습니까?Windows에서 Delphi에서 OpenGL glGenBuffers 메서드를로드하는 방법은 무엇입니까?

program Project2; 

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    StrUtils, SysUtils, Windows; 

var 
    Library_OpenGL: HMODULE; 

begin 
    try 
    Library_OpenGL := LoadLibrary('opengl32.dll'); 
    Writeln(Ifthen(GetProcAddress(Library_OpenGL, 'glGenBuffers') <> nil, ' glGenBuffers Success', ' glGenBuffers Failed')); 
    Writeln(Ifthen(GetProcAddress(Library_OpenGL, 'glGenBuffersARB') <> nil, ' glGenBuffersARB Success', ' glGenBuffersARB Failed')); 
    FreeLibrary(Library_OpenGL); 

    Library_OpenGL := LoadLibrary('atioglxx.dll'); // ATI 4850 
    Writeln(Ifthen(GetProcAddress(Library_OpenGL, 'glGenBuffers') <> nil, ' glGenBuffers Success', ' glGenBuffers Failed')); 
    Writeln(Ifthen(GetProcAddress(Library_OpenGL, 'glGenBuffersARB') <> nil, ' glGenBuffersARB Success', ' glGenBuffersARB Failed')); 
    FreeLibrary(Library_OpenGL); 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
    ReadLn; 
end. 

답변

8

API 반환 여부를 제대로 확인하면 실패 할 경우 덤핑하는 대신 적절하게 실패한 이유에 대한 답변을 얻습니다.

Win32Check(GetProcAddress(Library_OpenGL, 'glGenBuffers') <> nil); 

Writeln(Ifthen(GetProcAddress(Library_OpenGL, 'glGenBuffers') <> nil, ' glGenBuffers Success', ' glGenBuffers Failed')); 

를 교체하고 우리는 예외가 있습니다

EOSError: System Error. Code: 127.
The specified procedure could not be found

그래서 이유 GetProcAddress 실패

는 OpenGL을 라이브러리가 glGenBuffers 함수를 export하지 않는입니다. "의존"이라는 확인은이를 확인합니다. OpenGL을에서 기능 누락에 대한


빠른 검색 wglGetProcAddress로 우리를 인도 : 당신은 철저하게 문서를 읽는다면, 당신은 알 수

The wglGetProcAddress function returns the address of an OpenGL extension function for use with the current OpenGL rendering context.

단순히 glGenBuffers이 실패 공급 gwlGetProcAddress를 호출. 함수의 주소를 반환하려면 렌더링 컨텍스트가 필요합니다.

다음은 함수의 주소를 가져 오는 데 성공한 가장 짧은 프로젝트입니다. 렌더링 컨텍스트에는 창이 필요하고 기본 VCL 양식이 요구 사항에 맞기 때문에 GUI 응용 프로그램을 사용합니다 (SetPixelFormat의 "설명"참조). (면책 조항 : 나는 OpenGL에 대해 아무것도 몰라, 아래의 코드는 반드시 정확하지는 않으며, 또한 당신이 정말로 피해야하는 오류 검사를 생략 함).

uses 
    opengl; 

{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Library_OpenGL: HMODULE; 
    DC: HDC; 
    PxFmt: TPixelFormatDescriptor; 
    GLRC: HGLRC; 
    glGenBuffers: procedure(n: GLsizei; buffers: PGLuint); cdecl; 

begin 
    Library_OpenGL := LoadLibrary('opengl32.dll'); 

    DC := GetDC(Handle); 
    ZeroMemory(@PxFmt, SizeOf(PxFmt)); 
    PxFmt.nSize := SizeOf(PxFmt); 
    PxFmt.nVersion := 1; 
    PxFmt.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER; 
    PxFmt.iPixelType := PFD_TYPE_RGBA; 
    PxFmt.cColorBits := 32; 
    PxFmt.cDepthBits := 24; 
    PxFmt.cStencilBits := 8; 
    SetPixelFormat(DC, ChoosePixelFormat(DC, @PxFmt), @PxFmt); 

    GLRC := wglCreateContext(DC); 
    wglMakeCurrent(DC, GLRC); 
    @glGenBuffers := wglGetProcAddress('glGenBuffers'); 
    Assert(@glGenBuffers <> nil); 
    ... 

end; 
+0

우수 의견! 당신의 통찰력에 감사드립니다! – SOUser

관련 문제