예제 #1
0
파일: shader.cpp 프로젝트: smasty/ppgso
Shader::Shader(const std::string &vertex_shader_code, const std::string &fragment_shader_code) {
  // Create shaders
  auto vertex_shader_id = glCreateShader(GL_VERTEX_SHADER);
  auto fragment_shader_id = glCreateShader(GL_FRAGMENT_SHADER);
  auto result = GL_FALSE;
  auto info_length = 0;

  // Compile vertex shader
  auto vertex_shader_code_ptr = vertex_shader_code.c_str();
  glShaderSource(vertex_shader_id, 1, &vertex_shader_code_ptr, NULL);
  glCompileShader(vertex_shader_id);

  // Check vertex shader log
  glGetShaderiv(vertex_shader_id, GL_COMPILE_STATUS, &result);
  if (result == GL_FALSE) {
    glGetShaderiv(vertex_shader_id, GL_INFO_LOG_LENGTH, &info_length);
    std::string vertex_shader_log((unsigned int) info_length, ' ');
    glGetShaderInfoLog(vertex_shader_id, info_length, NULL,
                       &vertex_shader_log[0]);
    std::cout << "Error Compiling Vertex Shader ..." << std::endl;
    std::cout << vertex_shader_log << std::endl;
  }

  // Compile fragment shader
  auto fragment_shader_code_ptr = fragment_shader_code.c_str();
  glShaderSource(fragment_shader_id, 1, &fragment_shader_code_ptr, NULL);
  glCompileShader(fragment_shader_id);

  // Check fragment shader log
  glGetShaderiv(fragment_shader_id, GL_COMPILE_STATUS, &result);
  if (result == GL_FALSE) {
    glGetShaderiv(fragment_shader_id, GL_INFO_LOG_LENGTH, &info_length);
    std::string fragment_shader_log((unsigned long) info_length, ' ');
    glGetShaderInfoLog(fragment_shader_id, info_length, NULL,
                       &fragment_shader_log[0]);
    std::cout << "Error Compiling Fragment Shader ..." << std::endl;
    std::cout << fragment_shader_log << std::endl;
  }

  // Create and link the program
  auto program_id = glCreateProgram();
  glAttachShader(program_id, vertex_shader_id);
  glAttachShader(program_id, fragment_shader_id);
  glBindFragDataLocation(program_id, 0, "FragmentColor");
  glLinkProgram(program_id);

  // Check program log
  glGetProgramiv(program_id, GL_LINK_STATUS, &result);
  if (result == GL_FALSE) {
    glGetProgramiv(program_id, GL_INFO_LOG_LENGTH, &info_length);
    std::string program_log((unsigned long) info_length, ' ');
    glGetProgramInfoLog(program_id, info_length, NULL, &program_log[0]);
    std::cout << "Error Linking Shader Program ..." << std::endl;
    std::cout << program_log << std::endl;
  }
  glDeleteShader(vertex_shader_id);
  glDeleteShader(fragment_shader_id);

  program = program_id;
}
예제 #2
0
파일: Render.cpp 프로젝트: edunad/TomatoLib
	void __shaderStuff(Shader& s) {
		s.Link();
		s.Use();

		glBindFragDataLocation(s.ProgramHandle, 0, "outColor");
		glUniform1i(glGetUniformLocation(s.ProgramHandle, "tex"), 0);

		GLint posAttrib = glGetAttribLocation(s.ProgramHandle, "position");
		glEnableVertexAttribArray(posAttrib);
		checkGL;
		glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 9, 0);
		checkGL;

		GLint tposAttrib = glGetAttribLocation(s.ProgramHandle, "texpos");
		checkGL;
		glEnableVertexAttribArray(tposAttrib);
		checkGL;
		glVertexAttribPointer(tposAttrib, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 9, (void*)(sizeof(float) * 3));
		checkGL;

		GLint colAttrib = glGetAttribLocation(s.ProgramHandle, "color");
		checkGL;
		glEnableVertexAttribArray(colAttrib);
		checkGL;
		glVertexAttribPointer(colAttrib, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 9, (void*)(sizeof(float) * 5));
	}
예제 #3
0
/**
 * Vraci program (zkompilovane shadery) pro renderovani uzivatelskeho pohledu
 */
GLuint Shaders::getUserViewProgram() {
	const char *p_s_vertex_shader =
		"#version 330\n"		
		"in vec3 v_pos;\n" // atributy - vstup z dat vrcholu
		"in vec3 v_col;\n" // barva vrcholu
		"\n"
		"uniform mat4 t_modelview_projection_matrix;\n" // parametr shaderu - transformacni matice
		"\n"
		"out vec3 v_color;\n"		
		"\n"
		"void main()\n"
		"{\n"
		"    gl_Position = t_modelview_projection_matrix * vec4(v_pos, 1.0);\n" // musime zapsat pozici
		"    v_color = v_col;\n"
		"}\n";


	const char *p_s_fragment_shader =
		"#version 330\n"
		"in vec3 v_color;\n" // vstupy z vertex shaderu
		"\n"
		"out vec4 frag_color;\n" // vystup do framebufferu
		"\n"
		"void main()\n"
		"{\n"
		"    frag_color = vec4(v_color, 1.0f);\n"
		"}\n";


	// zkompiluje vertex / fragment shader, pripoji je k programu
	n_user_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
	glShaderSource(n_user_vertex_shader, 1, &p_s_vertex_shader, NULL);
	glCompileShader(n_user_vertex_shader);
	if(!CheckShader(n_user_vertex_shader, "vertex shader"))
		return false;

	n_user_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
	glShaderSource(n_user_fragment_shader, 1, &p_s_fragment_shader, NULL);
	glCompileShader(n_user_fragment_shader);
	if(!CheckShader(n_user_fragment_shader, "fragment shader"))
		return false;
	
	n_user_program_object = glCreateProgram();
	glAttachShader(n_user_program_object, n_user_vertex_shader);
	glAttachShader(n_user_program_object, n_user_fragment_shader);
	
	// nabinduje atributy (propojeni mezi obsahem VBO a vstupem do vertex shaderu)
	glBindAttribLocation(n_user_program_object, 0, "v_pos");
	glBindAttribLocation(n_user_program_object, 1, "v_col");
	
	// nabinduje vystupni promenou (propojeni mezi framebufferem a vystupem fragment shaderu)
	glBindFragDataLocation(n_user_program_object, 0, "frag_color");
	
	// slinkuje program
	glLinkProgram(n_user_program_object);
	if(!CheckProgram(n_user_program_object, "program"))
		return false;
	else
		return n_user_program_object;
}
예제 #4
0
/*
 * Erstellt ein Shaderprogramm aus den angegebenen Shaderdateien.
 * Liefert den Index, an dessen Postion das Progemm und die einzelnen Shader in den Vektoren gespeichert werden.
 */
