Open gl что значит ошибка

If the parameters of a function call do not match the set of parameters allowed by OpenGL, or do not interact reasonably with state that is already set in the context, then an OpenGL Error will result. The errors are presented as an error code.

For most OpenGL errors, and for most OpenGL functions, a function that emits an error will have no effect. No OpenGL state will be changed, no rendering will be initiated. It will be as if the function had not been called. There are a few cases where this is not the case.

Catching errors (the hard way)

OpenGL errors are stored in a queue until the error is actually handled.[footnotes 1] Therefore, if you do not regularly test for errors, you will not know necessarily which function call elicited a particular error. As such, error testing should be done regularly if you need to know where an error came from.

To fetch the next error in the queue (and to remove it from the queue), call this function:

If the error queue is empty, it will return GL_NO_ERROR. Otherwise, it will return one of the error enumerators below and remove that error from the queue. So to fetch all of the errors currently in the queue, you would need to loop.

A simple loop to extract the current OpenGL errors:

GLenum err;
while((err = glGetError()) != GL_NO_ERROR)
{
  // Process/log the error.
}

Note: No OpenGL function call is valid when an OpenGL Context is not made current. Depending on the platform, a call to glGetError without having a context made current may crash or return any value, including indefinitely returning a valid OpenGL error code. So if you see an infinite loop in such a function, this is likely the reason why.

Meaning of errors

The glGetError function returns one of the following error codes, or GL_NO_ERROR if no (more) errors are available. Each error code represents a category of user error.

GL_INVALID_ENUM, 0x0500
Given when an enumeration parameter is not a legal enumeration for that function. This is given only for local problems; if the spec allows the enumeration in certain circumstances, where other parameters or state dictate those circumstances, then GL_INVALID_OPERATION is the result instead.
GL_INVALID_VALUE, 0x0501
Given when a value parameter is not a legal value for that function. This is only given for local problems; if the spec allows the value in certain circumstances, where other parameters or state dictate those circumstances, then GL_INVALID_OPERATION is the result instead.
GL_INVALID_OPERATION, 0x0502
Given when the set of state for a command is not legal for the parameters given to that command. It is also given for commands where combinations of parameters define what the legal parameters are.
GL_STACK_OVERFLOW, 0x0503
Given when a stack pushing operation cannot be done because it would overflow the limit of that stack’s size.
GL_STACK_UNDERFLOW, 0x0504
Given when a stack popping operation cannot be done because the stack is already at its lowest point.
GL_OUT_OF_MEMORY, 0x0505
Given when performing an operation that can allocate memory, and the memory cannot be allocated. The results of OpenGL functions that return this error are undefined; it is allowable for partial execution of an operation to happen in this circumstance.
GL_INVALID_FRAMEBUFFER_OPERATION, 0x0506
Given when doing anything that would attempt to read from or write/render to a framebuffer that is not complete.
GL_CONTEXT_LOST, 0x0507 (with OpenGL 4.5 or ARB_KHR_robustness)
Given if the OpenGL context has been lost, due to a graphics card reset.
GL_TABLE_TOO_LARGE1, 0x8031
Part of the ARB_imaging extension.

1: These error codes are deprecated in 3.0 and removed in 3.1 core and above.

In the OpenGL Reference documentation, most errors are listed explicitly. However, GL_OUT_OF_MEMORY and GL_CONTEXT_LOST could be generated by virtually any OpenGL function. And they can be generated for reasons not directly associated with that particular function call.

Catching errors (the easy way)

The debug output feature provides a simple method for your application to be notified via an application-defined message callback function when an OpenGL error (or other interesting event) occurs within the driver. Simply enable debug output, register a callback, and wait for it to be called with a DEBUG_TYPE_ERROR message.

This method avoids the need to sprinkle expensive and code-obfuscating glGetError() calls around your application to catch and localize the causes of OpenGL errors (and the need to conditionally compile them into debug builds to avoid the performance hit in optimized builds). The feature can even ensure that message callback functions are invoked on the same thread and within the very same call stack as the GL call that triggered the GL error (or performance warning).

A simple example showing how to utilize debug message callbacks (e.g. for detecting OpenGL errors):

void GLAPIENTRY
MessageCallback( GLenum source,
                 GLenum type,
                 GLuint id,
                 GLenum severity,
                 GLsizei length,
                 const GLchar* message,
                 const void* userParam )
{
  fprintf( stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n",
           ( type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : "" ),
            type, severity, message );
}

// During init, enable debug output
glEnable              ( GL_DEBUG_OUTPUT );
glDebugMessageCallback( MessageCallback, 0 );

Side effects

Under most circumstances, a function that generates an error will exit without changing any OpenGL state or initiating any OpenGL operations. They will not modify any client memory passed into those functions by the user (ie: pointer arguments). Under such errors, return values are zero or something equally innocuous. However, there are certain circumstances were an error happens and OpenGL state is modified.

Whenever the GL_OUT_OF_MEMORY error is generated, the state of the OpenGL context and/or objects is undefined.

