Beispiel #1
0
RendererHUDClassic::RendererHUDClassic( Instance* instance, Font* font )
	: RendererHUD( instance, font )
	, mSmoothRPY( Vector3f() )
	, mShader{ 0 }
	, mColorShader{ 0 }
{
	LoadVertexShader( &mShader, hud_vertices_shader, sizeof(hud_vertices_shader) + 1 );
	LoadFragmentShader( &mShader, hud_fragment_shader, sizeof(hud_fragment_shader) + 1 );
	createPipeline( &mShader );
	glUseProgram( mShader.mShader );
	glEnableVertexAttribArray( mShader.mVertexTexcoordID );
	glEnableVertexAttribArray( mShader.mVertexPositionID );
	glUseProgram( 0 );

	LoadVertexShader( &mColorShader, hud_color_vertices_shader, sizeof(hud_color_vertices_shader) + 1 );
	LoadFragmentShader( &mColorShader, hud_color_fragment_shader, sizeof(hud_color_fragment_shader) + 1 );
	createPipeline( &mColorShader );
	glUseProgram( mColorShader.mShader );
	glEnableVertexAttribArray( mColorShader.mVertexTexcoordID );
	glEnableVertexAttribArray( mColorShader.mVertexColorID );
	glEnableVertexAttribArray( mColorShader.mVertexPositionID );
	glUseProgram( 0 );

	Compute();
}
Beispiel #2
0
int32_t PS3Graphics::InitCg()
{
	cgRTCgcInit();

	_cgContext = cgCreateContext();
	if (_cgContext == NULL)
		return 1;
	if (strlen(_curFragmentShaderPath.c_str()) > 0)
		return LoadFragmentShader(_curFragmentShaderPath.c_str());
	else
	{
		_curFragmentShaderPath = DEFAULT_SHADER_FILE;
		return LoadFragmentShader(_curFragmentShaderPath.c_str());
	}
}
	bool ILine::Load(IDirect3DDevice9 * i_direct3dDevice
#ifdef EAE2014_SHOULDALLRETURNVALUESBECHECKED
		, std::string* o_errorMessage
#endif
		)
	{
		if (!LoadFragmentShader(s_FragmentShaderPath, i_direct3dDevice,
#ifdef EAE2014_SHOULDALLRETURNVALUESBECHECKED
			o_errorMessage
#endif
			))
		{
			return false;
		}

		if (!LoadVertexShader(s_VertexShaderPath, i_direct3dDevice,
#ifdef EAE2014_SHOULDALLRETURNVALUESBECHECKED
			o_errorMessage
#endif
			))
		{
			return false;
		}

		return true;
	}
Beispiel #4
0
ShaderProgram_t *InitProgram (const char *vsName, const char *fsName)
{
    char		buf[1024];
    VertexShader_t	*vsh = 0;
    FragmentShader_t	*fsh = 0;
    ShaderProgram_t	*prog;

    if (vsName != 0) {
      // load the vertex shader
	if ((vsh = LoadVertexShader (vsName)) == 0)
	    exit (1);
    }

    if (fsName != 0) {
      // load the vertex shader
	if ((fsh = LoadFragmentShader (fsName)) == 0)
	    exit (1);
    }

    if ((prog = CreateShaderProgram (vsh, fsh)) == 0)
	exit (1);

    FreeVertexShader (vsh);
    FreeFragmentShader (fsh);

    return prog;
}
/*
================================================================================================
idRenderProgManager::FindFragmentShader
================================================================================================
*/
int idRenderProgManager::FindFragmentShader( const char* name )
{
	for( int i = 0; i < fragmentShaders.Num(); i++ )
	{
		if( fragmentShaders[i].name.Icmp( name ) == 0 )
		{
			LoadFragmentShader( i );
			return i;
		}
	}
	fragmentShader_t shader;
	shader.name = name;
	int index = fragmentShaders.Append( shader );
	LoadFragmentShader( index );
	currentFragmentShader = index;
	return index;
}
Beispiel #6
0
	void Shader::Compile(const std::string &pVSName, const std::string &pFSName, const std::string &pGSName){
		std::string all = String(pVSName)+pFSName+pGSName;

		Shader* tmp = ResourceManager::Call().Get<Shader>(all);
		if(tmp != 0){
			//Shader existe deja, on copie ses identifiants dans celui ci
			mProgram = tmp->mProgram;
		}else{
			//Shader n'existe pas, on le cree

			// Ajout du shader au ResourceManager
			ResourceManager::Call().Add(all, this);

			// Chargement des fichiers shaders
			LoadVertexShader(pVSName);
			LoadFragmentShader(pFSName);
			if(!pGSName.empty())
				LoadGeometryShader(pGSName);

			// Creation du shader mProgram
			mProgram = glCreateProgram();

			// Linkage des deux shaders précédemment créés
			glAttachShader(mProgram, mVShader);
			glAttachShader(mProgram, mFShader);
			if(mGShader)
				glAttachShader(mProgram, mGShader);

			// Linkage du mProgramme a OGL
			glLinkProgram(mProgram);

			GLint error;
			glGetProgramiv(mProgram, GL_LINK_STATUS, &error);
			if(!error){
				char log[1024];
				glGetProgramInfoLog(mProgram, 1024, NULL, log);
				if(mVShader)
					glDeleteShader(mVShader);
				if(mFShader)
					glDeleteShader(mFShader);
				if(mGShader)
					glDeleteShader(mGShader);
				throw Exception(String("Shader Link Error :\n")+log);
			}
		
			// Destruction des Shaders. ils sont maintenant dans le program
			glDeleteShader(mVShader);
			glDeleteShader(mFShader);
			if(mGShader)
				glDeleteShader(mGShader);

			// Attribution des texCoords
			glUseProgram(mProgram);
			glUniform1i(glGetUniformLocation(mProgram, "tex"), 0);
			glBindFragDataLocation(mProgram, 0, "finalColor");
			glUseProgram(0);
		}
	}