int OpenGLRenderer::createProgram(QString vertexPath, QString pixelPath) {
    // Shader laden
    GLuint vertex_ID = glCreateShader(GL_VERTEX_SHADER);
    GLuint pixel_ID = glCreateShader(GL_FRAGMENT_SHADER);
    //const char* vs = readFile(vertexPath).c_str();    // geht nicht in einem Schritt... stürzt ab?!
    //const char* fs = readFile(pixelPath).c_str();
    std::string vsString = readFile(vertexPath);
    std::string fsString = readFile(pixelPath);
    const char* vs = vsString.c_str();
    const char* fs = fsString.c_str();
    glShaderSource(vertex_ID, 1, &vs, 0);
    glShaderSource(pixel_ID, 1, &fs, 0);

    // Shader kompilieren
    glCompileShader(vertex_ID);
    printShaderInfoLog(vertex_ID);
    glCompileShader(pixel_ID);
    printShaderInfoLog(pixel_ID);

    // Programm aus Shadern erstellen
    GLuint program_ID = glCreateProgram();
    glAttachShader(program_ID, vertex_ID);  // erst Vertexshader
    glAttachShader(program_ID, pixel_ID);   // danach Pixelshader
    glBindFragDataLocation(program_ID, 0, "fragColor"); // fragColor enthält am Ende die Farbe des Pixels ist (Ausgabe des Pixelshaders)
    glLinkProgram(program_ID);
    printProgramInfoLog(program_ID);

    checkForErrors();

    vShader_IDs.append(vertex_ID);
    pShader_IDs.append(pixel_ID);
    program_IDs.append(program_ID);
    return vShader_IDs.size() - 1;
}
	bool initProgram()
	{
		bool Validated = true;
	
		if(Validated)
		{
			compiler Compiler;
			GLuint VertShaderName = Compiler.create(GL_VERTEX_SHADER, getDataDirectory() + VERT_SHADER_SOURCE, "--version 150 --profile core");
			GLuint FragShaderName = Compiler.create(GL_FRAGMENT_SHADER, getDataDirectory() + FRAG_SHADER_SOURCE, "--version 150 --profile core");
			Validated = Validated && Compiler.check();

			ProgramName = glCreateProgram();
			glAttachShader(ProgramName, VertShaderName);
			glAttachShader(ProgramName, FragShaderName);

			glBindAttribLocation(ProgramName, semantic::attr::POSITION, "Position");
			glBindAttribLocation(ProgramName, semantic::attr::TEXCOORD, "Texcoord");
			glBindFragDataLocation(ProgramName, semantic::frag::COLOR, "Color");
			glLinkProgram(ProgramName);
			Validated = Validated && Compiler.check_program(ProgramName);
		}

		if(Validated)
		{
			UniformMVP = glGetUniformLocation(ProgramName, "MVP");
			UniformDiffuse = glGetUniformLocation(ProgramName, "Diffuse");
		}

		return Validated && this->checkError("initProgram");
	}
예제 #6
0
	bool initProgram()
	{
		bool Validated(true);
	
		if(Validated)
		{
			compiler Compiler;
			std::vector<GLuint> ShaderName(shader::MAX);
			ShaderName[shader::VERT] = Compiler.create(GL_VERTEX_SHADER, getDataDirectory() + VERT_SHADER_SOURCE, "--version 150 --profile core");
			ShaderName[shader::FRAG] = Compiler.create(GL_FRAGMENT_SHADER, getDataDirectory() + FRAG_SHADER_SOURCE, "--version 150 --profile core");
			Validated = Validated && Compiler.check();

			ProgramName = glCreateProgram();
			glAttachShader(ProgramName, ShaderName[shader::VERT]);
			glAttachShader(ProgramName, ShaderName[shader::FRAG]);

			glBindAttribLocation(ProgramName, semantic::attr::POSITION, "Position");
			glBindAttribLocation(ProgramName, semantic::attr::TEXCOORD, "Texcoord");
			glBindFragDataLocation(ProgramName, semantic::frag::COLOR, "Color");
			glLinkProgram(ProgramName);
			Validated = Validated && Compiler.checkProgram(ProgramName);
		}

		if(Validated)
		{
			UniformTransform = glGetUniformBlockIndex(ProgramName, "transform");
			UniformDiffuse = glGetUniformLocation(ProgramName, "Diffuse");
		}
	
		Validated = Validated && this->checkError("initProgram");
	
		return Validated;
	}
예제 #7
0
/*
 * Category: Shaders
 *
 * Core in:
 * OpenGL    : 3.0 
 */