The GL_CONTEXT_LOST error is generated (which requires OpenGL 4.5 or ARB_KHR_robustness) by any commands after the OpenGL context was lost. Those commands have no side effects, with a few special-case exceptions for functions that can block the CPU.

The multi-bind functions functions have unusual error properties. Because they aggregate the ability to bind multiple objects at once, if the binding of one object fails with an error, the others will be bound as normal. Only the erronous objects will fail to bind. Note that there is no way to detect which objects failed to bind (other than querying the context for each binding point).

No error contexts

No Error Context

Core in version 4.6
Core since version 4.6
ARB extension KHR_no_error

An OpenGL Context can be created which does not report OpenGL Errors. If the context bit GL_CONTEXT_FLAG_NO_ERROR_BIT is set to true, then the context will not report most errors. It will still report GL_OUT_OF_MEMORY_ERROR where appropriate, but this can be delayed from the point where the error actually happens. No other errors will be reported.

This also means that the implementation will not check for errors either. So if you provide incorrect parameters to a function that would have provoked an error, you will get undefined behavior instead. This includes the possibility of application termination.

Contexts cannot have the no error bit and the robustsness or debug bits.

Notes

  1. The specification «OpenGL 4.6 (Core Profile) — October 22, 2019», chapter «2.3.1 Errors» doesn’t talk about a error queue, it talks about several flag-code pairs.
  • Home
  • Partition Manager
  • How to Fix Minecraft OpenGL Error 1282 (Invalid Operation)?

By Charlotte | Follow |
Last Updated

OpenGL Error 1282 is a very common OpenGL error that appears in Minecraft and many other OpenGL games. This post form MiniTool Partition Wizard shows you how to fix Minecraft OpenGL Error 1282 (Invalid option) successfully.

Introduction to OpenGL Error 1282

Minecraft is a game that is popular around the world. There are also many different mods that you can use to customize your gaming experience. 

However, there is an annoying error in the game if you have installed mods in Minecraft, such as OpenGL Error 1282 (Invalid operation).

When the error occurs on your PC, you will encounter two different types of errors: One just spams a message in your game chat that says “OpenGL Error: 1282 (Invalid operation”)”, and the other is that not only does the bug spam this message in your chat, but it also makes your screen completely black.

OpenGL Error 1282

What causes Minecraft OpenGL Error 1282 (Invalid Operation)? The OpenGL Error 1282 can be caused by various errors. Here are the main reasons: 

  • Outdated or corrupt graphic drive
  • Corrupted shaders
  • Your computer may not have the proper hardware
  • Your browser may not support OpenGL
  • Incompatible Mods
  • Malware infection 
  • Outdated java program
  • The opengl32.dll file is missing
  • Outdated Optifine

Here are some helpful solutions for the OpenGL Error 1282. You can select the one you like to solve the Open GL Error 1282 on your PC.

Solution 1. Update Graphics Driver

If your graphics drive is outdated or corrupt, you can encounter the OpenGL Error 1282 easily. So, you can update your graphics drive to fix it. Here’s the way:

  1. Press the Windows and R keys at the same time.
  2. Type “devmgmt.msc” in the box and click OK to open the Device Manager window.
  3. Next, expand the Display adapters category and then right-click the drive name.
  4. Then select Update driver from the menu.
  5. In the new window, select the “Search automatically for drivers” option and then follow the on-screen instructions.
  6. Update all the available drivers and restart your system.
  7. Once done, restart your PC and check if the OpenGL Error 1282 is fixed.

Solution 2. Update Minecraft

Updating Minecraft can fix many basic errors, including OpenGL Error 1282. To update it, you can go to the Microsoft Store or the official forum of Minecraft to download and install the latest update manually.

Solution 3. Update Java

Java not only has an important effect on your system, but it also plays a crucial role in the smooth gameplay of Minecraft. If your Java program is outdated, you will see OpenGL Error 1282 (invalid operation) on your PC. You can do as follows to update it:

  1. Write down what system type your computer is.
  2. Open the browser on your PC and then go to the official Java site to download the compatible update for your OS architecture.
  3. Then, double-click the file to begin updating, and then follow the on-screen instructions to finish it
  4. Once done, copy the entire folder from the root directory.
  5. Next, press the Windows and E keys to open the Windows Explorer.
  6. Navigate to “C:\\Program Files\\Java” (32-bit)” or “C:\\Program Files (x86)\\Java” (64-bit) in Windows Explorer.
  7. Paste the folder which you have copied already and select the “Replace All” button on the pop-up window.
  8. Go back to your desktop and launch Minecraft.
  9. Then select the “Forge MOD Manager” option from the welcome screen.
  10. Select the “Edit Profile” option and then assign the correct Java path on your system under the “Java Settings (Advanced)” option.
  11. Save the settings and relaunch your game. Once done, check if the error is fixed.

Solution 4. Update OptiFine

An outdated version of Optifine can cause errors, especially if you’re using other mods. If the OpenGL Error 1282 error on your PC is caused by the outdated Optifine, you can try keeping your Optifine Mod up to date to fix it.

