示例#1
0
//---------------------------------------------------------------------------
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;
}