void rglBindFragDataLocation(GLuint program, GLuint colorNumber,
                                   const char * name)
{
#if !defined(HAVE_OPENGLES2)
   glBindFragDataLocation(program, colorNumber, name);
#endif
}
	bool initProgram()
	{
		bool Validated = true;
	
		if(Validated)
		{
			compiler Compiler;
			GLuint VertShaderName = Compiler.create(GL_VERTEX_SHADER, getDataDirectory() + SAMPLE_VERT_SHADER, "--version 150 --profile core");
			GLuint GeomShaderName = Compiler.create(GL_GEOMETRY_SHADER, getDataDirectory() + SAMPLE_GEOM_SHADER, "--version 150 --profile core");
			GLuint FragShaderName = Compiler.create(GL_FRAGMENT_SHADER, getDataDirectory() + SAMPLE_FRAG_SHADER, "--version 150 --profile core");

			ProgramName = glCreateProgram();
			glAttachShader(ProgramName, VertShaderName);
			glAttachShader(ProgramName, GeomShaderName);
			glAttachShader(ProgramName, FragShaderName);

			glBindAttribLocation(ProgramName, semantic::attr::POSITION, "Position");
			glBindAttribLocation(ProgramName, semantic::attr::COLOR, "Color");
			glBindFragDataLocation(ProgramName, semantic::frag::COLOR, "Color");
			glLinkProgram(ProgramName);

			Validated = Validated && Compiler.check();
			Validated = Validated && Compiler.checkProgram(ProgramName);
		}

		if(Validated)
		{
			glUseProgram(ProgramName);
			glUniformBlockBinding(ProgramName, glGetUniformBlockIndex(ProgramName, "transform"), semantic::uniform::TRANSFORM0);
			glUniformBlockBinding(ProgramName, glGetUniformBlockIndex(ProgramName, "constant"), semantic::uniform::CONSTANT);
			glUseProgram(0);
		}

		return Validated && this->checkError("initProgram");
	}
예제 #9
0
bool initProgram()
{
	bool Validated = true;
	
	if(Validated)
	{
		GLuint VertShaderName = glf::createShader(GL_VERTEX_SHADER, glf::DATA_DIRECTORY + VERT_SHADER_SOURCE);
		GLuint FragShaderName = glf::createShader(GL_FRAGMENT_SHADER, glf::DATA_DIRECTORY + FRAG_SHADER_SOURCE);

		Validated = Validated && glf::checkShader(VertShaderName, VERT_SHADER_SOURCE);
		Validated = Validated && glf::checkShader(FragShaderName, FRAG_SHADER_SOURCE);

		ProgramName = glCreateProgram();
		glAttachShader(ProgramName, VertShaderName);
		glAttachShader(ProgramName, FragShaderName);
		glBindFragDataLocation(ProgramName, glf::semantic::frag::COLOR, "Color");
		glDeleteShader(VertShaderName);
		glDeleteShader(FragShaderName);

		glLinkProgram(ProgramName);
		Validated = Validated && glf::checkProgram(ProgramName);
	}

	if(Validated)
	{
		UniformTextureMatrix = glGetUniformLocation(ProgramName, "Orientation");
		UniformDiffuse = glGetUniformLocation(ProgramName, "Diffuse");
	}

	return Validated && glf::checkError("initProgram");
}
예제 #10
0
	bool initProgram()
	{
		bool Validated = true;
	
		// Create program
		if(Validated)
		{
			compiler Compiler;
			GLuint VertShaderName = Compiler.create(GL_VERTEX_SHADER, getDataDirectory() + VERT_SHADER_SOURCE, "--version 150 --profile core");
			GLuint FragShaderName = Compiler.create(GL_FRAGMENT_SHADER, getDataDirectory() + FRAG_SHADER_SOURCE, "--version 150 --profile core");

			ProgramName = glCreateProgram();
			glAttachShader(ProgramName, VertShaderName);
			glAttachShader(ProgramName, FragShaderName);
			
			glBindAttribLocation(ProgramName, semantic::attr::POSITION, "Position");
			glBindFragDataLocation(ProgramName, semantic::frag::COLOR, "Color");
			glLinkProgram(ProgramName);

			Validated = Validated && Compiler.check();
			Validated = Validated && Compiler.check_program(ProgramName);
		}

		// Get variables locations
		if(Validated)
		{
			UniformTransform = glGetUniformBlockIndex(ProgramName, "transform");
			UniformMaterial = glGetUniformBlockIndex(ProgramName, "material");
		}

		return Validated && this->checkError("initProgram");
	}