Solution 5. Disable Shaders

Although Shaders can change Minecraft’s entire look completely, it can use a hefty amount of your system’s resources and result in game performance issues.

In addition to this, it can also conflict with Optifine or Mods and cause errors like OpenGL Error 1282. So, if you encounter OpenGL Error 1282 (Invalid Operation) on your PC, you can try disabling Shaders to fix it.

Solution 6. Add the OpenGL32.dll File Manually

Many people have reported that by adding the opengl32.dll file manually, they were able to resolve the Minecraft OpenGL Error 1282 (Invalid Operation). You can also have a try. Here’s the guide:

  1. Press Windows and I keys to open the Settings
  2. Select System and then select About from the left panel.
  3. Write down your computer’s System type (either 32-bit or 64-bit).
  4. Open a web browser and go to the official website of DLL-Files or any other trusted third-party sites.
  5. Download a compatible DLL file according to your OS architecture and copy the entire file.
  6. Back to your desktop and then right-click the Minecraft Launcher icon.
  7. Select the “Open File Location” option from the menu.
  8. Next, find the “Runtime” folder and open the “JRE-x64” folder inside it.
  9. Find and open the “bin” folder inside it and paste the DLL file which you have already copied.
  10. Restart your Windows system and relaunch the game to check if the error is fixed.

Solution 7. Disable the Show GL Errors Option

If the Minecraft OpenGL Error 1282 (Invalid Operation) on your PC is the first type that only shows up in your chat, and the rest of your game works fine, you can try disabling the Show GL Errors option to fix it. Here are the steps:

  1. Open Minecraft and then press Escape on your keyboard.
  2. Select Options… > Video Settings… > Other… button.
  3. Click on the “ShowGL Errors” option to disable it.
  4. Click on Done. Then you can play the game without the error message showing on the chat location.

Bottom Line

Are you interested in MiniTool Partition Wizard and want to know more about it? If you are, you can visit MiniTool Partition Wizard’s official website by clicking the hyperlink. MiniTool Partition Wizard is an all-in-one partition manager and can be used for data recovery and disk diagnosis.

About The Author

Charlotte

Position: Columnist

Charlotte is a columnist who loves to help others solve errors in computer use. She is good at data recovery and disk & partition management, which includes copying partitions, formatting partitions, etc. Her articles are simple and easy to understand, so even people who know little about computers can understand. In her spare time, she likes reading books, listening to music, playing badminton, etc.

Видеокарты, особенно графические процессоры, которые запускают более требовательные приложения и игры, обычно требуют проприетарных драйверов. У Nvidia, AMD и Intel есть проприетарные драйверы для соответствующих видеокарт, как и у других производителей графических процессоров.

Оглавление

OpenGL часто называют драйверами с открытым исходным кодом для графических процессоров, но это не совсем так. Это стандарт, и для него разрабатываются приложения. Существуют используемые библиотеки и соблюдаются спецификации. В некоторых случаях используются его реализации с открытым исходным кодом.

Если вы пытаетесь запускать приложения, игры или просто загружаетесь в систему и видите ошибки OpenGL, попробуйте следующие исправления.

1. Запустите сканирование SFC.

Первое, что вам нужно сделать для устранения ошибок OpenGL, — это запустить сканирование SFC. Если проблема в вашей ОС, она решит ее.

Откройте командную строку с правами администратора.
Выполните эту команду: sfc / scannow.
Подождите, пока команда завершится, и исправьте все обнаруженные ошибки.

2. Установите последние графические драйверы.

OpenGL не является драйвером, но он работает с графическими адаптерами и приложениями, требующими высокой обработки графики. Таким образом, если графические драйверы устарели, вы Сентябрь получить ошибки OpenGL.

Откройте диспетчер устройств.
Разверните Display Adapters.
Щелкните видеокарту правой кнопкой мыши и выберите «Обновить драйверы».
Найдите в Интернете обновления драйверов и установите те, которые доступны.
Повторите для графического процессора.
После установки обновлений драйверов перезагрузите систему.

3. Удалите и переустановите приложение / игру.

Драйверы OpenGL Сентябрь относиться к конкретному приложению или игре. Вероятно, это означает, что файлы приложения повреждены или оно установлено неправильно. Простой способ исправить это — удалить и переустановить приложение / игру.

Откройте Панель управления.
Перейдите в «Программы»> «Удалить программу».
Выберите приложение / игру, которую хотите удалить.
Щелкните кнопку Удалить.
Установите приложение / игру еще раз.

Включить высокопроизводительные визуальные эффекты

Ошибки OpenGL Сентябрь быть вызвано тем, что ваша система работает с низким энергопотреблением или если в ней отключены визуальные эффекты.

Нажмите сочетание клавиш Win + R, чтобы открыть окно запуска.
В поле «Выполнить» введите оболочку проводника ::: {BB06C0E4-D293-4f75-8A90-CB05B6477EEE} и нажмите «Ввод».
Щелкните Дополнительные параметры системы в столбце слева.
Перейдите на вкладку Advanced.
Щелкните Параметры в разделе «Производительность».
Выберите «Настроить» для достижения наилучшей производительности.
Нажмите ОК и перезапустите систему.

