Почему я получаю нарушение прав доступа в atio6axx.dll при вызове glBindBuffer?

Подводя к проблеме:

Изучение OpenGL с использованием C путем создания (якобы простой) игры на основе тайлов моего собственного дизайна. Первоначально я рисовал только ~10 треугольников или около того для тестирования, и я настроил данные буфера и индексы следующим образом:

const float vertexPositions[] = {
      -1.0f, -0.8f, //0
      -1.0f, -1.0f, //1

      -0.8f, -0.8f, //2
      -0.8f, -1.0f, //3

      -0.8f, -0.8f, //2
      -0.8f, -1.0f, //3

      -0.6f, -0.8f, //4
      -0.6f, -1.0f, //5

      -0.6f, -0.8f, //4
      -0.6f, -1.0f, //5

      -0.4f, -0.8f, //6
      -0.4f, -1.0f, //7

      -0.4f, -0.8f, //6
      -0.4f, -1.0f, //7

      -0.2f, -0.8f, //8
      -0.2f, -1.0f, //9

      -0.2f, -0.8f, //8
      -0.2f, -1.0f, //9

       0.0f, -0.8f, //10
       0.0f, -1.0f, //11

       0.0f, -0.8f, //10
       0.0f, -1.0f, //11

/////////////////////////////////// Texture coords:
       0.0f,  1.0f, //0
       0.0f,  0.0f, //1

       1.0f,  1.0f, //2
       1.0f,  0.0f, //3

       0.0f,  1.0f, //2
       0.0f,  0.0f, //3

       1.0f,  1.0f, //4
       1.0f,  0.0f, //5

       0.0f,  1.0f, //4
       0.0f,  0.0f, //5

       1.0f,  1.0f, //6
       1.0f,  0.0f, //7

       0.0f,  1.0f, //6
       0.0f,  0.0f, //7

       1.0f,  1.0f, //8
       1.0f,  0.0f, //9

       0.0f,  1.0f, //8
       0.0f,  0.0f, //9

       1.0f,  1.0f, //10
       1.0f,  0.0f, //11

       0.0f,  1.0f, //10
       0.0f,  0.0f, //11

const GLubyte indices[] = {
      0, 1, 2, 
      3, 2, 1,

      4, 5, 6,
      7, 6, 5, 

      8, 9, 10,
      11, 10, 9,

      12, 13, 14,
      15, 14, 13,

      16, 17, 18,
      19, 18, 17,
};

Поскольку для создания большего количества треугольников мне понадобилось бы намного больше треугольников, я решил автоматизировать это (также значения в пикселях вместо координат экрана / области просмотра, поскольку я собираюсь использовать некоторые матрицы в своем шейдере):

float vertexPositions[6400]; //Declared globally outside the function

int blah()
{
      int count = 0, texture_start;



      for (int y = 0; y < 20; y++)
      {
            for (int x = 0; x < 21; x++)
            {
                  vertexPositions[count++] = x * 32.0f;
                  vertexPositions[count++] = (y + 1) * 32.0f;

                  vertexPositions[count++] = x * 32.0f;                  
                  vertexPositions[count++] = y * 32.0f;

                  if (x > 0 && x < 20)
                  {
                        vertexPositions[count++] = x * 32.0f;
                        vertexPositions[count++] = (y + 1) * 32.0f;

                        vertexPositions[count++] = x * 32.0f;                  
                        vertexPositions[count++] = y * 32.0f;
                  }
            }
      }

      texture_start = count;

      for (int z = 0; z < 400; z++)
      {
                  vertexPositions[count++] = 0.0f;
                  vertexPositions[count++] = 1.0f;

                  vertexPositions[count++] = 0.0f;
                  vertexPositions[count++] = 0.0f;

                  vertexPositions[count++] = 1.0f;
                  vertexPositions[count++] = 1.0f;

                  vertexPositions[count++] = 1.0f;
                  vertexPositions[count++] = 0.0f;
      }

      return 0;
}

Обратите внимание, я не автоматизировал индексы, потому что хотел убедиться, что смогу получить точно такие же треугольники из этих новых данных.

Проблема:

Я неоднократно получаю нарушения доступа на определенных вызовах GL. Если я перехожу вручную между точками останова, он всегда терпит неудачу, когда достигает glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, positionBufferObject);,