예제 #11
0
bool initProgram()
{
	bool Validated = true;
	
	if(Validated)
	{
		GLuint VertexShaderName = glf::createShader(GL_VERTEX_SHADER, glf::DATA_DIRECTORY + VERTEX_SHADER_SOURCE);
		GLuint FragmentShaderName = glf::createShader(GL_FRAGMENT_SHADER, glf::DATA_DIRECTORY + FRAGMENT_SHADER_SOURCE);

		Validated = Validated && glf::checkShader(VertexShaderName, VERTEX_SHADER_SOURCE);
		Validated = Validated && glf::checkShader(FragmentShaderName, FRAGMENT_SHADER_SOURCE);

		ProgramName = glCreateProgram();
		glAttachShader(ProgramName, VertexShaderName);
		glAttachShader(ProgramName, FragmentShaderName);
		glBindAttribLocation(ProgramName, glf::semantic::attr::POSITION, "Position");
		glBindAttribLocation(ProgramName, glf::semantic::attr::TEXCOORD, "Texcoord");
		glBindFragDataLocation(ProgramName, glf::semantic::frag::COLOR, "Color");
		glDeleteShader(VertexShaderName);
		glDeleteShader(FragmentShaderName);

		glLinkProgram(ProgramName);
		Validated = Validated && glf::checkProgram(ProgramName);
	}

	if(Validated)
	{
		UniformTransform = glGetUniformBlockIndex(ProgramName, "transform");
		UniformDiffuse = glGetUniformLocation(ProgramName, "Diffuse");
	}

	return Validated && glf::checkError("initProgram");
}
/**
* @fn	void ScreenRepaint::initFrameBufferObjects();
*
* @brief	Initialises the frame buffer objects. If this is the first time this method is called, then the 
* 			shader programs are read in and the texture and pixel buffer object handles are created and stored.
* 			Otherwise, if this is called as the result of a resize, a new ortho2D matrix is recalculated, and if 
* 			the canvas is larger than previous sizes, the pixel buffer size is re-allocated.
* 
* @todo		Fix bug that causes texture to draw incorrectly at large canvas sizes.
*
* @author	Phil
* @date	3/15/2012
*/
void ScreenRepaint::initFrameBufferObjects(){
	if(!fboInitialized){
		// Create screen post process program
		//screenRenderProg =  gltLoadShaderPairWithAttributes("/shaders/texpassthrough.vs", "/shaders/gaussianGlow.fs", 2, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_TEXTURE0, "texCoord0");
		screenRenderProg =  gltLoadShaderPairWithAttributes(vertexFileName, fragmentFileName, 2, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_TEXTURE0, "texCoord0");
		glBindFragDataLocation(screenRenderProg, 0, "oColor"); // bind the output of the shader to index zero - this is the same as using the default (depricated) gl_FragColor
		glLinkProgram(screenRenderProg); // relink, so that the graphics card knows what it's outputting to.

		screenWidthLoc = glGetUniformLocation(screenRenderProg, "screenWidth");
		screenHeightLoc = glGetUniformLocation(screenRenderProg, "screenHeight");

		// Create screen textures
		glActiveTexture(screenTextureID); // note that we are using GL_TEXTURE1, not the default
		glGenTextures(1, screenTextures);

		// Allocate a pixel buffer to initialize textures and PBOs
		pixelDataSize = CALC_SCREEN_PIXELS;  

		// Setup texture unit
		// Initialize texture data
		
		glBindTexture(GL_TEXTURE_2D, screenTextures[0]);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, screenWidth, screenHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
		

		// Alloc space for copying pixels so we dont call malloc on every draw
		glGenBuffers(1, pixBuffObjs);
		glBindBuffer(GL_PIXEL_PACK_BUFFER, pixBuffObjs[0]);
		glBufferData(GL_PIXEL_PACK_BUFFER, pixelDataSize, NULL, GL_DYNAMIC_COPY);
		glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);

		// Create geometry and a matrix for screen aligned drawing
		gltGenerateOrtho2DMat(screenWidth/2, screenHeight/2, orthoMatrix, screenQuad);

		// Make sure all went well
		gltCheckErrors();
		fboInitialized = true;
	}else{
		// reset screen aligned quad
		gltGenerateOrtho2DMat(screenWidth, screenHeight, orthoMatrix, screenQuad);

		GLuint val = CALC_SCREEN_PIXELS; 

		if(pixelDataSize < val){
			pixelDataSize = val;

			//  Resize PBOs
			glBindBuffer(GL_PIXEL_PACK_BUFFER, pixBuffObjs[0]);
			glBufferData(GL_PIXEL_PACK_BUFFER, pixelDataSize, NULL, GL_DYNAMIC_COPY);
			glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
		}

		gltCheckErrors();
	}
}
예제 #13
0
void Graphics::initGL(){
	glEnable(GL_TEXTURE_2D);
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	// Create Vertex Array Object
	glGenVertexArrays(1, &_vao);
	glBindVertexArray(_vao);
	// Create a Vertex Buffer Object and copy the vertex data to it
	glGenBuffers(1, &_vbo);
	GLfloat vertices[] = {
		//  Position      Color             Texcoords
		-1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, // Top-left
		1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, // Top-right
		1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, // Bottom-right
		-1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f  // Bottom-left
	};
	glBindBuffer(GL_ARRAY_BUFFER, _vbo);
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW);
	glGenBuffers(1, &_ebo);
	GLuint elements[] = {
		0, 1, 2,
		2, 3, 0
	};
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _ebo);
	glBufferData(GL_ELEMENT_ARRAY_BUFFER,
		sizeof(elements), elements, GL_DYNAMIC_DRAW);

	// Create and compile the vertex shader
	_vertexShader = glCreateShader(GL_VERTEX_SHADER);
	glShaderSource(_vertexShader, 1, &cVertexSrc, NULL);
	glCompileShader(_vertexShader);

	// Create and compile the fragment shader
	_fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
	glShaderSource(_fragmentShader, 1, &cFragmentSrc, NULL);
	glCompileShader(_fragmentShader);

	// Link the vertex and fragment shader into a shader program
	_shaderProgram = glCreateProgram();
	glAttachShader(_shaderProgram, _vertexShader);
	glAttachShader(_shaderProgram, _fragmentShader);
	glBindFragDataLocation(_shaderProgram, 0, "outColor");
	glLinkProgram(_shaderProgram);
	glUseProgram(_shaderProgram);

	// Specify the layout of the vertex data
	GLint posAttrib = glGetAttribLocation(_shaderProgram, "position");
	glEnableVertexAttribArray(posAttrib);
	glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), 0);

	GLint colAttrib = glGetAttribLocation(_shaderProgram, "color");
	glEnableVertexAttribArray(colAttrib);
	glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (void*)(3 * sizeof(GLfloat)));

	GLint texAttrib = glGetAttribLocation(_shaderProgram, "texcoord");
	glEnableVertexAttribArray(texAttrib);
	glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (void*)(6 * sizeof(GLfloat)));

}
예제 #14
0
void RenderSystem::bindFragmentDataLocation(
    RenderSystem::ShaderProgramID handle,
    RenderSystem::ShaderVariableLocation location,
    const char* const name
) {
    glBindFragDataLocation(handle, location, name);
    CROSS_GL_ASSERT();
}
예제 #15
0
파일: Shader.cpp 프로젝트: Toby91/DDEngine
//----------------------------------------------------------------------------//
void OpenGL3Shader::bindFragDataLocation(const std::string &name)
{
    if(d_program > 0)
    {
        glBindFragDataLocation(d_program, 0, name.c_str() );
        link();
    }
}
예제 #16
0
파일: Shader.cpp 프로젝트: caiwan/00xengine
	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);
		}
	}