Включить OpenGL в приложении

Возможно, приложение (или игра) поддерживает OpenGL, но имеет возможность отключить его. Версия Minecraft для Java — пример одной из таких игр. Проверьте приложение / игру, которая вызывает у вас проблемы, и посмотрите, сможете ли вы включить в нем OpenGL.

Заключение

Ошибки OpenGL могут быть вызваны множеством причин; поврежденные файлы ОС, устаревшие драйверы, плохо разработанные приложения, неправильная конфигурация системы и многое другое. Если вы видите конкретную ошибку OpenGL, вам следует устранить ее напрямую. Перечисленные нами исправления предназначены для решения более общих проблем OpenGL.

image Графическое программирование — не только источник веселья, но еще и фрустрации, когда что-либо не отображается так, как задумывалось, или вообще на экране ничего нет. Видя, что большая часть того, что мы делаем, связана с манипулированием пикселями, может быть трудно выяснить причину ошибки, когда что-то работает не так, как полагается. Отладка такого вида ошибок сложнее, чем отладка ошибок на CPU. У нас нет консоли, в которую мы могли бы вывести текст, мы не можем поставить точку останова в шейдере и мы не можем просто взять и проверить состояние программы на GPU.

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

Содержание

Часть 2. Базовое освещение

Часть 3. Загрузка 3D-моделей

Часть 4. Продвинутые возможности OpenGL

Часть 5. Продвинутое освещение

glGetError()

Когда вы некорректно используете OpenGL (к примеру, когда настраиваете буфер, забыв его связать (to bind)), OpenGL заметит и создаст один или несколько пользовательских флагов ошибок за кулисами. Мы можем эти ошибки отследить, вызывая функцию glGetError(), которая просто проверяет выставленные флаги ошибок и возвращает значение ошибки, если случились ошибки.

GLenum glGetError();

Эта функция возвращает флаг ошибки или вообще никакую ошибку. Список возвращаемых значений:

Внутри документации к функциям OpenGL вы можете найти коды ошибок, которые генерируются функциями, некорректно используемыми. К примеру, если вы посмотрите на документацию к функции glBindTexture(), то вы сможете найти коды ошибок, генерируемые этой функцией, в разделе «Ошибки» (Errors).
Когда флаг ошибки установлен, никаких других флагов ошибки сгенерировано не будет. Более того, когда glGetError вызывается, функция стирает все флаги ошибок (или только один на распределенной системе, см. ниже). Это значит, что если вы вызываете glGetError один раз после каждого кадра и получаете ошибку, это не значит, что это — единственная ошибка и еще вы не знаете, где произошла эта ошибка.

Заметьте, что когда OpenGL работает распределенно, как это часто бывает на системах с X11, другие ошибки могут генерироваться, пока у них различные коды. Вызов glGetError тогда просто сбрасывает только один из флагов кодов ошибки вместо всех. Из-за этого и рекомендуют вызывать эту функцию в цикле.