//////////////////////////////////////////////////////////////////////
// powi¹zanie shadera fragmentów, reprezentowanego przez kod
// Ÿród³owy, z obiektem programu; w razie potrzeby tworzony
// jest nowy obiekt programu
//////////////////////////////////////////////////////////////////////
void AttachFragmentShader( GLuint &program, const char **src )
{
    // odczyt kodu shadera i jego kompilacja
    GLuint shader = LoadFragmentShader( src );

    // w razie potrzeby tworzymy obiekt programu
    if( !glIsProgram( program ) )
        program = glCreateProgram();

    // do³¹czenie obiektu shadera do obiektu programu
    glAttachShader( program, shader );
}
	bool Sprite::Load(const char* i_TexturePath, const sRectangle &i_texcoords, const sSprite &i_spriteDetails, IDirect3DDevice9* i_direct3dDevice
#ifdef EAE2014_SHOULDALLRETURNVALUESBECHECKED
		, std::string* o_errorMessage
#endif
		)
	{
		assert(i_TexturePath && s_FragmentShaderPath && s_VertexShaderPath && s_SamplerName && i_direct3dDevice);

		//Load the shader from the path
		if (!LoadFragmentShader(s_FragmentShaderPath, m_direct3dDevice
#ifdef EAE2014_SHOULDALLRETURNVALUESBECHECKED
			, o_errorMessage
#endif		
			))
		{
			return false;
		}

		//Load the shader from the path
		if (!LoadVertexShader(s_VertexShaderPath, m_direct3dDevice
#ifdef EAE2014_SHOULDALLRETURNVALUESBECHECKED
			, o_errorMessage
#endif		
			))
		{
			return false;
		}

		if (!LoadTextureAndSamplerRegister(i_TexturePath, s_SamplerName, m_direct3dDevice
#ifdef EAE2014_SHOULDALLRETURNVALUESBECHECKED
			, o_errorMessage
#endif
			))
		{
#ifdef EAE2014_SHOULDALLRETURNVALUESBECHECKED
			
#endif
			return false;
		}

		if (!CreateSpriteDrawInfoandFillVertexBuffer(i_spriteDetails, i_texcoords))
		{
#ifdef EAE2014_SHOULDALLRETURNVALUESBECHECKED

#endif
			return false;
		}

		return true;
	}
