smt005 писал(а):
В твоём классе нет важной штуки (в моём пока тоже), сообщения о синтаксических ошибках, в случае если шейдер не скомпилируется.
Как я понимаю, это нужно лишь на этапе отладки программы? Типа, нужно проверить синтаксис указанного шейдера, да? Напиши такую вот простую функциёвину (инклюдать Shaders.h да требуется):
void CheckShaderSyntax(
unsigned int shaderType,
const char* ShaderFilePath){
unsigned int shader = glCreateShader(shaderType);
LoadShaderSource(shader, ShaderFilePath);
glCompileShader(shader);
int Length=
0; glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &Length);
if(Length>
0){
char* Info=(
char*)malloc(Length);
glGetShaderInfoLog(shader, Length, NULL, Info);
MessageBox(Handle, Info, ShaderFilePath, MB_OK);
free(Info);
}
glDeleteShader(shader);
}
Добавлено спустя 7 минут 10 секунд:Аргументы:
shaderType - тип шейдера (GL_VERTEX_SHADER или GL_FRAGMENT_SHADER);
ShaderFilePath - путь к файлу с шейдером.
Знач функция создаёт временный шейдерный объект, грузит код из файла, компиллирует шейдер, выкидывает сообщение с путём файла в заголовке и текстом ругани компиллятора в теле сообщения, затем удаляет шейдерный объект. Чисто функция проверки шейдера.
Я бы не хотел пихать её прямо в Shaders.h, поскольку MessageBox требует хэндлера окна приложения, так что добавь функцию CheckShaderSyntax в хеадер главной формы.
Добавлено спустя 4 минуты 15 секунд:З.Ы.: добавил в файл Shaders.h "автоинициализатор" функции glGetShaderInfoLog и перезалил файл.
Добавлено спустя 13 минут 25 секунд:А чё, прыкольно фурычит! Если тайпо ф шейдере накалякаю, разругивается на пару строчек, а если в шейдере ошибок нет, пишет "No errors."
Нужно ли чутка расфлюстратить функцию, чтобы не выкидывала ничего, если ошибок нет?
Добавлено спустя 13 минут:Шаман писал(а):
Нужно ли чутка расфлюстратить функцию, чтобы не выкидывала ничего, если ошибок нет?
Во, в таком варианте будет выкидывать сообщение только если шейдер некомпиллируемый или файл отсутствует:
void CheckShaderSyntax(
unsigned int shaderType,
const char* ShaderFilePath){
unsigned int shader = glCreateShader(shaderType);
bool Loaded = LoadShaderSource(shader, ShaderFilePath);
if(Loaded){
glCompileShader(shader);
int OK=
0; glGetShaderiv(shader,GL_COMPILE_STATUS,&OK);
if(OK==
0){
int Length=
0; glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &Length);
if(Length>
0){
char* Info=(
char*)malloc(Length);
glGetShaderInfoLog(shader, Length, NULL, Info);
MessageBox(Handle, Info, ShaderFilePath, MB_OK);
free(Info);
}
}
}
else MessageBox(Handle,
"File is missing!", ShaderFilePath, MB_OK);
glDeleteShader(shader);
}
Добавлено спустя 2 часа 12 минут 22 секунды:
---
А я тут выяснил проблему с gl_FragData[...]. Оказывается, фрагментный шейдер может использовать для записи эти буффера в случае, если аппликашка юзает Multiple Rendering Targets, с которыми я так и не сумел разобраться.
Эти буффера требуют инициализации, ибо по-умолчанию есть лишь один - gl_FragData[0], а все последующие не доступны без особого ритуала, постичь который в рамках OpenGL2.0 мне так и не удалось. Как минимум, мои попытки пока не увенчались успехом. Внятных туториалов также не удалось найти.
Ну вот, я поделился неудачами тут, так что, по закону подлости, скоро должно найтись решение... я надеюсь...
Добавлено спустя 13 минут 20 секунд:
Упрощённо попытаюсь объяснить, чего я добиваюсь.
У меня две шейдерных программы: одна используется для растеризации моделей, распихивая по буфферам gl_FragData[1], gl_FragData[2], gl_FragData[3]... разные аттрибуты пиксела (цвет в один буффер, нормаль в другой, бляскучесть в третий и т.д.), а вторая шейдерная прога накладывает освещение, используя данные из всех этих буфферов для вычисления конечного цвета пикселя в основном буффере - gl_FragData[0].
Т.е. процесс происходит так:
1) Включаю растеризационный шейдер;
2) растеризую все модели, заполняя буффера.
3) Включаю шейдер-освещалку;
4) накладываю все источники света.
В итоге полученной на экране каши я пнял, что лишь gl_FragData[0] хранит данные, в то время как чтения из всех остальных буфферов дают рандомные данные (т.е. не читаются и не пишутся).
Ну и как мне эти буффера инициализировать средствами OpenGL2.0 - я не вкуриваю.