Невозможно найти точку входа с именем 'glCreateShader' в DLL 'opengl32.dll' - PullRequest
2 голосов
/ 03 июля 2011

Я работаю в OpenGL.
Tao Bindings.
XP Pro 64.
VS 2008 в VB.NET
Я создал десятки простых инструментов и тестовых приложений и даже 2 больших приложения, используяOpenGL для рендеринга.

Почему все сразу в одном проекте я вижу это во время выполнения?Он строит без ошибок .. что нормально для такого рода вещей.Дело в том, что это единственное, что я сейчас над этим работаю, - вот и все.

Невозможно найти точку входа с именем 'glCreateShader' в DLL 'opengl32.dll'.

Я попытался изменить всевозможные настройки в IDE (НО ЭТО РАБОТАЕТ С ДРУГИМ КОДОМ, КАК МНОГО ЭТО ИДЕОТИЧНО!)

Я пытался заменить opengl32.dll, но .. тогда НЕТ встроенных решенийбудет работать.

1) Это НЕ opengl32.dll (он отлично работает в других сборках)
2) Настройки в VS2008 такие же, как и в любом другом приложении OpenGL, которое я создал.
3Я часами просматривал код и даже искал, чтобы узнать, не было ли случайно использовано имя varaibles.Я не вижу ничего, что могло бы быть причиной этого.
4) Да .. Я компилирую в x86 (Дао не будет работать в 64-битной версии) .. Как я уже говорил .. У меня до сих пор не было проблем.

Это линия протеста:

    vertexObject = Gl.glCreateShader(Gl.GL_VERTEX_SHADER)

Ответы [ 3 ]

3 голосов
/ 05 июля 2011

Хорошо, ребята ... Я нашел проблему.

Если и я не уверен, что это верно для всех версий Win, кроме XP Pro 64 ...

При изменении размера экрана на полный размер Дао теряет свои подшипники.

Из текста в классе Дао:

Этот класс содержит все перечисления OpenGL и функции, определенные в спецификации 2.1. Официальные файлы .spec можно найти по адресу: http://opengl.org/registry/. Мы полагаемся на статическую инициализацию, чтобы получить точки входа для функций OpenGL. Убедитесь, что действительный контекст OpenGL стал актуальным в соответствующем потоке, прежде чем будут вызваны какие-либо функции OpenGL (наборы инструментов, такие как GLUT, SDL или GLFW, автоматически позаботятся о процессе инициализации контекста). Без действительного контекста OpenGL мы сможем получить только статически экспортированные точки входа (обычно соответствующие OpenGL версии 1.1 в Windows, 1.3 в Linux и 1.4 в Windows Vista), а методы расширения необходимо будет загружать вручную. *

Если вы предпочитаете иметь больший контроль над загрузкой расширений, вы можете использовать методы ReloadFunctions или ReloadFunction, чтобы вручную принудительно инициализировать точки входа OpenGL. Метод ReloadFunctions должен вызываться при каждом изменении существующий визуальный или пиксельный формат. Обычно это происходит, когда вы изменяете буфер цвета / трафарета / глубины, связанный с окном (но, вероятно, не разрешение). Это может или не может быть необходимым в Linux / MacOS, но обычно требуется для Windows.

Я уверен, что выше (с) Тао ..

Извините, если я звучу сварливым .. Я был: (

В любом случае .. Мне нужно было добавить это ...

Gl.ReloadFunctions ()

.... после настройки контекста устройства.

Так что это порядок, который работает сейчас:

    If Not (Wgl.wglMakeCurrent(ghDC, hRC)) Then
        MessageBox.Show("Unable to make rendering context current")
        End
    End If
    Glut.glutInit()
    Glut.glutInitDisplayMode(GLUT_RGBA Or GLUT_DOUBLE)
    Gl.ReloadFunctions() 'New Line that reloads the extensions. 
    build_shaders() ' where shaders are created and complied

Итак, вот оно:)

Еще раз спасибо всем!

1 голос
/ 03 июля 2011

glCreateShader - это функция, представленная в OpenGL-2 и ранее являвшаяся частью расширения.Windows 'opengl32.dll покрывает только OpenGL-1.1, что-то кроме этого доступно только как расширения.Таким образом, точка входа в glCreateShader должна быть получена через механизм расширения.OpenGL.org имеет часто задаваемые вопросы по этому вопросу

http://www.opengl.org/resources/faq/technical/extensions.htm

23.070 Как я могу вызвать процедуры расширения в Microsoft Windows?

Ваше приложение может уже найти некоторые расширениядоступно через Microsoft opengl32.lib.Однако, в зависимости от вашего устройства OpenGL и драйвера устройства, конкретное расширение для конкретного поставщика может присутствовать или не присутствовать во время соединения.Если его нет в opengl32.lib, вам нужно получить адрес точек входа расширения во время выполнения из ICD устройства.Вот пример сегмента кода, который демонстрирует получение указателей на функции для расширения ARB_multitexture:

/* Include the header that defines the extension. This may be a
   vendor-specific .h file, or GL/glExt.h as shown here, which
   contains definitions for all extensions. */
#include "GL/glExt.h"

/* Declare function pointers */
PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;
PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB;

...
    /* Obtain the address of the extension entry points. */
    glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)
        wglGetProcAddress("glActiveTextureARB");
    glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)
        wglGetProcAddress("glMultiTexCoord2fARB");

После получения адресов точек входа функций расширения, которые вы хотите использовать, просто вызовите их как обычные указатели на функции:

    /* Set texture unit 0 min and mag filters */
    (*glActiveTextureARB) (GL_TEXTURE0_ARB);
    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
...
    /* Draw multi textured quad */
    glBegin (GL_QUADS);
      (*glMultiTexCoord2fARB) (GL_TEXTURE0_ARB, 0.f, 0.f);
      (*glMultiTexCoord2fARB) (GL_TEXTURE1_ARB, 0.f, 0.f);
        glVertex3f (32.f,32.f, 0.f);
 ...

glEnd();

Дополнительная информация о wglGetProcAddress () доступна в документации MSDN.

В случае языковых привязок, таких как Tao или OpenTK, работа привязки заключается в правильной настройкеи предоставить все доступные расширения.Теперь вы используете Tao , который ужасно устарел (последний выпуск был в ноябре 2005 года).Я рекомендую перейти на OpenTK .

0 голосов
/ 03 июля 2011

Сначала я бы использовал «nm» и «objdump -CDx», чтобы проверить, определена ли функция и содержит ли она код.

dumpbin /symbols library.lib

Тогда я бы подтвердил, что

FARPROC WINAPI GetProcAddress(
  __in  HMODULE hModule,
  __in  LPCSTR lpProcName
);

на самом деле может найти указатель на функцию и используйте GetLastError, если выясните, в чем заключается ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...