Прежде чем я начну. Моя шейдерная программа успешно связана, и все связанные модули
успешно скомпилирован.
Итак, у меня есть программа 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 не вставляет символ новой строки, поэтому источник читается как одна строка; что, конечно, не действует.
Задача ещё не решена.
Других решений пока нет …