У меня было время взглянуть на это и обнаружил, что у вас произошла ошибка вставки маленькой копии:
unsigned int CreateShader(std::string& vertexShader, std::string& fragmentShader) {
unsigned int program = glCreateProgram();
unsigned int vs = CompileShader(GL_VERTEX_SHADER, vertexShader);
unsigned int fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader);
glAttachShader(program, vs);
glAttachShader(program, vs); //<--should be fs
Вы подключаете вершинный шейдер дважды.Это установит ошибку OpenGL, и на самом деле я нашел ее с помощью метода отладки OpenGL, который я обычно использую.Когда я пошел тестировать ваш код более подробно, я окружил все вызовы OpenGL определением, которое останавливает выполнение, если OpenGL выдает ошибку.Я помещаю это в верхнюю часть исходного кода и рекомендую использовать это:
#include <cstdlib>
#include <iostream>
#include <iomanip>
void CheckOpenGLError(const char *stmt, const char *fname, int line);
#define GL_CHECK(stmt) \
do \
{ \
stmt; \
CheckOpenGLError(#stmt, __FILE__, __LINE__); \
} while (0)
void CheckOpenGLError(const char *stmt, const char *fname, int line)
{
GLenum err = glGetError();
if (err != GL_NO_ERROR)
{
std::cout << "OpenGL error 0x" << std::setfill('0') << std::setw(8) << std::hex << err << std::dec << ": " << gluErrorString(err) << ", at " << fname << ":" << line << " - for " << stmt << std::endl;
abort();
}
}
Вам потребуется дополнительная ссылка в библиотеке glu (glu32.lib в windows или libGLU.so в linux) для функции gluErrorStringесли вы хотите, чтобы ошибка OpenGL распечатывалась в удобочитаемой форме, в противном случае вам нужно поискать код ошибки.В этом случае я окружил ваши звонки так:
unsigned int CreateShader(std::string& vertexShader, std::string& fragmentShader) {
unsigned int program = glCreateProgram();
unsigned int vs = CompileShader(GL_VERTEX_SHADER, vertexShader);
unsigned int fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader);
GL_CHECK(glAttachShader(program, vs));
GL_CHECK(glAttachShader(program, vs)); //<--should be fs
Который затем выдал эту ошибку, когда я запустил код:
OpenGL error 0x00000502: invalid operation, at main.cpp:147 - for glAttachShader(program, vs)
Также небольшая заметка, вы должны, вероятно,отсоедините шейдеры после того, как вы закончите связывание:
https://gamedev.stackexchange.com/a/47912
unsigned int CreateShader(std::string& vertexShader, std::string& fragmentShader) {
unsigned int program = glCreateProgram();
unsigned int vs = CompileShader(GL_VERTEX_SHADER, vertexShader);
unsigned int fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader);
glAttachShader(program, vs);
glAttachShader(program, fs);
glLinkProgram(program);
glValidateProgram(program);
glDetachShader(program, vs);
glDetachShader(program, fs);
glDeleteShader(vs);
glDeleteShader(fs);
return program;
}