J'ai un peu de problème avec mon code pour compiler les shaders, à savoir qu'ils s'annulent tous deux en tant que compilations échouées et qu'aucun journal n'est reçu.Erreur OpenGL Shader Compile
Ce code est la compilation de shaders:
/* Make the shader */
Uint size;
GLchar* file;
loadFileRaw(filePath, file, &size);
const char * pFile = file;
const GLint pSize = size;
newCashe.shader = glCreateShader(shaderType);
glShaderSource(newCashe.shader, 1, &pFile, &pSize);
glCompileShader(newCashe.shader);
GLint shaderCompiled;
glGetShaderiv(newCashe.shader, GL_COMPILE_STATUS, &shaderCompiled);
if(shaderCompiled == GL_FALSE)
{
ReportFiler->makeReport("ShaderCasher.cpp", "loadShader()", "Shader did not compile", "The shader " + filePath + " failed to compile, reporting the error - " + OpenGLServices::getShaderLog(newCashe.shader));
}
Et ce sont les fonctions support:
bool loadFileRaw(string fileName, char* data, Uint* size)
{
if (fileName != "")
{
FILE *file = fopen(fileName.c_str(), "rt");
if (file != NULL)
{
fseek(file, 0, SEEK_END);
*size = ftell(file);
rewind(file);
if (*size > 0)
{
data = (char*)malloc(sizeof(char) * (*size + 1));
*size = fread(data, sizeof(char), *size, file);
data[*size] = '\0';
}
fclose(file);
}
}
return data;
}
string OpenGLServices::getShaderLog(GLuint obj)
{
int infologLength = 0;
int charsWritten = 0;
char *infoLog;
glGetShaderiv(obj, GL_INFO_LOG_LENGTH,&infologLength);
if (infologLength > 0)
{
infoLog = (char *)malloc(infologLength);
glGetShaderInfoLog(obj, infologLength, &charsWritten, infoLog);
string log = infoLog;
free(infoLog);
return log;
}
return "<Blank Log>";
}
et les shaders que je suis chargement:
void main(void)
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
void main(void)
{
gl_Position = ftransform();
}
En bref, je obtenir
From: ShaderCasher.cpp, In: loadShader(), Subject: Shader did not compile
Message: The shader Data/Shaders/Standard/standard.vs failed to compile, reporting the error - <Blank Log>
pour chaque shader que je compile.
J'ai essayé de remplacer la lecture du fichier avec juste une chaîne codée en dur, mais j'ai la même erreur, donc il doit y avoir quelque chose de mal dans la façon dont je les compile. J'ai couru et compilé des exemples de programmes avec des shaders, donc je doute que mes drivers soient en cause, mais en tout cas je suis sur une Nvidia 8600m GT.
Quelqu'un peut-il aider?
Ce n'est pas un doublon exact, mais vous pourriez trouver cette réponse utile: http: // stackoverflow.com/questions/2795044/facile-cadre-pour-opengl-shaders-in-c-c/2796153 # 2796153 –
êtes-vous 'free()' -donnez votre 'data' n'importe où après loadFileRaw()'? À moins de manquer quelque chose, je vois une fuite de mémoire. –
Je prévoyais de mettre en cache ou d'afficher le code source du shader quelque part si la compilation échouait, mais je n'ai pas actuellement un enregistreur suffisamment sophistiqué pour le faire dans un format facile à lire. Je savais que j'avais besoin de libérer les données, mais une fois que la compilation de test échoue, vous jetez tous les autres éléments de côté pour trouver le problème. – Tomas