glBindTexture(GL_TEXTURE_2D, tex);
std::cout << glGetError() << std::endl; // вернет 0 (нет ошибки)
glTexImage2D(GL_TEXTURE_3D, 0, GL_RGB, 512, 512, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
std::cout << glGetError() << std::endl; // вернет 1280 (неверное перечисление)
glGenTextures(-5, textures);
std::cout << glGetError() << std::endl; // вернет 1281 (неверное значение
std::cout << glGetError() << std::endl; // вернет 0 (нет ошибки)

Отличительной особенностью glGetError является то, что она позволяет относительно легко определить, где может быть любая ошибка, и проверить правильность использования OpenGL. Скажем, что у вас ничего не отрисовывается, и вы не знаете, в чем причина: неправильно установленный кадровый буфер? Забыл установить текстуру? Вызывая glGetError везде, вы сможете быстро понять, где возникает первая ошибка.
По умолчанию, glGetError сообщает только номер ошибки, который нелегко понять, пока вы не заучиваете номера кодов. Часто имеет смысл написать небольшую функцию, помогающую напечатать строку с ошибкой вместе с местом, откуда вызывается функция.

GLenum glCheckError_(const char *file, int line)
{
    GLenum errorCode;
    while ((errorCode = glGetError()) != GL_NO_ERROR)
    {
        std::string error;
        switch (errorCode)
        {
            case GL_INVALID_ENUM:                  error = "INVALID_ENUM"; break;
            case GL_INVALID_VALUE:                 error = "INVALID_VALUE"; break;
            case GL_INVALID_OPERATION:             error = "INVALID_OPERATION"; break;
            case GL_STACK_OVERFLOW:                error = "STACK_OVERFLOW"; break;
            case GL_STACK_UNDERFLOW:               error = "STACK_UNDERFLOW"; break;
            case GL_OUT_OF_MEMORY:                 error = "OUT_OF_MEMORY"; break;
            case GL_INVALID_FRAMEBUFFER_OPERATION: error = "INVALID_FRAMEBUFFER_OPERATION"; break;
        }
        std::cout << error << " | " << file << " (" << line << ")" << std::endl;
    }
    return errorCode;
}
#define glCheckError() glCheckError_(__FILE__, __LINE__) 

Если вы решите сделать больше вызовов glCheckError, будет полезно знать в каком месте произошла ошибка.

glBindBuffer(GL_VERTEX_ARRAY, vbo);
glCheckError();

Вывод:


Осталась одна важная вещь: в GLEW есть давний баг: glewInit() всегда выставляет флаг GL_INVALID_ENUM. Чтобы это исправить, просто вызывайте glGetError после glewInit чтобы сбросить флаг:

glewInit();
glGetError();

glGetError не сильно помогает, поскольку возвращаемая информация относительно проста, но часто помогает отловить опечатки или отловить место возникновения ошибки. Это простой, но эффективный инструмент для отладки.

Отладочный вывод

Инструмент менее известный, но полезнее, чем glCheckError — расширение OpenGL «debug output» (Отладочный вывод), вошедшее в OpenGL 4.3 Core Profile. С этим расширением OpenGL отошлет сообщение об ошибке пользователю с деталями ошибки. Это расширение не только выдает больше информации, но и позволяет отловить ошибки там, где они возникают, используя отладчик.

Отладочный вывод входит в OpenGL начиная с версии 4.3, что означает, что вы найдете эту функциональность на любой машине, поддерживающей OpenGL 4.3 и выше. Если такая версия недоступна, то можно проверить расширения ARB_debug_output и AMD_debug_output. Также есть непроверенная информация о том, что отладочный вывод не поддерживается на OS X (автор оригинала и переводчик не тестировали, прошу сообщать автору оригинала или мне в личные сообщения через механизм исправления ошибок, если найдете подтверждение или опровержение данного факта; UPD: Jeka178RUS проверил этот факт: из коробки отладочный вывод не работает, через расширения он не проверял).

Чтобы начать использовать отладочный вывод, нам надо у OpenGL запросить отладочный контекст во время инициализационного процесса. Этот процесс отличается на разных оконных системах, но здесь мы обсудим только GLFW, но в конце статьи в разделе «Дополнительные материалы» вы можете найти информацию насчет других оконных систем.

Отладочный вывод в GLFW

Запросить отладочный контекст в GLFW на удивление просто: нужно всего лишь дать подсказку GLFW, что мы хотим контекст с поддержкой отладочного вывода. Нам надо сделать это до вызова glfwCreateWindow:

glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);

Как только мы проинициализировали GLFW, у нас должен появиться отладочный контекст, если мы используем OpenGL 4.3 или выше, иначе нам надо попытать удачу и надеяться на то, что система все еще может создать отладочный контекст. В случае неудачи нам надо запросить отладочный вывод через механизм расширений OpenGL.

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

Чтобы проверить результат инициализации отладочного контекста, достаточно выполнить следующий код:

GLint flags; glGetIntegerv(GL_CONTEXT_FLAGS, &flags);
if (flags & GL_CONTEXT_FLAG_DEBUG_BIT)
{
    // успешно
}
else
{
    // не получилось
}

Как работает отладочный вывод? Мы передаем callback-функцию обработчик сообщений в OpenGL (похоже на callback’и в GLFW) и в этой функции мы можем обрабатывать данные OpenGL как нам угодно, в нашем случае — отправка полезных сообщений об ошибках на консоль. Прототип этой функции:

void APIENTRY glDebugOutput(GLenum source, GLenum type, GLuint id, GLenum severity, 
                            GLsizei length, const GLchar *message, void *userParam);

Заметьте, что на некоторых операционных системах тип последнего параметра может быть const void*.
Учитывая большой набор данных, которыми мы располагаем, мы можем создать полезный инструмент печати ошибок, как показано ниже:

void APIENTRY glDebugOutput(GLenum source, 
                            GLenum type, 
                            GLuint id, 
                            GLenum severity, 
                            GLsizei length, 
                            const GLchar *message, 
                            void *userParam)
{
    // ignore non-significant error/warning codes
    if(id == 131169 || id == 131185 || id == 131218 || id == 131204) return; 

    std::cout << "---------------" << std::endl;
    std::cout << "Debug message (" << id << "): " <<  message << std::endl;

    switch (source)
    {
        case GL_DEBUG_SOURCE_API:             std::cout << "Source: API"; break;
        case GL_DEBUG_SOURCE_WINDOW_SYSTEM:   std::cout << "Source: Window System"; break;
        case GL_DEBUG_SOURCE_SHADER_COMPILER: std::cout << "Source: Shader Compiler"; break;
        case GL_DEBUG_SOURCE_THIRD_PARTY:     std::cout << "Source: Third Party"; break;
        case GL_DEBUG_SOURCE_APPLICATION:     std::cout << "Source: Application"; break;
        case GL_DEBUG_SOURCE_OTHER:           std::cout << "Source: Other"; break;
    } std::cout << std::endl;

    switch (type)
    {
        case GL_DEBUG_TYPE_ERROR:               std::cout << "Type: Error"; break;
        case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: std::cout << "Type: Deprecated Behaviour"; break;
        case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:  std::cout << "Type: Undefined Behaviour"; break; 
        case GL_DEBUG_TYPE_PORTABILITY:         std::cout << "Type: Portability"; break;
        case GL_DEBUG_TYPE_PERFORMANCE:         std::cout << "Type: Performance"; break;
        case GL_DEBUG_TYPE_MARKER:              std::cout << "Type: Marker"; break;
        case GL_DEBUG_TYPE_PUSH_GROUP:          std::cout << "Type: Push Group"; break;
        case GL_DEBUG_TYPE_POP_GROUP:           std::cout << "Type: Pop Group"; break;
        case GL_DEBUG_TYPE_OTHER:               std::cout << "Type: Other"; break;
    } std::cout << std::endl;

    switch (severity)
    {
        case GL_DEBUG_SEVERITY_HIGH:         std::cout << "Severity: high"; break;
        case GL_DEBUG_SEVERITY_MEDIUM:       std::cout << "Severity: medium"; break;
        case GL_DEBUG_SEVERITY_LOW:          std::cout << "Severity: low"; break;
        case GL_DEBUG_SEVERITY_NOTIFICATION: std::cout << "Severity: notification"; break;
    } std::cout << std::endl;
    std::cout << std::endl;
}

Когда расширение определяет ошибку OpenGL, оно вызовет эту функцию и мы сможем печатать огромное количество информации об ошибке. Заметьте, мы проигнорировали некоторые ошибки, так как они бесполезны (к примеру, 131185 в драйверах NVidia говорит о том, что буфер успешно создан).
Теперь, когда у нас есть нужный callback, самое время инициализировать отладочный вывод:

if (flags & GL_CONTEXT_FLAG_DEBUG_BIT)
{
    glEnable(GL_DEBUG_OUTPUT);
    glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); 
    glDebugMessageCallback(glDebugOutput, nullptr);
    glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE);
} 

Так мы сообщаем OpenGL, что хотим включить отладочный вывод. Вызов glEnable(GL_DEBUG_SYNCRHONOUS) говорит OpenGL, что мы хотим сообщение об ошибке в тот момент, когда только она произошла.

Фильтрация отладочного вывода

С функцией glDebugMessageControl вы можете выбрать типы ошибок, которые хотите получать. В нашем случае мы получаем все виды ошибок. Если бы мы хотели только ошибки OpenGL API, типа Error и уровня значимости High, мы бы написали следующий код:

glDebugMessageControl(GL_DEBUG_SOURCE_API, 
                      GL_DEBUG_TYPE_ERROR, 
                      GL_DEBUG_SEVERITY_HIGH,
                      0, nullptr, GL_TRUE); 

С такой конфигурацией и отладочным контекстом каждая неверная команда OpenGL будет отправлять много полезной информации:

Находим источник ошибки через стек вызовов

Еще один трюк с отладочным выводом заключается в том, что вы можете относительно просто установить точное место возникновения ошибки в вашем коде. Устанавливая точку останова в функции DebugOutput на нужном типе ошибки (или в начале функции если вы хотите отловить все ошибки) отладчик отловит ошибку и вы сможете переместиться по стеку вызовов, чтобы узнать, где произошла ошибка:


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

Свои ошибки

Наряду с чтением ошибок, мы можем их посылать в систему отладочного вывода с помощью glDebugMessageInsert:

glDebugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0,
                     GL_DEBUG_SEVERITY_MEDIUM, -1, "error message here");

Это очень полезно, если вы подключаетесь к другому приложению или к коду OpenGL, который использует отладочный контекст. Другие разработчики смогут быстро выяснить любую сообщенную ошибку, которая происходит в вашем пользовательском коде OpenGL.
В общем, отладочный вывод (если доступен) очень полезен для быстрого отлова ошибок и определенно стоит потраченных усилий на настройку, так как экономит значительное время разработки. Вы можете найти копию исходного кода здесь с использованием glGetError и отладочного вывода. Есть ошибки, попробуйте их исправить.

Отладочный вывод шейдера

Когда дело доходит до GLSL, у нас нет доступа к функции типа glGetError или возможности пройтись по коду по шагам в отладчике. Когда вы встречаетесь с черным экраном или совершенно неправильным отображением, бывает очень сложно понять, что происходит, если проблема в шейдере. Да, ошибки компиляции сообщают о синтаксических ошибках, но отлов семантических ошибок — та еще песня.
Один из часто используемых приемов для выяснения того, что не так с шейдером, состоит в том, чтобы отправить все соответствующие переменные в шейдерной программе непосредственно в выходной канал фрагментного шейдера. Выводя шейдерные переменные напрямую в выходной канал с цветом мы можем узнать интересную информацию проверяя картинку на выходе. К примеру, нам надо узнать, правильные ли нормали у модели. Мы можем отправить их (трансформированными или нет) из вершинного в фрагментный шейдер, где мы выведем нормали как-то так:
(прим. пер: почему нет подсветки синтаксиса GLSL?)