예제 #17
0
GLuint compileShaders(char* pixelShaders, char* vertexShaders){

	string vertexSourceStr = LoadFileToString(vertexShaders);
	string fragmentSourceStr = LoadFileToString(pixelShaders);
	const GLchar* vertexSource = vertexSourceStr.c_str();
	const GLchar* fragmentSource = fragmentSourceStr.c_str();

	GLint Result = GL_FALSE;
	int InfoLogLength;

	printf("Compiling shader : %s\n", vertexShaders);

	GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
	glShaderSource(vertexShader, 1, &vertexSource, NULL);
	glCompileShader(vertexShader);

	// Check Vertex Shader
	glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &Result);
	glGetShaderiv(vertexShader, GL_INFO_LOG_LENGTH, &InfoLogLength);
	std::vector<char> VertexShaderErrorMessage(InfoLogLength);
	glGetShaderInfoLog(vertexShader, InfoLogLength, NULL, &VertexShaderErrorMessage[0]);
	fprintf(stdout, "%s\n", &VertexShaderErrorMessage[0]);

	printf("Compiling shader : %s\n", pixelShaders);
	GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
	glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
	glCompileShader(fragmentShader);

	// Check Fragment Shader
	glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &Result);
	glGetShaderiv(fragmentShader, GL_INFO_LOG_LENGTH, &InfoLogLength);
	std::vector<char> FragmentShaderErrorMessage(InfoLogLength);
	glGetShaderInfoLog(fragmentShader, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]);
	fprintf(stdout, "%s\n", &FragmentShaderErrorMessage[0]);

	printf("Linking program\n");
	GLuint shaderProgram = glCreateProgram();
	glAttachShader(shaderProgram, vertexShader);
	glAttachShader(shaderProgram, fragmentShader);
	glBindFragDataLocation(shaderProgram, 0, "outColor");
	glLinkProgram(shaderProgram);
	glUseProgram(shaderProgram);

	// Check the program
	glGetProgramiv(shaderProgram, GL_LINK_STATUS, &Result);
	glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &InfoLogLength);
	std::vector<char> ProgramErrorMessage(InfoLogLength + 1);
	glGetProgramInfoLog(shaderProgram, InfoLogLength, NULL, &ProgramErrorMessage[0]);
	fprintf(stdout, "%s\n", &ProgramErrorMessage[0]);

	glDeleteShader(vertexShader);
	glDeleteShader(fragmentShader);

	return shaderProgram;

}
예제 #18
0
파일: Shader.cpp 프로젝트: BSkin/MTG
Shader * Shader::loadShader(string name)
{
	Shader * s = new Shader();
	
	for (int i = 0; i < 5; i++) name.pop_back();
	s->name = name;

	string vertPath = name + ".vert";
	string fragPath = name + ".frag";

	//Start with a handle for the shader program...
	GLhandleARB shaderProgramHandle = glCreateProgramObjectARB ();

	//glBindAttribLocation (shaderProgramHandle, 0, "mg_vertex");
	//glBindAttribLocation (shaderProgramHandle, 1, "uv");
	// use glGetAttribLocation  instead

	GLhandleARB vertObject = makeShader(vertPath.c_str(), GL_VERTEX_SHADER);
	GLhandleARB fragObject = makeShader(fragPath.c_str(), GL_FRAGMENT_SHADER);
	glAttachObjectARB(shaderProgramHandle, vertObject);
	glAttachObjectARB(shaderProgramHandle, fragObject);

	glLinkProgramARB (shaderProgramHandle);
	
	//Find out if compilation worked and return the program handle if it did...
	int status; glGetObjectParameterivARB (shaderProgramHandle, GL_OBJECT_LINK_STATUS_ARB, &status);
	if (status != 0) 
	{
		//return shaderProgramHandle; //Everything OK...
		s->shaderProgram = shaderProgramHandle;
		s->vertexShader = vertObject;
		s->fragmentShader = fragObject;

		return s;
	}

	//It didn't, so log error information...
	//::log ("\nFailed to link shader \"%s\"...", name.c_str ());
	int length = 0; 
	glGetObjectParameterivARB (shaderProgramHandle, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length);
	glBindFragDataLocation(shaderProgramHandle, 0, "outColour");

	const long MAXIMUM_LOG_STRING = 1024; char logString [MAXIMUM_LOG_STRING];
	GLsizei messageLength = min (length, MAXIMUM_LOG_STRING);
	if (messageLength > 0) {
		glGetInfoLogARB (shaderProgramHandle, messageLength, 0, logString);
	}

	//and detach what was previously attached and discard the program handle that was obtained...
	glDetachObjectARB(shaderProgramHandle, fragObject);
	glDetachObjectARB(shaderProgramHandle, vertObject);

	glDeleteObjectARB (shaderProgramHandle); //Should also detach the attached handles...

	return NULL;
}
예제 #19
0
    GLuint setupShaders(char * vertexfile, char * fragmentfile, GLuint * program) 
    {

        char *vs = NULL,*fs = NULL,*fs2 = NULL;

        vertexShader = glCreateShader(GL_VERTEX_SHADER);
        fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

        if(vertexShader == 0 || fragmentShader == 0)
            std::cout << " Error with glCreateShader" << std::endl;

        vs = textFileRead(vertexfile);
        fs = textFileRead(fragmentfile);

        if(vs == NULL) 
            std::cout << "vs files null\n" << std::endl;
        if(fs == NULL)
            std::cout << "fs files null\n" << std::endl;

        const char * vv = vs;
        const char * ff = fs;

        glShaderSource(vertexShader, 1, &vv,NULL);
        glShaderSource(fragmentShader, 1, &ff,NULL);


        free(vs);free(fs);

        glCompileShader(vertexShader);
        glCompileShader(fragmentShader);

        printShaderInfoLog(vertexShader);
        printShaderInfoLog(fragmentShader);

        *program = glCreateProgram();
        glAttachShader(*program,vertexShader);
        glAttachShader(*program,fragmentShader);

        glBindFragDataLocation(*program, 0, "output");

        glBindAttribLocation(*program,vertexLoc,"position");
        glBindAttribLocation(*program,normalLoc,"normal");
        glBindAttribLocation(*program,texCoordLoc,"texCoord");

        glLinkProgram(*program);
        glValidateProgram(*program);
        IO::printProgramInfoLog(*program);

        GLuint k = glGetUniformBlockIndex(*program,"Matrices");
        glUniformBlockBinding(*program, k, matricesUniLoc);
        glUniformBlockBinding(*program, glGetUniformBlockIndex(*program,"Material"), materialUniLoc);

        texUnit = glGetUniformLocation(*program,"texUnit");

        return(*program);
    }
 inline void VL_glBindFragDataLocation(GLuint program, GLuint colorNumber, const GLchar *name)
 {
   if (glBindFragDataLocation)
     glBindFragDataLocation(program, colorNumber, name);
   else
   if (glBindFragDataLocationEXT)
     glBindFragDataLocationEXT(program, colorNumber, name);
   else
     VL_UNSUPPORTED_FUNC();
 }
