GLuint ShaderPrograms::CreateShaderEffect (const char* name)
{
	GLint state;
	GLuint program;
	GLuint pixelShader; 
	GLuint vertexShader; 
	
	
	const char *vPtr;
	char tmpName[128];
	char buffer[1024 * 64];

	vPtr = buffer;
	program = glCreateProgram();

	sprintf (tmpName, "shaders/%s.vs", name);
	LoadShaderCode (tmpName, buffer);
	vertexShader = glCreateShader(GL_VERTEX_SHADER);
	glShaderSource(vertexShader, 1, &vPtr, NULL);
	glCompileShader(vertexShader);
	glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &state); 
	if (state != GL_TRUE ) {
		GLsizei length;  
		glGetShaderInfoLog(vertexShader, sizeof (buffer), &length, buffer);
	}
	glAttachShader(program, vertexShader);


	sprintf (tmpName, "shaders/%s.ps", name);
	LoadShaderCode (tmpName, buffer);
	pixelShader = glCreateShader(GL_FRAGMENT_SHADER);
	glShaderSource(pixelShader, 1, &vPtr, NULL);
	glCompileShader(pixelShader);
	glGetShaderiv(pixelShader, GL_COMPILE_STATUS, &state); 
	if (state != GL_TRUE ) {
		GLsizei length;  
		glGetShaderInfoLog(pixelShader, sizeof (buffer), &length, buffer);
	}
	glAttachShader(program, pixelShader);

	glLinkProgram(program);
	glGetProgramiv(program, GL_LINK_STATUS, &state);   
	_ASSERTE (state == GL_TRUE);
	return program;

}
示例#2
0
VkPPShader::VkPPShader(PPShader *shader)
{
	auto fb = GetVulkanFrameBuffer();

	FString prolog;
	if (!shader->Uniforms.empty())
		prolog = UniformBlockDecl::Create("Uniforms", shader->Uniforms, -1);
	prolog += shader->Defines;

	ShaderBuilder vertbuilder;
	vertbuilder.setVertexShader(LoadShaderCode(shader->VertexShader, "", shader->Version));
	VertexShader = vertbuilder.create(shader->VertexShader.GetChars(), fb->device);
	VertexShader->SetDebugName(shader->VertexShader.GetChars());

	ShaderBuilder fragbuilder;
	fragbuilder.setFragmentShader(LoadShaderCode(shader->FragmentShader, prolog, shader->Version));
	FragmentShader = fragbuilder.create(shader->FragmentShader.GetChars(), fb->device);
	FragmentShader->SetDebugName(shader->FragmentShader.GetChars());
}