Если у меня есть одна точка останова на этой строке и одна точка останова после этой строки, она пропускает (игнорирует? Молча терпит неудачу на?) Строки между ними и разрывает, когда она достигает GLuint fShader = glCreateShader(GL_FRAGMENT_SHADER); внутри myProgram = CreateProgram(); call (что удивительно, так как мой вершинный шейдер создан сразу же с идентичным вызовом и отлично работает).

GLvoid InitGL(GLvoid)
{
      blah(); <----where i initialize my vertex data
      FnLdInit();
      GetBitmap();

      //char * glVer = (char *)glGetString(GL_VERSION);
      //char * glSLV = (char *)glGetString(GL_SHADING_LANGUAGE_VERSION);

      glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
      glClearDepth(1.0f);
      glEnable(GL_DEPTH_TEST);
      glDepthFunc(GL_LEQUAL);      ---------------------------//~BREAKPOINT HERE!~

      glGenBuffers(1, &positionBufferObject);
      errort = glGetError();

      glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, positionBufferObject); 
      //errort = glGetError();
      glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(vertexPositions), (const float *)vertexPositions, GL_STATIC_DRAW);
      //errort = glGetError();
      glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
      //errort = glGetError();

      myProgram = CreateProgram();   -------------------------//~BREAKPOINT HERE!~

}

Все glGetError() возвращают 0, что спецификация говорит, что это означает: нет проблем, или у glGetError была своя собственная ошибка.

Независимо от того, где он ломается, пеллы C стека вызовов показывают мне, когда он ломается, это 'atio6axx.dll; DrvPresentBuffers() +163B7B', и это всегда здесь:

Источник моего raaaaaaaage

Недавно я установил последнее обновление Catalyst для своего Radeon HD 6850. Я ничего не могу найти в отношении ограничений памяти в отношении объектов графического процессора / буфера вершин / и т. Д., И я сомневаюсь, что ~25 КБ данных вообще ничего не сломают. У меня такое ощущение, что это не проблема OpenGL, а скорее что-то в том, как я реализую свой код, или проблема ограничения / памяти, с которой я незнаком.

У постера №20 на этом сайте есть похожая проблема, но, похоже, она связана с ошибкой программы, а не с кодом (и я думаю, что это произошло до того, как вышли последние версии драйверов, даже если они были опубликованы 11 октября). GetBitmap() использует glBindTexture и другие вызовы без проблем.

Это кажется наиболее очевидным, но единственное, что я изменил со своего старого алгоритма на новый, это автоматизация создания моих данных. Там нет указателей, и я даже бросил на const float *, который компилятор даже не предупредил меня, был необходим.

Я ищу неправильные места для решения простой проблемы? Я постараюсь объяснить свой код / ​​добавить больше, если нужно, просто спросите. Я действительно предпочел бы не записывать ~6400 значений или больше вручную.

Редактирование # 1: после некоторых других тестов, кажется, эта ошибка происходит даже со старой реализацией. Я, должно быть, не скомпилировал его некоторое время (работал над шейдерами, которые являются отдельными файлами). Я очень смущен.

Правка № 2: Еще немного кода. Это единственная функция, которая происходит до InitGL, и та, которая вызывает InitGl.:

bool CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{
      GLuint PixelFormat;
      WNDCLASS wc;
      DWORD dwExStyle;
      DWORD dwStyle;

      RECT WindowRect;
      WindowRect.left = (long)0;
      WindowRect.right = (long)width;
      WindowRect.top = (long)0;
      WindowRect.bottom = (long)height;

      fullscreen = fullscreenflag;

      hInstance = GetModuleHandle(NULL);

      wc.style = CS_HREDRAW |CS_VREDRAW | CS_OWNDC;
      wc.lpfnWndProc = (WNDPROC) WndProc;
      wc.cbClsExtra = 0;
      wc.cbWndExtra = 0;
      wc.hInstance = hInstance;
      wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
      wc.hCursor = LoadCursor(NULL, IDC_ARROW);
      wc.hbrBackground = NULL;
      wc.lpszMenuName = NULL;
      wc.lpszClassName = "OpenGL";

      if (!RegisterClass(&wc))
      {
            MessageBox(NULL, "Failed to register the window class", "Error", MB_OK | MB_ICONEXCLAMATION);

            return FALSE;
      }

      if (fullscreen)
      {
            int changeresult;
            //char msg[100];
            DISPLAY_DEVICE disp;
            DEVMODE dmScreenSettings;
            int dw;

            memset(&disp, 0, sizeof(disp));
            memset(&dmScreenSettings, 0, sizeof(dmScreenSettings));

            disp.cb = sizeof(disp);


            if (!(EnumDisplayDevices(NULL, 0, &disp, 0)))
            {
                  return 1;
            }


            dmScreenSettings.dmSize = sizeof(dmScreenSettings);

            //ENUM_CURRENT_SETTINGS
            if (!(EnumDisplaySettings(disp.DeviceName, ENUM_CURRENT_SETTINGS, &dmScreenSettings)))
            {
                  dw = GetLastError();
            }

            dmScreenSettings.dmPelsWidth = width; //enable this in real
            dmScreenSettings.dmPelsHeight = height; //enable this in real

            changeresult = ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);

            //dmScreenSettings.dmPelsWidth = width;
            //dmScreenSettings.dmPelsHeight = height;
            //dmScreenSettings.dmBitsPerPel = bits;
            dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;

            if (changeresult != DISP_CHANGE_SUCCESSFUL)
            {
                  if (MessageBox(NULL, "Use window mode?", "GL", MB_YESNO | MB_ICONEXCLAMATION) == IDYES)
                  {
                        fullscreen = FALSE;
                  }
                  else
                  {
                        return FALSE;
                  }
            }
      }

      if (fullscreen)
      {
            dwExStyle = WS_EX_APPWINDOW;
            dwStyle = WS_POPUP;
            ShowCursor(FALSE);
      }
      else
      {
            dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
            dwStyle = WS_OVERLAPPEDWINDOW;
      }

      AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);

      if(!(hWnd = CreateWindowEx(   dwExStyle,
                                    "OpenGL",
                                    title,
                                    WS_CLIPSIBLINGS | WS_CLIPCHILDREN | dwStyle,
                                    0,
                                    0,
                                    WindowRect.right - WindowRect.left,
                                    WindowRect.bottom - WindowRect.top,
                                    NULL,
                                    NULL,
                                    hInstance,
                                    NULL)))
      {
            KillGLWindow();
            MessageBox(NULL, "Window Creation error", "Error", MB_OK | MB_ICONEXCLAMATION);

            return FALSE;
      }

      static  PIXELFORMATDESCRIPTOR pfd=                  // pfd Tells Windows How We Want Things To Be
      {
          sizeof(PIXELFORMATDESCRIPTOR),                  // Size Of This Pixel Format Descriptor
          1,                              // Version Number
          PFD_DRAW_TO_WINDOW |            // Format Must Support Window
          PFD_SUPPORT_OPENGL |            // Format Must Support OpenGL
          PFD_DOUBLEBUFFER,               // Must Support Double Buffering
          PFD_TYPE_RGBA,                  // Request An RGBA Format
          0,                           // Select Our 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,                     // Accumulation Bits Ignored
          16,                             // 16Bit Z-Buffer (Depth Buffer)
          0,                              // No Stencil Buffer
          0,                              // No Auxiliary Buffer
          PFD_MAIN_PLANE,                 // Main Drawing Layer
          0,                              // Reserved
          0, 0, 0                         // Layer Masks Ignored
      };
      pfd.cColorBits = bits;

      if (!(hDC = GetDC(hWnd)))
      {
            KillGLWindow();
            MessageBox(NULL, "Can't create a GL device context", "Error", MB_OK | MB_ICONEXCLAMATION);

            return FALSE;
      }

      if (!(PixelFormat = ChoosePixelFormat(hDC, &pfd)))
      {
            KillGLWindow();
            MessageBox(NULL, "Can't find a suitable pixelformat", "Error", MB_OK | MB_ICONEXCLAMATION);

            return FALSE;
      }

      if (!SetPixelFormat(hDC, PixelFormat, &pfd))
      {
            KillGLWindow();
            MessageBox(NULL, "Can't set the pixel format", "Error", MB_OK | MB_ICONEXCLAMATION);

            return FALSE;
      }

      if (!(hRC = wglCreateContext(hDC)))
      {
            KillGLWindow();
            MessageBox(NULL, "Can't create a GL rendering context", "Error", MB_OK | MB_ICONEXCLAMATION);

            return FALSE;
      }

      if (!wglMakeCurrent(hDC, hRC))
      {
            KillGLWindow();
            MessageBox(NULL, "Can't activate the GL rendering context", "Error", MB_OK | MB_ICONEXCLAMATION);

            return FALSE;
      }

      ShowWindow(hWnd, SW_SHOW);
      SetForegroundWindow(hWnd);
      SetFocus(hWnd);

      InitGL();
      ResizeGLScene(width, height);

      //char * glVer = (char *)glGetString(GL_VERSION);
      //char * glSLV = (char *)glGetString(GL_SHADING_LANGUAGE_VERSION);

      return TRUE;
}