Beispiel #9
0
int32_t FceuGraphics::InitCg()
{
	LOG_DBG("FceuGraphics::InitCg()\n");

	cgRTCgcInit();

	LOG_DBG("FceuGraphics::InitCg() - About to create CgContext\n");
	_cgContext = cgCreateContext();
	if (_cgContext == NULL)
	{
		LOG_DBG("Error Creating Cg Context\n");
		return 1;
	}
	if (strlen(_curFragmentShaderPath.c_str()) > 0)
	{
		return LoadFragmentShader(_curFragmentShaderPath.c_str());
	}
	else
	{
		_curFragmentShaderPath = DEFAULT_SHADER_FILE;
		return LoadFragmentShader(_curFragmentShaderPath.c_str());
	}
}
Beispiel #10
0
Cross2d_update()
{
    GLuint programID = LoadFragmentShader( "simple.fs" );

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glUseProgram(programID);

	triangle.createConfigure(0);

	glDrawArrays(GL_TRIANGLES, 0, 3);

    glDisableVertexAttribArray(0);
}
// powi¹zanie shadera wierzcho³ków i shadera fragmentów,
// reprezentowanego przez kod Ÿród³owy, z obiektem programu;
// w razie potrzeby tworzony jest nowy obiekt programu
//////////////////////////////////////////////////////////////////////
void AttachVertexFragmentShader( GLuint &program, const char **vsSrc, const char **fsSrc )
{
    // odczyt kodu shadera wierzcho³ków i jego kompilacja
    GLuint vShader = LoadVertexShader( vsSrc );

    // odczyt kodu shadera fragmentów i jego kompilacja
    GLuint fShader = LoadFragmentShader( fsSrc );

    // w razie potrzeby tworzymy obiekt programu
    if( !glIsProgram( program ) )
        program = glCreateProgram();

    // do³¹czenie obiektów shaderów do obiektu programu
    glAttachShader( program, vShader );
    glAttachShader( program, fShader );
}
//////////////////////////////////////////////////////////////////////
// powi¹zanie shadera wierzcho³ków, shadera geometrii i shadera
// fragmentów, reprezentowanego przez kod Ÿród³owy w plikach, z obiektem
// programu; w razie potrzeby tworzony jest nowy obiekt programu
//////////////////////////////////////////////////////////////////////
void AttachVertexGeometryFragmentShader( GLuint &program, const char *vsName, const char *gsName, const char *fsName )
{
    // odczyt kodu shadera wierzcho³ków z pliku i jego kompilacja
    GLuint vShader = LoadVertexShader( vsName );

    // odczyt kodu shadera geometrii z pliku i jego kompilacja
    GLuint gShader = LoadGeometryShader( gsName );

    // odczyt kodu shadera fragmentów z pliku i jego kompilacja
    GLuint fShader = LoadFragmentShader( fsName );

    // w razie potrzeby tworzymy obiekt programu
    if( !glIsProgram( program ) )
        program = glCreateProgram();

    // do³¹czenie obiektów shaderów do obiektu programu
    glAttachShader( program, vShader );
    glAttachShader( program, gShader );
    glAttachShader( program, fShader );
}
/*
================================================================================================
idRenderProgManager::LoadAllShaders()
================================================================================================
*/
void idRenderProgManager::LoadAllShaders()
{
	for( int i = 0; i < vertexShaders.Num(); i++ )
	{
		LoadVertexShader( i );
	}
	for( int i = 0; i < fragmentShaders.Num(); i++ )
	{
		LoadFragmentShader( i );
	}
	
	for( int i = 0; i < glslPrograms.Num(); ++i )
	{
		if( glslPrograms[i].vertexShaderIndex == -1 || glslPrograms[i].fragmentShaderIndex == -1 )
		{
			// RB: skip reloading because we didn't load it initially
			continue;
		}
		
		LoadGLSLProgram( i, glslPrograms[i].vertexShaderIndex, glslPrograms[i].fragmentShaderIndex );
	}
}
Beispiel #14
0
 void CShader::Create()
 {
     DEBUG(3, __FUNCTION__, "Compiling");
     Compile(LoadVertexShader(), LoadFragmentShader());
 }
