Esempio n. 1
0
Shader::Shader(std::string vertex, std::string pixel ) {

  const char *pixelSource;
  const char *vertexSource;

  std::string pString, vString;
  size_t pixelSourceLen, vertexSourceLen;

  vert_shader = glCreateShader(GL_VERTEX_SHADER);
  frag_shader = glCreateShader(GL_FRAGMENT_SHADER);

  // загрузка исходников вертексного шейдера
  vString = readFile(vertex);
  vertexSource = vString.c_str();
  vertexSourceLen = vString.size();

  glShaderSource(vert_shader, 1, &vertexSource, (const GLint*)&vertexSourceLen);

  // загрузка исходников фрагментарного шейдера
  pString = readFile(pixel);
  pixelSource = pString.c_str();
  pixelSourceLen = pString.size();

  glShaderSource(frag_shader, 1, &pixelSource, (const GLint*)&pixelSourceLen);

  // компил¤ци¤ шейдеров
  glCompileShader(vert_shader);
  glCompileShader(vert_shader);

  // создание шейдерной программы
  shader_program = glCreateProgram();

  // присоединение шейдеров к программе
  glAttachShader(shader_program, vert_shader);
  glAttachShader(shader_program, frag_shader);

  // сборка шейдерной программы
  glLinkProgram(shader_program);

  // вывод информации о ходе компил¤ции и сборки
  PrintProgramLog(shader_program);
  
  // если были обнаружены ошибки - выходим
  if (glGetError() == GL_NO_ERROR) {
    log_debug("Shader::Shader: Shaders loaded");
  } else {
    shader_program = 0;
    log_warning("Shader::Shader: Shaders NOT loaded");
  }
}
Esempio n. 2
0
//
//  Create Shader Program
//
int CreateShaderProg(const char* VertFile,const char* FragFile)
{
   //  Create program
   int prog = glCreateProgram();
   //  Create and compile vertex shader
   if (VertFile) CreateShader(prog,GL_VERTEX_SHADER,VertFile);
   //  Create and compile fragment shader
   if (FragFile) CreateShader(prog,GL_FRAGMENT_SHADER,FragFile);
   //  Link program
   glLinkProgram(prog);
   //  Check for errors
   PrintProgramLog(prog);
   //  Return name
   return prog;
}
Esempio n. 3
0
//
//  Create Shader Program
//
int CreateShaderProg(const char* VertFile,const char* FragFile, char ** arrayAttributes)
{
   //  Create program
   int prog = glCreateProgram();
   //  Create and compile vertex shader
   if (VertFile) CreateShader(prog,GL_VERTEX_SHADER,VertFile);
   //  Create and compile fragment shader
   if (FragFile) CreateShader(prog,GL_FRAGMENT_SHADER,FragFile);
   if(arrayAttributes){
      int k;
   for ( k=0;arrayAttributes[k];k++)
      if (arrayAttributes[k][0])
         glBindAttribLocation(prog,k,arrayAttributes[k]);
   }
   //  Link program
   glLinkProgram(prog);
   //  Check for errors
   PrintProgramLog(prog);
   //  Return name
   return prog;
}
Esempio n. 4
0
File: GLSL.cpp Progetto: jtkk/Boids
int GLSL::LinkProgram(int vshader, int fshader, int gshader)
{
    int programID = 0;
    // create shader program
    if (vshader && fshader)
        programID = glCreateProgram();
    if (programID > 0) {
        // attach shaders to program
        glAttachShader(programID, vshader);
        glAttachShader(programID, fshader);
		if (gshader >= 0)
			glAttachShader(programID, gshader);
        // link and verify
        glLinkProgram(programID);
        GLint status;
        glGetProgramiv(programID, GL_LINK_STATUS, &status);
        if (status == GL_FALSE)
            PrintProgramLog(programID);
    }
    return programID;
}
Esempio n. 5
0
//
//  Create Shader Program including Geometry Shader
//
int CreateShaderProgGeom()
{
   //  Create program
   int prog = glCreateProgram();
   //  Compile and add shaders
   CreateShader(prog,GL_VERTEX_SHADER  ,"nbody.vert");
#ifdef __APPLE__
   //  OpenGL 3.1 for OSX
   CreateShader(prog,GL_GEOMETRY_SHADER_EXT,"nbody.geom_ext");
   glProgramParameteriEXT(prog,GL_GEOMETRY_INPUT_TYPE_EXT  ,GL_POINTS);
   glProgramParameteriEXT(prog,GL_GEOMETRY_OUTPUT_TYPE_EXT ,GL_TRIANGLE_STRIP);
   glProgramParameteriEXT(prog,GL_GEOMETRY_VERTICES_OUT_EXT,4);
#else
   //  OpenGL 3.2 adds layout ()
   CreateShader(prog,GL_GEOMETRY_SHADER,"nbody.geom");
#endif
   CreateShader(prog,GL_FRAGMENT_SHADER,"nbody.frag");
   //  Link program
   glLinkProgram(prog);
   //  Check for errors
   PrintProgramLog(prog);
   //  Return name
   return prog;
}
Esempio n. 6
0
bool CShaderInstance::Initialize( CBaseShader* pShader )
{
	assert( pShader );
	assert( m_Program == 0 );

	m_pShader = pShader;

	const char* const pszName = pShader->GetName();

	std::unique_ptr<char[]> vertex( LoadShaderFile( pszName, SHADER_VERTEX_EXT ) );
	std::unique_ptr<char[]> frag( LoadShaderFile( pszName, SHADER_FRAG_EXT ) );

	if( !vertex || !frag )
		return false;

	GLuint vertexShader;
	GLuint fragShader;

	if( !CreateShader( pszName, vertex.get(), GL_VERTEX_SHADER, vertexShader ) )
		return false;

	if( !CreateShader( pszName, frag.get(), GL_FRAGMENT_SHADER, fragShader ) )
	{
		glDeleteShader( vertexShader );

		check_gl_error();

		return false;
	}

	m_Program = glCreateProgram();

	check_gl_error();

	glAttachShader( m_Program, vertexShader );

	check_gl_error();

	glAttachShader( m_Program, fragShader );

	check_gl_error();

	OnPreLink();

	//Link program
	glLinkProgram( m_Program );

	check_gl_error();

	//Mark shaders as deleted so they'll be freed when the program is deleted.
	glDeleteShader( fragShader );

	check_gl_error();

	glDeleteShader( vertexShader );

	check_gl_error();

	//Check for errors
	GLint programSuccess = GL_TRUE;
	glGetProgramiv( m_Program, GL_LINK_STATUS, &programSuccess );

	check_gl_error();

	if( programSuccess != GL_TRUE )
	{
		printf( "Error linking shader program \"%s\" (%d)!\n", pszName, m_Program );
		PrintProgramLog( m_Program );

		glDeleteProgram( m_Program );

		check_gl_error();

		m_Program = 0;

		return false;
	}

	if( !OnPostLink() )
	{
		printf( "Error post-linking shader program \"%s\" (%d)!\n", pszName, m_Program );
		glDeleteProgram( m_Program );

		check_gl_error();

		m_Program = 0;

		return false;
	}

	return true;
}