FnLdInit - это место, где я подключаю все расширения:

void FnLdInit(void)
{
      HINSTANCE hGLLIB = NULL;
      hGLLIB = LoadLibrary("opengl32.dll");

      glActiveTexture                     = (PFNGLACTIVETEXTUREPROC)wglGetProcAddress("glActiveTexture");
      glAttachShader                      = (PFNGLATTACHSHADERPROC)wglGetProcAddress("glAttachShader");
      glBindBuffer                        = (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer");
      glBufferData                        = (PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferData");
      glCompileShader                     = (PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader");
      glCreateProgram                     = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");
      glCreateShader                      = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader");
      glDeleteShader                      = (PFNGLDELETESHADERPROC)wglGetProcAddress("glDeleteShader");
      glDetachShader                      = (PFNGLDETACHSHADERPROC)wglGetProcAddress("glDetachShader");
      glDisableVertexAttribArray          = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glDisableVertexAttribArray");
      glEnableVertexAttribArray           = (PFNGLENABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glEnableVertexAttribArray");
      glGenBuffers                        = (PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffers");
      glGetShaderInfoLog                  = (PFNGLGETSHADERINFOLOGPROC)wglGetProcAddress("glGetShaderInfoLog");
      glGetShaderiv                       = (PFNGLGETSHADERIVPROC)wglGetProcAddress("glGetShaderiv");
      glGetUniformfv                      = (PFNGLGETUNIFORMFVPROC)wglGetProcAddress("glGetUniformfv");
      glGetUniformLocation                = (PFNGLGETUNIFORMLOCATIONPROC)wglGetProcAddress("glGetUniformLocation");
      glLinkProgram                       = (PFNGLLINKPROGRAMPROC)wglGetProcAddress("glLinkProgram");
      glShaderSource                      = (PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource");
      glUniform1i                         = (PFNGLUNIFORM1IPROC)wglGetProcAddress("glUniform1i");
      glUniform2f                         = (PFNGLUNIFORM2FPROC)wglGetProcAddress("glUniform2f");
      glUseProgram                        = (PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram");
      glVertexAttribPointer               = (PFNGLVERTEXATTRIBPOINTERPROC)wglGetProcAddress("glVertexAttribPointer");

      glBindTexture           = (PFNGLBINDTEXTUREPROC)GetProcAddress(hGLLIB, "glBindTexture");
      glClear                 = (PFNGLCLEARPROC)GetProcAddress(hGLLIB, "glClear");
      glClearColor            = (PFNGLCLEARCOLORPROC)GetProcAddress(hGLLIB, "glClearColor");
      glClearDepth            = (PFNGLCLEARDEPTHPROC)GetProcAddress(hGLLIB, "glClearDepth");
      glDepthFunc             = (PFNGLDEPTHFUNCPROC)GetProcAddress(hGLLIB, "glDepthFunc");
      glDrawArrays            = (PFNGLDRAWARRAYSPROC)GetProcAddress(hGLLIB, "glDrawArrays");
      glEnable                = (PFNGLENABLEPROC)GetProcAddress(hGLLIB, "glEnable");
      glGenTextures           = (PFNGLGENTEXTURESPROC)GetProcAddress(hGLLIB, "glGenTextures");
      glTexImage2D            = (PFNGLTEXIMAGE2DPROC)GetProcAddress(hGLLIB, "glTexImage2D");
      glTexParameteri         = (PFNGLTEXPARAMETERIPROC)GetProcAddress(hGLLIB, "glTexParameteri");
      glViewport              = (PFNGLVIEWPORTPROC)GetProcAddress(hGLLIB, "glViewport");
      glDrawElements          = (PFNGLDRAWELEMENTSPROC)GetProcAddress(hGLLIB, "glDrawElements");
      glGetError              = (PFNGLGETERRORPROC)GetProcAddress(hGLLIB, "glGetError");
      glGetString             = (PFNGLGETSTRINGPROC)GetProcAddress(hGLLIB, "glGetString");
}

А вот и GetBitmap():

int GetBitmap(void)
{
      char        * bmBuffer, * pxPtr;
      FILE        * bmFile;
      //FILE * result;
      GLuint      texture;

      int         bmSize, 
                  dataOffset, 
                  dibSize, 
                  bmWidthPx, 
                  bmHeightPx,
                  bmCompression,
                  dataSize,
                  dataHorRes,
                  dataVerRes,
                  paletteNumClrs,
                  importantClrs,

                  bmBytesPerPixel = 3, //Default -> RGB

                  totalBytesPerRow,
                  pixelBytesPerRow,
                  padCount = 0;

      short int   bmClrPlane, bmBPP;
      char        bmChar0, bmChar1;
      //char msgData[100];

      bmFile = fopen("multisquare.bmp", "rb");
      if (bmFile == NULL)
      {
            return 1;
      }

      bmChar0 = fgetc(bmFile);
      bmChar1 = fgetc(bmFile);
      if (bmChar0 != 'B' || bmChar1 != 'M')
      {
            return 2;
      }

      //sprintf(msgData, "%c%c", bmChar0, bmChar1);
      //MessageBox(NULL, msgData, NULL, MB_OK | MB_ICONINFORMATION);

      bmSize = Get4Bytes(bmFile);

      //Skip 4 bytes. These bytes are application specific,
      //and generally unused.
      if (fseek(bmFile, 4, SEEK_CUR) != 0)
      {
            return 3;
      }

      dataOffset = Get4Bytes(bmFile);

      dibSize = Get4Bytes(bmFile);

      //Replace 'if dibSize' check with case statement
      //which branches to functions for different sized 
      //DIBHeaders.
      //
      //
      if (dibSize != 40)
      {
            return 4;
      }

      bmWidthPx = Get4Bytes(bmFile);
      bmHeightPx = Get4Bytes(bmFile); //Later -> handle negative = top->bottom.

      bmClrPlane = Get2Bytes(bmFile); //Must always be 1 anyways, consider removing this and skipping 2 bytes.
      bmBPP = Get2Bytes(bmFile);

      if (bmBPP == 24)
      {
            bmBytesPerPixel = 3;
      }

      bmCompression = Get4Bytes(bmFile);
      //Handle other compressions at some later time.
      if (bmCompression != 0)
      {
            return 5;
      }

      //Can use this to allocate appropriate memory space.
      dataSize = Get4Bytes(bmFile);

      //Resolutions doesn't seem too important atm.
      dataHorRes = Get4Bytes(bmFile);
      dataVerRes = Get4Bytes(bmFile);

      //Will probably both be 0. Irrelevant atm.
      paletteNumClrs = Get4Bytes(bmFile);
      importantClrs = Get4Bytes(bmFile);

      bmBuffer = (char *) calloc(dataSize, sizeof(char)); //Space allocated.

      fseek(bmFile, dataOffset, SEEK_SET);

      //Ex: 10 pixels * 3 bytes/pixel = 30 bytes
      //    30 + 3 = 33 -> 0010 0001
      //    Right shift 2: 0000 1000  -> These operations round to nearest
      //    Shift left 2:  0010 0000  -> multiple of 4.
      //    32 bytes to reach 4byte multiple
      //    So 30 bytes for 10 pixles plus 2 extra bytes of padding, per row.
      pixelBytesPerRow = bmWidthPx * bmBytesPerPixel;
      totalBytesPerRow = ((pixelBytesPerRow + bmBytesPerPixel) >> 2) << 2;
      padCount = totalBytesPerRow - pixelBytesPerRow;

      pxPtr = bmBuffer;

      switch(padCount)
      {
            case 0:
            {
                  for (int A = 0; A <= bmHeightPx; A++)
                  {
                        /*
                        for (int B = 0; B <= bmWidthPx; B++)
                        {

                              *(pxPtr + 2) = fgetc(bmFile);
                              *(pxPtr + 1) = fgetc(bmFile);
                              *pxPtr       = fgetc(bmFile);

                        }
                        */
                        fread(pxPtr, 1, pixelBytesPerRow, bmFile);
                        pxPtr += totalBytesPerRow;
                  }

                  break;
            }
            case 1:
            case 2:
            case 3:
            {
                  for (int A = 0; A <= bmHeightPx; A++)
                  {
                        /*
                        for (int B = 0; B <= bmWidthPx; B++)
                        {

                              *(pxPtr + 2) = fgetc(bmFile);
                              *(pxPtr + 1) = fgetc(bmFile);
                              *pxPtr       = fgetc(bmFile);

                        }
                        */
                        fread(pxPtr, 1, pixelBytesPerRow, bmFile);

                        if (fseek(bmFile, padCount, SEEK_CUR) != 0)
                        {
                              return 3;
                        }

                        pxPtr += totalBytesPerRow;

                  }

                  break;
            }
            default:
            //Shouldn't get here
            break;
      }
      //result = fopen("test.txt","w");
      //fwrite(bmBuffer, 1, dataSize , result);
      //fclose(result);
      fclose(bmFile);

      glActiveTexture(GL_TEXTURE0);
      glGenTextures(1, &texture);
      glBindTexture(GL_TEXTURE_2D, texture);

      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

      glTexImage2D(GL_TEXTURE_2D,   /*Type of texture*/
                   0,               /*Level of Detail number*/
                   GL_RGB,          /*Internal format*/
                   bmWidthPx,       /*Width in texels(pixels?)*/
                   bmHeightPx,      /*Height in texels(pixels?)*/
                   0,               /*Border. Must be 0 (probably only for 2D)*/
                   GL_BGR,          /*Format, of the data the texture will be created from*/
                   GL_UNSIGNED_BYTE,/*Data type of the pixel data*/
                   bmBuffer);       /*Pointer to the image data to create the texture from*/

      //glBindTexture(GL_TEXTURE_2D, 0);

      free(bmBuffer);


      return 0;
}

Редактирование № 3: Unistalled Catalyst 12.10 и все связанные драйверы. Переустановлен 12.8. Та же проблема, но теперь это происходит на GenBuffers. Странный.

Редактирование # 4: я попытался сделать свой проект 32-битным и скомпилировать его. Я получаю точно такую ​​же проблему, хотя по какой-то причине Pelles C не маркирует LIB (он просто говорит "без названия" каждый раз, когда упоминает об одном), поэтому я могу только предположить, что 32-битная библиотека, предоставляемая AMD, также не работает (как atio6axx.dll/). lib не загружен). У меня такое чувство, что у этой проблемы не будет никакого реального решения, потому что она, кажется, проистекает из драйверов, а не из моего кода. После поиска и просмотра подобных проблем, похоже, что на самом деле не существует решения на стороне клиента.

Редактирование № 5: Еще одна проблема, которую я раньше не замечал, потому что программа никогда не давала мне нарушения прав доступа, заключается в том, что код достигнет glActiveTexture(GL_TEXTURE0); и вдруг пропустить все строки послесловий и выйти из функции. При удалении этой строки выполняются следующие строки. glActiveTexture(GL_TEXTURE0); из atio6axx.dll в то время как все остальные команды OPENGL32.dll так что, похоже, это сузило. Странно то, что на этом этапе нет нарушения прав доступа, только странный пропуск.

Я полагаю, никто не может увидеть причину этого? Я даже установил бета-версию драйверов Catalyst с версией atio6axx.dll от 15\11\2012 (последний четверг). Таким образом, современные драйверы не проблема. Я даже пробовал каждую версию драйвера начиная с Catalyst 12.4 (текущая версия 12.10, и эта программа работала с 12.8). В убыток даже новая программа сталкивается с такими же проблемами.

1 ответ

Код для позиций вершин кажется хорошим и, кажется, не пишет за пределами массива. Нарушение доступа, которое вы видите, вероятно, вызвано тем, что r11 является недействительным. Код драйвера OpenGL обычно является многопоточным, поэтому возможно, что вы увидите эту ошибку, только когда рабочий поток попытается получить доступ к этому плохому буферу. Что может объяснить странное поведение, которое вы видите в месте сбоя.

Убедитесь, что буфер не освобожден до того, как с ним будет работать GPU, что вы передадите нужные размеры и т. Д.

Боюсь, вам придется вставить больше кода, чтобы мы могли помочь вам в дальнейшем.

Также может помочь предоставление нам значения r11.

Другие вопросы по тегам