Сбой OpenGL glUseProgram (ошибка 1282 — INVALID_OPERATION)

Прежде чем я начну. Моя шейдерная программа успешно связана, и все связанные модули
успешно скомпилирован.

Итак, у меня есть программа OpenGL с реализацией SDL2 для использования профиля ядра с GL версии 4.0

SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
//...
mSimWindow.makeGLContext();      //inlines : mOpenGL = SDL_GL_CreateContext(mWindow);
mSimWindow.makeContextCurrent(); //inlines : SDL_GL_MakeCurrent(mWindow, mOpenGL);

На данный момент ошибок нет.

Я использую монолитную вариацию шейдерной программы. У меня есть два класса, чтобы справиться с этим,
Shader и ShaderProgram, где первый используется только последним.

Конструктор ShaderProgram принимает два пути к файлу: для вершинного шейдера и фрагментного шейдера.

Вот соответствующий код из этих классов;

bool
Shader::compile()
{
if (mType == Type::Undefined)
return false;

mShader = glCreateShader(static_cast<GLenum>(mType));

const GLchar * src = mRaw.c_str();
glShaderSource(mShader, 1, &src, nullptr);
glCompileShader(mShader);

GLint success = 0;
glGetShaderiv(mShader, GL_COMPILE_STATUS, &success);

if (success!=0)
{
//... some error handling
return false;
}

return true;
}

bool
ShaderProgram::link()
{
mProgram = glCreateProgram();

glAttachShader(mProgram, mVertexShader->shaderID());
glAttachShader(mProgram, mFragmentShader->shaderID());

glLinkProgram(mProgram);
glDetachShader(mProgram, mVertexShader->shaderID());
glDetachShader(mProgram, mFragmentShader->shaderID());

GLint isLinked;
glGetProgramiv(mProgram, GL_LINK_STATUS, (int *)&isLinked);

return (isLinked==0) ? true : false;
}

Вышеуказанное используется так

Graphics::ShaderProgram sp(".\\Shaders\\vertex.vert",
".\\Shaders\\fragment.frag");

//...
glClearColor(0.3, 0.3, 0.3, 1);
while (!(mSimState == SimulationState::Quiting))
{
SDL_PumpEvents();
glClear(GL_COLOR_BUFFER_BIT);
sp.use();
mesh.use();
//TwDraw();
mSimWindow.glSwap();
}

В заключение,

void
ShaderProgram::use()
{
glUseProgram(mProgram);
auto e = glGetError();
}

в итоге получается 1282 (INVALID_OPERATION)

Если в любой момент до glUseProgram (..) я вызываю glGetError (), он возвращает 0. Так что проблема как-то связана с этим вызовом. Причуда, которую я не очень понимаю, это то, что если я подпишу программу, то немного
ему как-то удастся его визуализировать, просто не используя мой шейдер.

Пример.
введите описание изображения здесь

Я довольно смущен, любая помощь или совет будут оценены.


редактировать:

Как продолжение. По какой-то причине я думал, что 0 было правдой, вздох. Использование GL_TRUE (1) заставило мой код обработки ошибок фактически показать мне ошибку.

Я сделал ту же ошибку, что и этот парень, когда читал шейдер: проблема компиляции шейдера glsl во время выполнения

std :: getline не вставляет символ новой строки, поэтому источник читается как одна строка; что, конечно, не действует.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]