コード例 #1
0
	void MaterialAsset::__loadShaderToGFXCard( void )
	{
		if ( !__isShaderLoaded )
		{
			GLuint VertexShaderID = glCreateShader( GL_VERTEX_SHADER );
			GLuint FragmentShaderID = glCreateShader( GL_FRAGMENT_SHADER );

			Resources* r = DWIngine::singleton()->resources();

			string fragSource = r->getFragmentShader( __fragmentShaderUniqueName )->sourceCode( );

			string vertexSource = r->getVertexShader( __vertexShaderUniqueName )->sourceCode();

			int Result = GL_FALSE;
			int InfoLogLength;

			char const* VertexSourcePointer = vertexSource.c_str();

			//Compile the Vertex Shader
			glShaderSource( VertexShaderID, 1, &VertexSourcePointer, NULL );
			glCompileShader( VertexShaderID );

			glGetShaderiv( VertexShaderID, GL_COMPILE_STATUS, &Result );
			glGetShaderiv( VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength );

			if ( InfoLogLength > 0 )
			{
				std::vector<char> VertexShaderErrorMessage( InfoLogLength + 1 );
				glGetShaderInfoLog( VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[ 0 ] );
				DWIngine::singleton()->logError( &VertexShaderErrorMessage[0] );
			}

			//Compile the Fragment Shader
			char const * FragmentSourcePointer = fragSource.c_str();
			glShaderSource( FragmentShaderID, 1, &FragmentSourcePointer, NULL );
			glCompileShader( FragmentShaderID );

			glGetShaderiv( FragmentShaderID, GL_COMPILE_STATUS, &Result );
			glGetShaderiv( FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength );

			if ( InfoLogLength > 0 )
			{
				std::vector<char> FragmentShaderErrorMessage( InfoLogLength + 1 );
				glGetShaderInfoLog( FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[ 0 ] );
				DWIngine::singleton( )->logError( &FragmentShaderErrorMessage[ 0 ] );
			}

			GLuint ProgramID = glCreateProgram();
			glAttachShader( ProgramID, VertexShaderID );
			glAttachShader( ProgramID, FragmentShaderID );
			glLinkProgram( ProgramID );

			glGetProgramiv( ProgramID, GL_LINK_STATUS, &Result );
			glGetProgramiv( ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength );
			if ( InfoLogLength > 0 )
			{
				std::vector<char> ProgramErrorMessage( InfoLogLength + 1 );
				glGetProgramInfoLog( ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[ 0 ] );
				DWIngine::singleton()->logError( &ProgramErrorMessage[ 0 ] );
			}

			glDeleteShader( VertexShaderID );
			glDeleteShader( FragmentShaderID );

			__shaderProgramID = ProgramID;

			__shaderMatrixID = glGetUniformLocation( ProgramID, "MVP" );
			__shaderViewID = glGetUniformLocation( ProgramID, "V" );
			__shaderModelID = glGetUniformLocation( ProgramID, "M" );
			__textureShaderID = glGetUniformLocation( ProgramID, "TextureSampler" );
			__shaderLightPos = glGetUniformLocation( ProgramID, "LightPosition_worldspace" );


			__isShaderLoaded = !__isShaderLoaded;
		}
	}