#version 330 core
out vec4 FragColor;
in vec3 Normal;
[...]

void main()
{
    [...]
    FragColor.rgb = Normal;
    FragColor.a = 1.0f;
}

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

Из визуальных результатов мы можем видеть, что нормали верны, так как правая сторона костюма преимущественно красная (что говорит, что нормали примерно показывают в направлении полощительной оси x) и также передняя сторона костюма окрашена в направлении положительной оси z (в синий цвет).

Этот подход можно расширить на любую переменную, которую вы хотите протестировать. Каждый раз, когда вы застряли и предполагаете, что ошибка в шейдерах, попробуйте отрисовывать несколько переменных или промежуточных результатов и выяснить, в какой части алгоритма есть ошибка.

OpenGL GLSL reference compiler

В каждом видеодрайвере свои причуды. К примеру, драйвера NVIDIA немного смягчают требования спецификации, а драйвера AMD лучше соответствую спецификациям (что лучше, как мне кажется). Проблема в том, что шейдеры работающие на одной машине, могут не заработать на другой из-за отличий в драйверах.

За несколько лет опыта вы могли выучить все отличия между различными GPU, но если вы хотите быть уверены в том, что ваши шейдеры будут работать везде, то вы можете сверить ваш код с официальной спецификацией с помощью GLSL reference compiler. Вы можете скачать так называемый GLSL lang validator тут (исходник).

С этой программой вы можете проверить свои шейдеры, передавая их как 1-й аргумент к программе. Помните, что программа определяет тип шейдера по расширению:

  • .vert: вершинный шейдер
  • .frag: фрагментный шейдер
  • .geom: геометрический шейдер
  • .tesc: тесселяционный контролирующий шейдер
  • .tese: тесселяционный вычислительный шейдер
  • .comp: вычислительный шейдер

Запустить программу легко:

glslangValidator shader.vert

Заметьте, что если нет ошибок, то программа ничего не выведет. На сломанном вершинном шейдере вывод будет похож на:

Программа не покажет различий между компиляторами GLSL от AMD, NVidia или Intel, и даже не может сообщить обо всех багах в шейдере, но он хотя бы проверяет шейдеры на соответствие стандартам.

Вывод буфера кадра

Еще один метод для вашего инструментария — отобразить содержимое кадрового буфера в определенной части экрана. Скорее всего, вы часто используете кадровые буферы и, поскольку вся магия происходит за кадром, бывает трудно определить, что происходит. Вывод содержимого кадрового буфера — полезный прием, чтобы проверить правильность вещей.

Заметьте, что содержимое кадрового буфера, как тут объясняется, работает с текстурами, а не с объектами буферов отрисовки

Используя простой шейдер, который отрисовывает одну текстуру, мы можем написать небольшую функцию, быстро отрисовывающую любую текстуру в правом верхнем углу экрана:

// vertex shader
#version 330 core
layout (location = 0) in vec2 position;
layout (location = 1) in vec2 texCoords;

out vec2 TexCoords;

void main()
{
    gl_Position = vec4(position, 0.0f, 1.0f);
    TexCoords = texCoords;
}

//fragment shader
#version 330 core
out vec4 FragColor;
in vec2 TexCoords;

uniform sampler2D fboAttachment;

void main()
{
    FragColor = texture(fboAttachment, TexCoords);
}

//main.cpp
void DisplayFramebufferTexture(GLuint textureID)
{
    if(!notInitialized)
    {
        // initialize shader and vao w/ NDC vertex coordinates at top-right of the screen
        [...]
    }
    glActiveTexture(GL_TEXTURE0);
    glUseProgram(shaderDisplayFBOOutput);
    glBindTexture(GL_TEXTURE_2D, textureID);
    glBindVertexArray(vaoDebugTexturedRect);
    glDrawArrays(GL_TRIANGLES, 0, 6);
    glBindVertexArray(0);
    glUseProgram(0);
}
int main()
{
    [...]
    while (!glfwWindowShouldClose(window))
    {
        [...]
        DisplayFramebufferTexture(fboAttachment0);
        glfwSwapBuffers(window);
    }
}

Это даст вам небольшое окошко в углу экрана для отладочного вывода кадрового буфера. Полезно, к примеру, когда пытаешься проверить корректность нормалей:

Вы также можете расширить эту функцию так, чтобы она отрисовывала больше 1 текстуры. Это быстрый путь получить непрерывную отдачу от чего угодно в кадровых буферах.

Внешние программы-отладчики

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

Я перечислил несколько популярных инструментов. Попробуйте каждый и выберите тот, который лучше всего вам подходит.

RenderDoc

