//--------------------------------------------------------------------------- void ShaderProgram::ReportShaderProgramError( const std::string& vertexShaderFilePath, const std::string& fragmentShaderFilePath ) { int infoLogLength; g_theRenderer->VennGetProgramiv( m_programID, V_INFO_LOG_LENGTH, &infoLogLength ); char* infoLogText = new char[ infoLogLength + 1 ]; g_theRenderer->VennGetProgramInfoLog( m_programID, infoLogLength, nullptr, infoLogText ); std::string infoLogString( infoLogText ); delete[] infoLogText; std::string errorLineText( infoLogString ); // get full file path for Visual Studio char vertexFilePathBuffer[ _MAX_PATH ]; _fullpath( vertexFilePathBuffer, vertexShaderFilePath.c_str(), _MAX_PATH ); std::string vertexFullFilePath( vertexFilePathBuffer ); char fragmentFilePathBuffer[ _MAX_PATH ]; _fullpath( fragmentFilePathBuffer, fragmentShaderFilePath.c_str(), _MAX_PATH ); std::string fragmentFullFilePath( fragmentFilePathBuffer ); std::string errorLog = /*fullFilePath + */errorLineText.substr( 1 ); // print to debug log OutputDebugStringA( errorLog.c_str() ); // find line number from errorLineText int lineNumberBegin = errorLineText.find( '(' ); int lineNumberEnd = errorLineText.find( ')' ); std::string lineNumber = errorLineText.substr( lineNumberBegin + 1, lineNumberEnd - 2 ); // find error information from errorLineText int errorInfoBegin = errorLineText.find( ':', lineNumberEnd + 3 ); std::string errorInfo = errorLineText.substr( errorInfoBegin + 1 ); // get file name // size_t pos = shaderFilePath.rfind( "/" ); // std::string fileName = shaderFilePath.substr( pos + 1 ); std::string caption = "GLSL link error"; // get renderer and GLSL versions std::string renderVersion = reinterpret_cast< const char* >( g_theRenderer->VennGetString( V_VERSION ) ); std::string shaderVersion = reinterpret_cast< const char* >( g_theRenderer->VennGetString( V_SHADING_LANGUAGE_VERSION ) ); std::string messageBody = "GLSL shader link error!\n\n\nCurrent OpenGL Version: " + renderVersion + "\n" + "Current GLSL Version: " + shaderVersion + "\n\n" + "Vertex shader location: \n" + vertexFullFilePath + "\n\n" + "Fragment shader location: \n" + fragmentFullFilePath + "\n\n" + "RAW ERROR LOG: \n" + errorLineText + "\n\n\n" + "The application will now close."; MessageBoxA( nullptr, messageBody.c_str(), caption.c_str(), MB_OK ); }
//---------------------------------- int OpenGLRenderer::CreateShaderProgram(GLint vertexShaderID, GLint fragmentShaderID) { GLint wasSuccessful; GLint shaderProgramID = glCreateProgram(); glAttachShader( shaderProgramID, vertexShaderID ); glAttachShader( shaderProgramID, fragmentShaderID ); glLinkProgram( shaderProgramID ); glGetProgramiv( shaderProgramID ,GL_LINK_STATUS, &wasSuccessful); if (wasSuccessful != GL_TRUE) { GLint infoLogLength; glGetProgramiv( shaderProgramID, GL_INFO_LOG_LENGTH, &infoLogLength ); char* infoLogText = new char[ infoLogLength + 1 ]; glGetProgramInfoLog( shaderProgramID, infoLogLength, NULL, infoLogText ); std::string infoLogString( infoLogText ); OutputDebugStringA(infoLogText); int test = MessageBoxA(NULL, infoLogText, "ERROR", MB_OK | MB_TOPMOST); delete[] infoLogText; std::exit(0); } return shaderProgramID; }
//---------------------------------- int OpenGLRenderer::CreateVertexShader(const char* Filename) { FILE * shaderFile; long sizeOfFile; GLchar* shaderText; GLint wasSuccessful; GLint shaderID; shaderFile = fopen ( Filename,"rb"); if (shaderFile==NULL) { int filePathLength = strlen(Filename); char* errorLength = "File Not Found"; char* errorMessage = new char[filePathLength + strlen(errorLength) + 2]; std::strcpy(errorMessage, "File "); std::strcat(errorMessage, Filename); std::strcat(errorMessage, " not found."); int test = MessageBoxA(NULL, errorMessage, "File Not Found", MB_OK | MB_TOPMOST); //delete[] errorMessage; std::exit(0); } else { fseek (shaderFile, 0, SEEK_END); sizeOfFile = ftell(shaderFile); shaderText = new GLchar[sizeOfFile+1]; rewind(shaderFile); fread(shaderText, sizeof(char), sizeOfFile, shaderFile); shaderText[sizeOfFile] = 0; fclose (shaderFile); } shaderID = glCreateShader( GL_VERTEX_SHADER ); glShaderSource( shaderID, 1, &shaderText, NULL ); glCompileShader( shaderID ); glGetShaderiv( shaderID, GL_COMPILE_STATUS, &wasSuccessful ); delete[] shaderText; if ( wasSuccessful != GL_TRUE ) { int errorCounter = 0; GLint infoLogLength; glGetShaderiv( shaderID, GL_INFO_LOG_LENGTH, &infoLogLength ); char* infoLogText = new char[ infoLogLength + 1 ]; glGetShaderInfoLog( shaderID, infoLogLength, NULL, infoLogText ); int filePathLength = strlen(Filename); for (int index = 0; index < infoLogLength+1; index++) { if (infoLogText[index] == '\n') { errorCounter++; } } char* replaceText = new char[strlen(Filename)+2]; strcpy(replaceText, Filename); strcat(replaceText, "("); std::string infoLogString( infoLogText ); for (int index = 0; index < errorCounter; index++) { infoLogString.replace(infoLogString.find("0("), 2, replaceText); } char* appendedLogText = new char[filePathLength * 2 + (infoLogLength)]; strcpy(appendedLogText, infoLogString.c_str()); OutputDebugStringA(appendedLogText); int test = MessageBoxA(NULL, appendedLogText, "ERROR", MB_OK | MB_TOPMOST); delete[] replaceText; delete[] appendedLogText; delete[] infoLogText; std::exit(0); } return shaderID; }