Ejemplo n.º 1
0
GLuint ShaderCompiler::CreateProgram(std::vector<GLuint> vShaderList)
{
	for (unsigned int i = 0; i < vShaderList.size(); i++)
	{
		this->vShaderList.push_back(vShaderList[i]);

		if (!this->m_OpenGL->CompileShader(vShaderList[i]))
			return OutputShaderErrorMessage(vShaderList[i]);
	}

	this->m_OpenGL->CreateProgram(this->uiShaderProgram);
	this->m_OpenGL->AttachShaders(this->uiShaderProgram, this->vShaderList);
	
	if (!this->m_OpenGL->LinkProgram(this->uiShaderProgram))
		return OutputLinkerErrorMessage(this->uiShaderProgram);

	return this->uiShaderProgram;
}
Ejemplo n.º 2
0
bool RenderShader::InitializeShader(char* vsFilename, char* fsFilename)
{
	const char* vertexShaderBuffer;
	const char* fragmentShaderBuffer;
	int status;

	// Load the vertex shader source file into a text buffer.
	vertexShaderBuffer = LoadShaderSourceFile(vsFilename);
	if(!vertexShaderBuffer)
	{
		return false;
	}

	// Load the fragment shader source file into a text buffer.
	fragmentShaderBuffer = LoadShaderSourceFile(fsFilename);
	if(!fragmentShaderBuffer)
	{
		return false;
	}

	// Create a vertex and fragment shader object.
	m_vertexShader = g_openGL->glCreateShader(GL_VERTEX_SHADER);
	m_fragmentShader = g_openGL->glCreateShader(GL_FRAGMENT_SHADER);

	// Copy the shader source code strings into the vertex and fragment shader objects.
	g_openGL->glShaderSource(m_vertexShader, 1, &vertexShaderBuffer, NULL);
	g_openGL->glShaderSource(m_fragmentShader, 1, &fragmentShaderBuffer, NULL);

	// Release the vertex and fragment shader buffers.
	delete [] vertexShaderBuffer;
	vertexShaderBuffer = 0;
	
	delete [] fragmentShaderBuffer;
	fragmentShaderBuffer = 0;

	// Compile the shaders.
	g_openGL->glCompileShader(m_vertexShader);
	g_openGL->glCompileShader(m_fragmentShader);

	// Check to see if the vertex shader compiled successfully.
	g_openGL->glGetShaderiv(m_vertexShader, GL_COMPILE_STATUS, &status);
	if(status != 1)
	{
		// If it did not compile then write the syntax error message out to a text file for review.
		OutputShaderErrorMessage(m_vertexShader, vsFilename);
		return false;
	}

	// Check to see if the fragment shader compiled successfully.
	g_openGL->glGetShaderiv(m_fragmentShader, GL_COMPILE_STATUS, &status);
	if(status != 1)
	{
		// If it did not compile then write the syntax error message out to a text file for review.
		OutputShaderErrorMessage(m_fragmentShader, fsFilename);
		return false;
	}

	// Create a shader program object.
	m_shaderProgram = g_openGL->glCreateProgram();

	// Attach the vertex and fragment shader to the program object.
	g_openGL->glAttachShader(m_shaderProgram, m_vertexShader);
	g_openGL->glAttachShader(m_shaderProgram, m_fragmentShader);

	// Bind the shader input variables.
	g_openGL->glBindAttribLocation(m_shaderProgram, 0, "inputPosition");
	g_openGL->glBindAttribLocation(m_shaderProgram, 1, "inputNormal");
	g_openGL->glBindAttribLocation(m_shaderProgram, 2, "inputColor");
	g_openGL->glBindAttribLocation(m_shaderProgram, 3, "inputUV");

	// Link the shader program.
	g_openGL->glLinkProgram(m_shaderProgram);

	// Check the status of the link.
	g_openGL->glGetProgramiv(m_shaderProgram, GL_LINK_STATUS, &status);
	if(status != 1)
	{
		// If it did not link then write the syntax error message out to a text file for review.
		OutputLinkerErrorMessage(m_shaderProgram);
		return false;
	}

	return true;
}
Ejemplo n.º 3
0
bool Shader::InitializeShader(string shaderVSFileName, string shaderPSFileName)
{
	const char* shaderBuffer_VS = LoadShaderSourceFile("Shaders/" + shaderVSFileName);
	const char* shaderBuffer_PS = LoadShaderSourceFile("Shaders/" + shaderPSFileName);

	if (!shaderBuffer_VS)
	{
		cout << "Shader: " << shaderVSFileName << " could not be loaded" << endl;
		return false;
	}

	if (!shaderBuffer_PS)
	{
		cout << "Shader: " << shaderVSFileName << " could not be loaded" << endl;
		return false;
	}

	m_vertexID = glCreateShader(GL_VERTEX_SHADER);
	m_fragID = glCreateShader(GL_FRAGMENT_SHADER);

	glShaderSource(m_vertexID, 1, &shaderBuffer_VS, NULL);
	glShaderSource(m_fragID, 1, &shaderBuffer_PS, NULL);

	delete[] shaderBuffer_VS;
	delete[] shaderBuffer_PS;

	glCompileShader(m_vertexID);
	glCompileShader(m_fragID);
	
	int status;

	glGetShaderiv(m_vertexID, GL_COMPILE_STATUS, &status);

	if (status != 1)
	{
		OutputShaderErrorMessage(m_vertexID, (char*)shaderVSFileName.c_str());
		return false;
	}

	glGetShaderiv(m_fragID, GL_COMPILE_STATUS, &status);

	if (status != 1)
	{
		OutputShaderErrorMessage(m_fragID, (char*)shaderPSFileName.c_str());
		return false;
	}

	m_programID = glCreateProgram();//set the Program ID to the first element by default

	glAttachShader(m_programID, m_vertexID);
	glAttachShader(m_programID, m_fragID);

	glLinkProgram(m_programID);
	glGetProgramiv(m_programID, GL_LINK_STATUS, &status);

	if(status != 1)
	{
		// If it did not link then write the syntax error message out to a text file for review.
		OutputLinkerErrorMessage(m_programID);

		DeleteProgram();

		return false;
	}

	return true;
}