RenderDoc — хороший (полностью опенсорсный) отдельный отладочный инструмент. Чтобы начать захват, выберите исполняемый файл и рабочую папку (working directory). Ваше приложение работает как обычно, и когда вы хотите понаблюдать за отдельным кадром, вы позволяете RenderDoc снять несколько кадров вашего приложения. Среди захваченных кадров вы можете просмотреть состояние конвейера, все команды OpenGL, хранилище буферов и используемые текстуры.

CodeXL

CodeXL — инструмент отладки GPU, работает как отдельное приложение и плагин к Visual Studio. CodeXL Дает много информации и отлично подходит для профилирования графических приложений. CodeXL также работает на видеокартах от NVidia и Intel, но без поддержки отладки OpenCL.

Я не так много использовал CodeXL, поскольку RenderDoc мне показался проще, но я включил CodeXL в этот список, потому что он выглядит довольно надежным инструментом и в основном разработан одним из крупных производителей графических процессоров.

NVIDIA Nsight

Nsight — популярный инструмент отладки GPU от NUIDIA. Является не только плагином к Visual Studio и Eclipse, но еще и отдельное приложение. Плагин Nsight — очень полезная вещь для графических разработчиков, поскольку собирает много статистик в реальном времени относительно использования GPU и покадрового состояния GPU.

В тот момент, когда вы запускаете свое приложение через Visual Studio или Eclipse с помощью команд отладки или профилирования Nsight, он запустится сам внутри приложения. Хорошая вещь в Nsight: рендер ГИП-системы (GUI, графический интерфейс пользователя) поверх запускаемого приложения, которую можно использовать для собирания информации всех видов о вашем приложении в реальном времени или покадровом анализе.

Nsight — очень полезный инструмент, который, по моему мнению, превосходит вышеперечисленные инструменты, но имеет один серьезный недостаток: работает только на видеокартах от NVIDIA. Если вы работаете на видеокартах от NVIDIA и используете Visual Studio — определенно стоит попробовать Nsight.

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

Дополнительные материалы

  • Почему я вижу черный экран? — список возможных случаев появления черного экрана вместо нужной картинки от Reto Koradi.
  • Отладочный вывод — обширный список методов настройки отладочного контекста в разных оконных менеджерах от Vallentin Source.

P.S.: У нас есть телеграм-конфа для координации переводов. Если есть серьезное желание помогать с переводом, то милости просим!

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Альтернативное голосование

Проголосовал 31 пользователь.

Воздержались 8 пользователей.

OpenGL в Minecraft является своеобразным модулем, предназначенным для обеспечения более плавной и быстрой игра. Также опция снижает нагрузку при рендеринге, убирая из обработки те данные, которые не нудно обрабатывать. Например, текстуры, что сейчас не видны персонажу. Однако бывают и проблемы с данной технологией, одна из них связана с ошибкой OpenGL Error: 1281 (Invalid value) в Minecraft. Подробности о причинах и исправлениях данной ошибки читайте в данном руководстве.

Причины

На основе тех данных, что нам удалось получить из пользовательских отчетов, мы можем выделить следующие причины:

  • Конфликт модов все еще имеет место быть.
  • Проблемы с OptiFine.
  • Различные сбои шейдеров.

Как исправить ошибку OpenGL 1281?

Сперва стоит сказать, что ошибка с кодом 1281 появляется по той причине, что у вас включена отладка OpenGL. Если вы не видите каких-либо проблем, кроме спама ошибки в чат игры, можно просто ее отключить. Предостережение в том, что появление данной ошибки может немного снижать ваш игровой fps. Если сбой появляется редко, это не будет проблемой. Для этого переходим в «Другие настройки» (Other Settings) и выключаем опцию «Показывать ошибки GL» (Show GL Errors).

Если же заметны какие-то проблемы с работой Minecraft, следует попробовать такие способы:

  • Отключить последние установленные моды. Если ошибка 1281 в Minecraft появилась после установки новых модов, следует их отключить или удалить. Вот ссылка на источник.
  • Выключить шейдеры. Дополнительные ландшафты часто провоцируют сбой в обработке при смене погоды, сезона и т. п. Для этого переходим в appdata/minecraft/ и удаляем папку shaderspack.
  • Обновить OptiFine. Еще один инструмент оптимизации, который в старых версиях может сбоить. Предназначается для получения HD-текстур. Можно скачать с официального сайта.
  • Отключить VBO. Данная настройка в общем-то полезна, так как улучшает скорость обработки графики. Однако она также может вызывать ошибку. В «Настройках» Minecraft ее легко можно выключить (Use VBOs: Off). Проверяем результат. Этот способ предложен здесь и, похоже, он работает.

OpenGL 1281

В крайнем случае вы можете переустановить Minecraft, это тоже должно сработать. Конечно, прежде стоит испробовать перечисленные настройки графики или просто отключить отладку. Мы же ждем от вас комментариев с вашими отчетами о проделанной работе и результатах процедур.

Понравилась статья? Поделить с друзьями:
  • Opel ошибка 56471
  • Opel vectra сброс ошибок
  • Open gapps ошибка 70
  • Opel ошибка 0650
  • Opel ошибка 0501