void
GLSLProgram::Create( char *vfile, char *gfile, char *ffile )
{
	CanDoFragmentShader = IsExtensionSupported( "GL_ARB_fragment_shader" );
	CanDoGeometryShader = IsExtensionSupported( "GL_EXT_geometry_shader4" );
	CanDoVertexShader   = IsExtensionSupported( "GL_ARB_vertex_shader" );

	InputTopology  = GL_TRIANGLES;
	OutputTopology = GL_TRIANGLE_STRIP;

	Vshader = Gshader = Fshader = 0;
	Program = 0;
	AttributeLocs.clear();
	UniformLocs.clear();
	Verbose = false;

	this->Program = glCreateProgram();
	CheckGlErrors( "glCreateProgram" );

	if( vfile != NULL  &&  vfile[0] != '\0' )
	{
		if( ! CanDoVertexShader )
		{
			fprintf( stderr, "Warning: this system cannot handle vertex shaders\n" );
		}
		this->Vshader = LoadVertexShader( vfile );
		int status = CompileShader( this->Vshader );
		if( status != 0 )
		{
			if( this->Verbose )
				fprintf( stderr, "Shader '%s' compiled.\n", vfile );
			AttachShader( this->Vshader );
		}
		else
		{
			fprintf( stderr, "Shader '%s' did not compile.\n", vfile );
		}
	}

	if( gfile != NULL  &&  gfile[0] != '\0' )
	{
		if( ! CanDoGeometryShader )
		{
			fprintf( stderr, "Warning: this system cannot handle geometry shaders\n" );
		}
		this->Gshader = LoadGeometryShader( gfile );
		int status = CompileShader( this->Gshader );
		if( status != 0 )
		{
			if( this->Verbose )
				fprintf( stderr, "Shader '%s' compiled.\n", gfile );
			AttachShader( Gshader );
		}
		else
		{
			fprintf( stderr, "Shader '%s' did not compile.\n", gfile );
		}
	}

	if( ffile != NULL  &&  ffile[0] != '\0' )
	{
		if( ! CanDoFragmentShader )
		{
			fprintf( stderr, "Warning: this system cannot handle fragment shaders\n" );
		}
		this->Fshader = LoadFragmentShader( ffile );
		int status = CompileShader( this->Fshader );
		if( status != 0 )
		{
			if( this->Verbose )
				fprintf( stderr, "Shader '%s' compiled.\n", ffile );
			AttachShader( Fshader );
		}
		else
		{
			fprintf( stderr, "Shader '%s' did not compile.\n", ffile );
		}
	}

	LinkProgram();
};
Beispiel #16
0
	bool ShaderManager :: LoadFragmentShader ( const char * filename, const char * prefix )
	{
		return LoadFragmentShader ( &filename, 1, prefix );
	}
