#c #opengl #glsl
#c #opengl #glsl
Вопрос:
Я пытаюсь написать функцию для загрузки и компиляции шейдера с использованием OpenGL, но шейдер отказывается компилироваться, выдавая мне пустой (или случайный) журнал ошибок.
Ниже приведен мой минимальный пример:
vertexShader = glCreateShader( GL_VERTEX_SHADER );
std::string vertexSource = ShaderLoader::load("vertexShader.vert");
const char * vertexAdress = vertexSource.c_str();
glShaderSource( vertexShader, 1, amp;vertexAdress, NULL );
int shaderCompiled = GL_FALSE;
char errorLog[512];
glCompileShader(vertexShader);
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, amp;shaderCompiled );
glGetShaderInfoLog(vertexShader, 512, nullptr, amp;errorLog[0]);
glDeleteShader(vertexShader);
Вывод shaderCompiled
выдает 0
и errorLog
выдает либо пустую строку, либо несколько случайных символов.
Функция ShaderLoader::load
содержит следующий код:
std::string ShaderLoader::load(std::string source) {
std::string shader;
std::fstream readFile(source, std::ios::in);
if (readFile.is_open()){
std::stringstream buffer;
buffer << readFile.rdbuf();
shader = buffer.str() "";
} else {
throw std::runtime_error( "Couldn't load shader file: " source);
}
return shader;
}
Похоже, он работает так, как ожидалось. Исходный код шейдера
#version 330 core
layout (location = 0) in vec3 inVertex;
layout (location = 1) in vec3 inNormal;
out vec3 FragmentPosition;
out vec3 Normal;
uniform mat4 transform;
void main()
{
FragmentPosition = vec3(inVertex);
Normal = mat3(transpose(inverse(transform))) * inNormal;
gl_Position = transform * vec4( inVertex, 1 );
}
Как я могу errorLog
заполнить фактическое сообщение об ошибке или, что еще лучше, заставить шейдер скомпилироваться.
Комментарии:
1. Это опечатка. Вы используете 2 разные переменные
vertexShader
иshader
.2. Спасибо, что указали на это! Однако, к сожалению, он делает то же самое после изменения имени переменной. Я обновил вопрос.
3. Извините, проблема не воспроизводима. Код работает нормально. Код шейдера корректен и может быть успешно скомпилирован.
4. Вы проверяете
glError
? BecauseshaderCompiled
изменяется только тогда, когда ошибка не возникает. Вы инициализируете его с помощью false , поэтому он мог просто не быть изменен до его проверки. Как уже сказал Rabbid76: шейдер отлично компилируется для меня.5. Должно быть, я сделал что-то странное в остальной части моего кода. К сожалению,
glError
возвращаетсяGL_NO_ERROR
, поэтому я все еще в неведении. В любом случае, большое спасибо за ваш вклад.
Ответ №1:
Сначала используйте протоколирование ошибок, только если значение shaderCompiled равно false, чтобы вы не получали случайные строки,
glGetShaderiv(VS, GL_COMPILE_STATUS, amp;shaderCompiled);
if (!shaderCompiled)
{
//error
GLchar InfoLog[256];
glGetShaderInfoLog(vertexShader, sizeof(InfoLog), NULL, InfoLog);
Во-вторых, вы на самом деле связываете и используете шейдеры, проблема может быть не в компиляции:
// after compilation
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glLinkProgram(shaderProgram);
glDetachShader(shaderProgram, vertexShader);
glDeleteShader(vertexShader);
glGetProgramiv(shaderProgram, GL_LINK_STATUS, amp;success);