void Program::BindFragDataLocation(GLuint colorNumber, const char* name)
{
    if (compiled_)
    {
        ERROR_WARNING("Program was already compiled.")
        return;
    }

    glBindFragDataLocation(program_, colorNumber, name);
}
예제 #22
0
void Background :: initgl() {
	// The standard gl object stuff.
	vert = createShader(GL_VERTEX_SHADER,   VS_BKGD);
	frag = createShader(GL_FRAGMENT_SHADER, FS_BKGD);

	prog = glCreateProgram();
	glAttachShader(prog, vert);
	glAttachShader(prog, frag);
	glBindFragDataLocation(prog, 0, "out_color");

	glLinkProgram(prog);
	glUseProgram(prog);
	printShaderError(vert, VS_BKGD);
	printShaderError(frag, FS_BKGD);

	//vao, vbo, 
	glGenBuffers(1, &vbo);
	glBindBuffer(GL_ARRAY_BUFFER, vbo);

	// Uploaded to the GPU
	float rectArray [] {
		-1.0f,  1.0f, 0.0f, 0.0f, // TL
		 1.0f,  1.0f, 1.0f, 0.0f, // TR
		 1.0f, -1.0f, 1.0f, 1.0f, // BR

		-1.0f,  1.0f, 0.0f, 0.0f, // TL
		-1.0f, -1.0f, 0.0f, 1.0f, // BL
		 1.0f, -1.0f, 1.0f, 1.0f  // BR
	};

	glBufferData(GL_ARRAY_BUFFER, sizeof(rectArray), rectArray, GL_STATIC_DRAW);

	glGenVertexArrays(1, &vao);
	glBindVertexArray(vao);

	GLuint pos = glGetAttribLocation(prog, "pos");
	GLuint uv  = glGetAttribLocation(prog, "uv");

	glVertexAttribPointer(pos, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 4, nullptr);
	glVertexAttribPointer(uv , 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 4, (void *) (sizeof(GLfloat) * 2));

	glEnableVertexAttribArray(pos);
	glEnableVertexAttribArray(uv);

	glUniform1i(glGetUniformLocation(prog, "BkgdTex"), BSPOT_BKGD);
	// ren_dim / img_dim = num of repeat
	glUniform2f(glGetUniformLocation(prog, "rep_num"),
		RENDER_WIDTH  / (float) ih->getSheetWidth(),
		RENDER_HEIGHT / (float) ih->getSheetHeight());

	// Because the vectors must be horizontal (in arrays), the matrix must be transposed.
	glUniform2f(glGetUniformLocation(prog, "img_dim"), ih->getSheetWidth(), ih->getSheetHeight());

	unbind();
}
예제 #23
0
bool initProgram()
{
	bool Validated(true);
	
	if(Validated)
	{
		glf::compiler Compiler;
		GLuint VertShaderName = Compiler.create(GL_VERTEX_SHADER, glf::DATA_DIRECTORY + VERT_SHADER_SOURCE_RENDER, 
			"--version 400 --profile core");
		GLuint FragShaderName = Compiler.create(GL_FRAGMENT_SHADER, glf::DATA_DIRECTORY + FRAG_SHADER_SOURCE_RENDER,
			"--version 400 --profile core");
		Validated = Validated && Compiler.check();

		ProgramName[program::RENDER] = glCreateProgram();
		glAttachShader(ProgramName[program::RENDER], VertShaderName);
		glAttachShader(ProgramName[program::RENDER], FragShaderName);
		glBindAttribLocation(ProgramName[program::RENDER], glf::semantic::attr::POSITION, "Position");
		glBindAttribLocation(ProgramName[program::RENDER], glf::semantic::attr::COLOR, "Color");
		glBindFragDataLocation(ProgramName[program::RENDER], glf::semantic::frag::COLOR, "Color");
		glLinkProgram(ProgramName[program::RENDER]);
		glDeleteShader(VertShaderName);
		glDeleteShader(FragShaderName);

		Validated = Validated && glf::checkProgram(ProgramName[program::RENDER]);
	}

	if(Validated)
	{
		UniformTransform[program::RENDER] = glGetUniformBlockIndex(ProgramName[program::RENDER], "transform");
		UniformShadow = glGetUniformLocation(ProgramName[program::RENDER], "Shadow");
	}

	if(Validated)
	{
		glf::compiler Compiler;
		GLuint VertShaderName = Compiler.create(GL_VERTEX_SHADER, glf::DATA_DIRECTORY + VERT_SHADER_SOURCE_DEPTH, 
			"--version 400 --profile core");
		Validated = Validated && Compiler.check();

		ProgramName[program::DEPTH] = glCreateProgram();
		glAttachShader(ProgramName[program::DEPTH], VertShaderName);
		glBindAttribLocation(ProgramName[program::DEPTH], glf::semantic::attr::POSITION, "Position");
		glLinkProgram(ProgramName[program::DEPTH]);
		glDeleteShader(VertShaderName);

		Validated = Validated && glf::checkProgram(ProgramName[program::DEPTH]);
	}

	if(Validated)
	{
		UniformTransform[program::DEPTH] = glGetUniformBlockIndex(ProgramName[program::DEPTH], "transform");
	}

	return Validated;
}
예제 #24
0
int SCE_RBuildProgram (SCE_RProgram *prog)
{
    const int modes[2] = {GL_INTERLEAVED_ATTRIBS, GL_SEPARATE_ATTRIBS};
    int status = GL_TRUE;
    int loginfo_size = 0;
    char *loginfo = NULL;
    int i, j;

    if (prog->linked)
        return SCE_OK;

    /* setting transform feedback up */
    if (prog->fb_enabled) {
        glTransformFeedbackVaryings (prog->id, prog->n_varyings,
                                     (const GLchar**)prog->fb_varyings,
                                     modes[prog->fb_mode]);
    }

    /* TODO: follows the same pattern as SCE_RSetDrawBuffers */
    j = 0;
    for (i = 0; i < SCE_MAX_ATTACHMENT_BUFFERS; i++) {
        if (*prog->outputs[i])
            glBindFragDataLocation (prog->id, j++, prog->outputs[i]);
    }

    glLinkProgram (prog->id);

    glGetProgramiv (prog->id, GL_LINK_STATUS, &status);
    if (status != GL_TRUE) {
        SCEE_Log (SCE_INVALID_OPERATION);

        glGetProgramiv (prog->id, GL_INFO_LOG_LENGTH, &loginfo_size);
        loginfo = SCE_malloc (loginfo_size + 1);
        if (!loginfo) {
            SCEE_LogSrc ();
            return SCE_ERROR;
        }
        memset (loginfo, '\0', loginfo_size + 1);
        glGetProgramInfoLog (prog->id, loginfo_size, &loginfo_size, loginfo);

        /* TODO: add program name */
        SCEE_LogMsg ("can't link program, reason: %s", loginfo);

        SCE_free (loginfo);
        return SCE_ERROR;
    }

    prog->linked = SCE_TRUE;

    /* if the map was previously built, rebuild it */
    if (prog->map_built)
        SCE_RSetupProgramAttributesMapping (prog);

    return SCE_OK;
}
예제 #25
0
파일: main.cpp 프로젝트: ramaciotti/opengl
static GLuint link_program(GLuint vertexShader, GLuint fragShader) {
    GLuint program = glCreateProgram();

    glAttachShader(program, vertexShader);
    glAttachShader(program, fragShader);

    glBindFragDataLocation(program, 0, "outColor");
    glLinkProgram(program);

    return program;
}
예제 #26
0
void GLMainShader::GetShaderLocations()
{
	uint* pCurrProgram = &ProgramID[0];

	do {

		//	Attribute locations
		GetAttribLocation(Vertex,						*pCurrProgram, "Position");
		GetAttribLocation(TexCoords,					*pCurrProgram, "TexCoord");
		GetAttribLocation(Normal,						*pCurrProgram, "Normal");
		GetAttribLocation(Colors,						*pCurrProgram, "Colors");
		GetAttribLocation(Tangent,						*pCurrProgram, "Tangent");
		GetAttribLocation(Bitangent,					*pCurrProgram, "Bitangent");
		GetAttribLocation(VertexJoint,					*pCurrProgram, "Joints");
		GetAttribLocation(VertexWeight,					*pCurrProgram, "Weights");
		GetAttribLocation(Light,						*pCurrProgram, "Light");

		//	Get a handle to the the matrix uniforms
		GetUniformLocation(MatMVP,						*pCurrProgram, "MVP");
		GetUniformLocation(MatMV,						*pCurrProgram, "MV");
		GetUniformLocation(MatN,						*pCurrProgram, "N");
		GetUniformLocation(MatP,						*pCurrProgram, "P");

		//	Get the Light uniform handles
		GetUniformLocation(Bones,						*pCurrProgram, "Bones");		
		GetUniformLocation(LightType,					*pCurrProgram, "LightType");
		GetUniformLocation(LightPosition_eyespace,		*pCurrProgram, "LightPosition_eyespace");
		GetUniformLocation(LightDiffuse,				*pCurrProgram, "LightDiffuse");
		GetUniformLocation(LightAmbient,				*pCurrProgram, "LightAmbient");
		GetUniformLocation(LightSpecular,				*pCurrProgram, "LightSpecular");
		GetUniformLocation(LightLinearAttenuation,		*pCurrProgram, "linearAttenuation");
		GetUniformLocation(LightConstantAttenuation,	*pCurrProgram, "constantAttenuation");
		GetUniformLocation(LightQuadraticAttenuation,	*pCurrProgram, "quadraticAttenuation");

		//	Materials
		GetUniformLocation(MaterialType,				*pCurrProgram, "MaterialType");
		GetUniformLocation(DiffuseTexture,				*pCurrProgram, "DiffuseMap");
		GetUniformLocation(BumpmapTexture,				*pCurrProgram, "NormalMap");
		GetUniformLocation(SpecularTexture,				*pCurrProgram, "SpecularMap");
		GetUniformLocation(RenderedTexture,				*pCurrProgram, "RenderedTexture");
		GetUniformLocation(DepthTexture,				*pCurrProgram, "DepthTexture");
		GetUniformLocation(DiffuseColor,				*pCurrProgram, "DiffuseColor");
		GetUniformLocation(AmbientColor,				*pCurrProgram, "AmbientColor");
		GetUniformLocation(SpecularColor,				*pCurrProgram, "SpecularColor");
		GetUniformLocation(Shininess,					*pCurrProgram, "Shininess");

		glBindFragDataLocation(*pCurrProgram, 0, "Color0");

		//	Relink for the output locations
		glLinkProgram(*pCurrProgram);
		
	} while(*++pCurrProgram != 0);
}
예제 #27
0
void MainGraphicsWidget::voxelRender()
{
	VoxelGrid::getInstance()->buildVoxels(m_lightBuffer->getLight());
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	MatrixManager::getInstance()->putMatrix4(MODELVIEW, glm::mat4(1.0f));
	MatrixManager::getInstance()->putMatrix4(PROJECTION, glm::mat4(1.0f));
	MatrixManager::getInstance()->putMatrix3(NORMAL, glm::mat3(1.0f));
	view->viewport();
	view->use3D(true);

	camera->transform();
	GLSLProgram *glslProgram = ShaderManager::getInstance()->getShader("Voxel");
	glslProgram->use();

	glBindFragDataLocation(glslProgram->getHandle(), 0, "fragColor");
	glBindAttribLocation(glslProgram->getHandle(), 0, "v_vertex");

	glslProgram->sendUniform("projectionMatrix", &MatrixManager::getInstance()->getMatrix4(PROJECTION)[0][0]);
	glslProgram->sendUniform("modelviewMatrix", &MatrixManager::getInstance()->getMatrix4(MODELVIEW)[0][0]);

	glm::mat4 cameraInverse = glm::mat4(1.0);
	cameraInverse = camera->transformToMatrix(cameraInverse);
	cameraInverse = glm::inverse(cameraInverse);
	glslProgram->sendUniform("invCameraMatrix", &cameraInverse[0][0]);
	glslProgram->sendUniform("worldSize", WORLD_SIZE);
	//glslProgram->sendUniform("numVoxels", VOXEL_SIZE);
	//glslProgram->sendUniform("mipLevel", VoxelGrid::getInstance()->getMipLevel());

	int mipFactor = pow(2.0, VoxelGrid::getInstance()->getMipLevel());
	
	glActiveTexture(GL_TEXTURE8);
	glEnable(GL_TEXTURE_3D);
	VoxelGrid::getInstance()->bind(VoxelGrid::getInstance()->getMipLevel());
	glslProgram->sendUniform("voxelmap", 8);

	//glEnable(GL_POINT_SMOOTH);
	glPointSize(10.0f*mipFactor);
	float voxelWidth = (float)WORLD_SIZE / (float)VOXEL_SIZE * mipFactor;
	glBegin(GL_POINTS);
	for (float x=-(WORLD_SIZE/2.0)+(voxelWidth/2.0); x<(WORLD_SIZE/2.0); x+=voxelWidth)
	{
		for (float y=-(WORLD_SIZE/2.0)+(voxelWidth/2.0); y<(WORLD_SIZE/2.0); y+=voxelWidth)
		{
			for (float z=-(WORLD_SIZE/2.0)+(voxelWidth/2.0); z<(WORLD_SIZE/2.0); z+=voxelWidth)
			{
				glVertex3f(x,y,z);
			}
		}
	}
	glEnd();

	glslProgram->disable();
}
예제 #28
0
GLuint setupShaders() {

	char *vs = NULL,*fs = NULL,*fs2 = NULL;

	GLuint p,v,f;

	v = glCreateShader(GL_VERTEX_SHADER);
	f = glCreateShader(GL_FRAGMENT_SHADER);

	vs = textFileRead(vertexFileName);
	fs = textFileRead(fragmentFileName);

	const char * vv = vs;
	const char * ff = fs;

	glShaderSource(v, 1, &vv,NULL);
	glShaderSource(f, 1, &ff,NULL);

	free(vs);free(fs);

	glCompileShader(v);
	glCompileShader(f);

	printShaderInfoLog(v);
	printShaderInfoLog(f);

	p = glCreateProgram();
	glAttachShader(p,v);
	glAttachShader(p,f);

	glBindFragDataLocation(p, 0, "output");

	glBindAttribLocation(p,vertexLoc,"position");
	glBindAttribLocation(p,normalLoc,"normal");
	glBindAttribLocation(p,texCoordLoc,"texCoord");

	glLinkProgram(p);
	glValidateProgram(p);
	printProgramInfoLog(p);

	program = p;
	vertexShader = v;
	fragmentShader = f;
	
	GLuint k = glGetUniformBlockIndex(p,"Matrices");
	glUniformBlockBinding(p, k, matricesUniLoc);
	glUniformBlockBinding(p, glGetUniformBlockIndex(p,"Material"), materialUniLoc);

	texUnit = glGetUniformLocation(p,"texUnit");

	return(p);
}
예제 #29
0
GLuint ShaderUtils::CreateProgramWithShaders(const std::vector<GLuint> &shaderList,
        const std::vector<VertexAttributeBindingData> &attributes,
        const std::vector<VertexAttributeBindingData> &fragData) {
    GLuint program = glCreateProgram();
    for(size_t iLoop = 0; iLoop < shaderList.size(); iLoop++)
        glAttachShader(program, shaderList[iLoop]);
    for(size_t iLoop = 0; iLoop < attributes.size(); iLoop++)
        glBindAttribLocation(program, attributes[iLoop].index, attributes[iLoop].strShaderFile );
    for(size_t iLoop = 0; iLoop < fragData.size(); iLoop++)
        glBindFragDataLocation(program, fragData[iLoop].index, fragData[iLoop].strShaderFile );

    return program;
}
예제 #30
0
void OGLConstants::bindAttribFragDataLocations(GLuint program) {
  glBindAttribLocation(program, VERTEX.location, VERTEX.name);
  glBindAttribLocation(program, COLOR.location, COLOR.name);
  glBindAttribLocation(program, NORMAL.location, NORMAL.name);
  glBindAttribLocation(program, TEX_COORD_0.location, TEX_COORD_0.name);
  glBindAttribLocation(program, TEX_COORD_1.location, TEX_COORD_1.name);
  glBindAttribLocation(program, TANGENT.location, TANGENT.name);
  glBindAttribLocation(program, BINORMAL.location, BINORMAL.name);

  glBindFragDataLocation(program, FRAG_COLOR.location, FRAG_COLOR.name);

  assert(!checkGLError());
}