/*
================================================================================================
idRenderProgManager::Init()
================================================================================================
*/
void idRenderProgManager::Init()
{
	common->Printf( "----- Initializing Render Shaders -----\n" );
	
	
	for( int i = 0; i < MAX_BUILTINS; i++ )
	{
		builtinShaders[i] = -1;
	}
	
	// RB: added checks for GPU skinning
	struct builtinShaders_t
	{
		int			index;
		const char* name;
		const char* nameOutSuffix;
		uint32		shaderFeatures;
		bool		requireGPUSkinningSupport;
	} builtins[] =
	{
		{ BUILTIN_GUI, "gui.vfp", 0, false },
		{ BUILTIN_COLOR, "color.vfp", 0, false },
		// RB begin
		{ BUILTIN_COLOR_SKINNED, "color", "_skinned", BIT( USE_GPU_SKINNING ), true },
		{ BUILTIN_VERTEX_COLOR, "vertex_color.vfp", "", 0, false },
		// RB end
//		{ BUILTIN_SIMPLESHADE, "simpleshade.vfp", 0, false },
		{ BUILTIN_TEXTURED, "texture.vfp", 0, false },
		{ BUILTIN_TEXTURE_VERTEXCOLOR, "texture_color.vfp", 0, false },
		{ BUILTIN_TEXTURE_VERTEXCOLOR_SKINNED, "texture_color_skinned.vfp", 0, true },
		{ BUILTIN_TEXTURE_TEXGEN_VERTEXCOLOR, "texture_color_texgen.vfp", 0, false },
		// RB begin
		{ BUILTIN_INTERACTION, "interaction.vfp", "", 0, false },
		{ BUILTIN_INTERACTION_SKINNED, "interaction", "_skinned", BIT( USE_GPU_SKINNING ), true },
		{ BUILTIN_INTERACTION_AMBIENT, "interactionAmbient.vfp", 0, false },
		{ BUILTIN_INTERACTION_AMBIENT_SKINNED, "interactionAmbient_skinned.vfp", 0, true },
		{ BUILTIN_INTERACTION_SHADOW_MAPPING_SPOT, "interactionSM", "_spot", 0, false },
		{ BUILTIN_INTERACTION_SHADOW_MAPPING_SPOT_SKINNED, "interactionSM", "_spot_skinned", BIT( USE_GPU_SKINNING ), true },
		{ BUILTIN_INTERACTION_SHADOW_MAPPING_POINT, "interactionSM", "_point", BIT( LIGHT_POINT ), false },
		{ BUILTIN_INTERACTION_SHADOW_MAPPING_POINT_SKINNED, "interactionSM", "_point_skinned", BIT( USE_GPU_SKINNING ) | BIT( LIGHT_POINT ), true },
		{ BUILTIN_INTERACTION_SHADOW_MAPPING_PARALLEL, "interactionSM", "_parallel", BIT( LIGHT_PARALLEL ), false },
		{ BUILTIN_INTERACTION_SHADOW_MAPPING_PARALLEL_SKINNED, "interactionSM", "_parallel_skinned", BIT( USE_GPU_SKINNING ) | BIT( LIGHT_PARALLEL ), true },
		// RB end
		{ BUILTIN_ENVIRONMENT, "environment.vfp", 0, false },
		{ BUILTIN_ENVIRONMENT_SKINNED, "environment_skinned.vfp", 0, true },
		{ BUILTIN_BUMPY_ENVIRONMENT, "bumpyenvironment.vfp", 0, false },
		{ BUILTIN_BUMPY_ENVIRONMENT_SKINNED, "bumpyenvironment_skinned.vfp", 0, true },
		
		{ BUILTIN_DEPTH, "depth.vfp", 0, false },
		{ BUILTIN_DEPTH_SKINNED, "depth_skinned.vfp", 0, true },
		
		{ BUILTIN_SHADOW, "shadow.vfp", 0, false },
		{ BUILTIN_SHADOW_SKINNED, "shadow_skinned.vfp", 0, true },
		
		{ BUILTIN_SHADOW_DEBUG, "shadowDebug.vfp", 0, false },
		{ BUILTIN_SHADOW_DEBUG_SKINNED, "shadowDebug_skinned.vfp", 0, true },
		
		{ BUILTIN_BLENDLIGHT, "blendlight.vfp", 0, false },
		{ BUILTIN_FOG, "fog.vfp", 0, false },
		{ BUILTIN_FOG_SKINNED, "fog_skinned.vfp", 0, true },
		{ BUILTIN_SKYBOX, "skybox.vfp", 0, false },
		{ BUILTIN_WOBBLESKY, "wobblesky.vfp", 0, false },
		{ BUILTIN_POSTPROCESS, "postprocess.vfp", 0, false },
		{ BUILTIN_STEREO_DEGHOST, "stereoDeGhost.vfp", 0, false },
		{ BUILTIN_STEREO_WARP, "stereoWarp.vfp", 0, false },
//		{ BUILTIN_ZCULL_RECONSTRUCT, "zcullReconstruct.vfp", 0, false },
		{ BUILTIN_BINK, "bink.vfp", 0, false },
		{ BUILTIN_BINK_GUI, "bink_gui.vfp", 0, false },
		{ BUILTIN_STEREO_INTERLACE, "stereoInterlace.vfp", 0, false },
		{ BUILTIN_MOTION_BLUR, "motionBlur.vfp", 0, false },
		
		// RB begin
		{ BUILTIN_DEBUG_SHADOWMAP, "debug_shadowmap.vfp", "", 0, false },
		// RB end
	};
	int numBuiltins = sizeof( builtins ) / sizeof( builtins[0] );
	vertexShaders.SetNum( numBuiltins );
	fragmentShaders.SetNum( numBuiltins );
	glslPrograms.SetNum( numBuiltins );
	
	for( int i = 0; i < numBuiltins; i++ )
	{
		vertexShaders[i].name = builtins[i].name;
		vertexShaders[i].nameOutSuffix = builtins[i].nameOutSuffix;
		vertexShaders[i].shaderFeatures = builtins[i].shaderFeatures;
		vertexShaders[i].builtin = true;
		
		fragmentShaders[i].name = builtins[i].name;
		fragmentShaders[i].nameOutSuffix = builtins[i].nameOutSuffix;
		fragmentShaders[i].shaderFeatures = builtins[i].shaderFeatures;
		fragmentShaders[i].builtin = true;
		
		builtinShaders[builtins[i].index] = i;
		
		if( builtins[i].requireGPUSkinningSupport && !glConfig.gpuSkinningAvailable )
		{
			// RB: don't try to load shaders that would break the GLSL compiler in the OpenGL driver
			continue;
		}
		
		LoadVertexShader( i );
		LoadFragmentShader( i );
		LoadGLSLProgram( i, i, i );
	}
	
	// special case handling for fastZ shaders
	/*
	switch( glConfig.driverType )
	{
		case GLDRV_OPENGL32_CORE_PROFILE:
		case GLDRV_OPENGL_ES2:
		case GLDRV_OPENGL_ES3:
		case GLDRV_OPENGL_MESA:
		{
			builtinShaders[BUILTIN_SHADOW] = FindVertexShader( "shadow.vp" );
			int shadowFragmentShaderIndex = FindFragmentShader( "shadow.fp" );
			FindGLSLProgram( "shadow.vp", builtinShaders[BUILTIN_SHADOW], shadowFragmentShaderIndex );
	
			if( glConfig.gpuSkinningAvailable )
			{
				builtinShaders[BUILTIN_SHADOW_SKINNED] = FindVertexShader( "shadow_skinned.vp" );
				int shadowFragmentShaderIndex = FindFragmentShader( "shadow_skinned.fp" );
				FindGLSLProgram( "shadow_skinned.vp", builtinShaders[BUILTIN_SHADOW_SKINNED], shadowFragmentShaderIndex );
				break;
			}
		}
	
		default:
		{
			// fast path on PC
			builtinShaders[BUILTIN_SHADOW] = FindVertexShader( "shadow.vp" );
			FindGLSLProgram( "shadow.vp", builtinShaders[BUILTIN_SHADOW], -1 );
	
			if( glConfig.gpuSkinningAvailable )
			{
				builtinShaders[BUILTIN_SHADOW_SKINNED] = FindVertexShader( "shadow_skinned.vp" );
				FindGLSLProgram( "shadow_skinned.vp", builtinShaders[BUILTIN_SHADOW_SKINNED], -1 );
			}
		}
	}
	*/
	
	glslUniforms.SetNum( RENDERPARM_USER + MAX_GLSL_USER_PARMS, vec4_zero );
	
	if( glConfig.gpuSkinningAvailable )
	{
		vertexShaders[builtinShaders[BUILTIN_TEXTURE_VERTEXCOLOR_SKINNED]].usesJoints = true;
		vertexShaders[builtinShaders[BUILTIN_INTERACTION_SKINNED]].usesJoints = true;
		vertexShaders[builtinShaders[BUILTIN_INTERACTION_AMBIENT_SKINNED]].usesJoints = true;
		vertexShaders[builtinShaders[BUILTIN_ENVIRONMENT_SKINNED]].usesJoints = true;
		vertexShaders[builtinShaders[BUILTIN_BUMPY_ENVIRONMENT_SKINNED]].usesJoints = true;
		vertexShaders[builtinShaders[BUILTIN_DEPTH_SKINNED]].usesJoints = true;
		vertexShaders[builtinShaders[BUILTIN_SHADOW_SKINNED]].usesJoints = true;
		vertexShaders[builtinShaders[BUILTIN_SHADOW_DEBUG_SKINNED]].usesJoints = true;
		vertexShaders[builtinShaders[BUILTIN_FOG_SKINNED]].usesJoints = true;
		// RB begin
		vertexShaders[builtinShaders[BUILTIN_INTERACTION_SHADOW_MAPPING_SPOT_SKINNED]].usesJoints = true;
		vertexShaders[builtinShaders[BUILTIN_INTERACTION_SHADOW_MAPPING_POINT_SKINNED]].usesJoints = true;
		vertexShaders[builtinShaders[BUILTIN_INTERACTION_SHADOW_MAPPING_PARALLEL_SKINNED]].usesJoints = true;
		// RB end
	}
	
	cmdSystem->AddCommand( "reloadShaders", R_ReloadShaders, CMD_FL_RENDERER, "reloads shaders" );
}
Beispiel #18
0
int VulkanRenderer::LoadFragmentShader( const std::string& file )
{
	size_t size = 0;
	void* data = loadShader( file, &size );
	return LoadFragmentShader( data, size );
}