示例#1
0
文件: Shader.cpp 项目: NCCA/NGL
void Shader::load(const std::string &_name ) noexcept
{
  // see if we already have some source attached
  if(!m_source.empty())
  {
    msg->addWarning("deleting existing source code\n");
    m_source.clear();
  }
  std::ifstream shaderSource(_name.data());
  if (!shaderSource.is_open())
  {
   msg->addError(fmt::format("File not found {0}",_name.data()));
   exit(EXIT_FAILURE);
  }
  // now read in the data
  m_source =  std::string((std::istreambuf_iterator<char>(shaderSource)), std::istreambuf_iterator<char>());
  shaderSource.close();
  // glShaderSource needs null terminated const char *
  m_source+='\0';
  m_originalSource=m_source;
  const char* data=m_source.c_str();
  glShaderSource(m_shaderHandle , 1, &data,nullptr);
  m_compiled=false;

  if (m_debugState == true)
  {
    printInfoLog(m_shaderHandle);
  }
}
示例#2
0
std::shared_ptr<Opengl::RenderEffect>& ResourceManager::makeEffect(const std::string& name) {
    if (this->effectCache.find(name) == this->effectCache.end()) {
        Logger::getInstance().log(Logger::LOG_INFO, "Loading shader `%s'", name.c_str());

        std::fstream file(name.c_str(), std::ios::binary | std::ios::in);
        if (!file.good()) {
            Logger::getInstance().log(Logger::LOG_ERROR, "Cannot open file `%s'", name.c_str());
            return this->effectCache["nullptr"];
        }

        file.seekg(0, std::ios::end);
        int sourceLength = file.tellg();

        std::unique_ptr<char[]> shaderSource(new char[sourceLength + 1]);
        shaderSource[sourceLength] = '\0';

        file.seekg(0, std::ios::beg);
        file.read(shaderSource.get(), sourceLength);
        file.close();

        this->insertEffect(name, shaderSource.get());
    }

    return this->effectCache[name];
}
示例#3
0
void Shader::load( std::string _name ) noexcept
{
  // see if we already have some source attached
  if(m_source.empty())
  {
    std::cerr<<"deleting existing source code\n";
    m_source.clear();
  }
  std::ifstream shaderSource(_name.c_str());
  if (!shaderSource.is_open())
  {
   std::cerr<<"File not found "<<_name.c_str()<<"\n";
   //exit(EXIT_FAILURE);
  }
  // now read in the data
  m_source =  std::string((std::istreambuf_iterator<char>(shaderSource)), std::istreambuf_iterator<char>());
  shaderSource.close();
  // glShaderSource needs null terminated const char *
  m_source+='\0';
  const char* data=m_source.c_str();
  glShaderSource(m_shaderHandle , 1, &data,NULL);
  m_compiled=false;

  if (m_debugState == true)
  {
    printInfoLog(m_shaderHandle);
  }
}
示例#4
0
/*virtual*/
std::string
HdSceneDelegate::GetDisplacementShaderSource(SdfPath const &shaderId)
{
    std::string shaderSource(
        "vec4 displacementShader(int index, vec4 Peye, vec3 Neye, vec4 patchCoord) {\n"
        "    return Peye;\n"
        "}\n"
        );
    return shaderSource;
}
示例#5
0
    void GLProgram::printSource() const
    {
        GL::Int maxAttachedShaders = 0;
        gl::GetProgramiv(m_Handle, GL::ATTACHED_SHADERS, &maxAttachedShaders);

        std::vector<GL::UInt> shaders(static_cast<size_t>(maxAttachedShaders));
        GL::Sizei numAttachedShaders = 0;
        gl::GetAttachedShaders(m_Handle, maxAttachedShaders, &numAttachedShaders, shaders.data());

        std::stringstream ss;
        for (auto shader : shaders) {
            GL::Int type = 0;
            gl::GetShaderiv(shader, GL::SHADER_TYPE, &type);
            ss << "// " << GL::Enum(type) << '\n';

            GL::Int bufferLength = 0;
            gl::GetShaderiv(shader, GL::SHADER_SOURCE_LENGTH, &bufferLength);

            std::vector<char> shaderSource(static_cast<size_t>(bufferLength));
            GL::Sizei sourceLength = 0;
            gl::GetShaderSource(shader, bufferLength, &sourceLength, shaderSource.data());

            const char* p = shaderSource.data();
            const char* end = p + sourceLength;
            bool printLineNumber = true;
            int lineNumber = 0;
            for (; p < end; ++p) {
                if (printLineNumber) {
                    ss << std::setw(4) << ++lineNumber << std::setw(0) << ": ";
                    printLineNumber = false;
                }

                ss << *p;
                if (*p == '\n')
                    printLineNumber = true;
            }

            if (end > p && end[-1] != '\n')
                ss << '\n';
        }

        std::string source = ss.str();
        size_t length = source.length();
        if (length > 0 && source[length - 1] == '\n')
            source.resize(length - 1);

        Z_LOG(source);
    }
GLuint PagShaderProgram::compileShader(QString name, GLenum type)
{
    QFileInfo shaderName(name);
    if (!shaderName.exists())
    {
        //qDebug() << "No existe el shader source: " << name;
        return 0;
    }

    std::string shaderString;
    QFile shaderSource(name);
    if (!shaderSource.open(QIODevice::ReadOnly))
    {
        qDebug() << "No se puede abrir el archivo " << name;
        return 0;
    }
    shaderString = (std::string)shaderSource.readAll();
    shaderSource.close();

    GLuint shaderHandler = glCreateShader(type);
    if (shaderHandler == 0) {
        qDebug() << "No se puede crear el shader object";
        return 0;
    }

    const char *c_str = shaderString.c_str();
    glShaderSource(shaderHandler, 1, &c_str, NULL);

    glCompileShader(shaderHandler);
    GLint compileResult;

    glGetShaderiv(shaderHandler,GL_COMPILE_STATUS, &compileResult);
    if (compileResult == GL_FALSE) {
        qDebug() << "Error al compilar el shader: " << name;
        GLint logLen = 0;
        glGetShaderiv(shaderHandler, GL_INFO_LOG_LENGTH, &logLen);
        if (logLen > 0) {
            char * log = new char[logLen];
            GLint written = 0;
            glGetShaderInfoLog(shaderHandler,logLen,&written, log);
            qDebug() << log << endl;
            delete [] log;
        }
    }

    return shaderHandler;
}
示例#7
0
//GLSL shader creation (of a certain type, vertex shader, fragment shader oe geometry shader)
GLuint createShaderFromString(const char *shaderString, const char *filepath, GLuint shaderType, GLuint shaderID)
{
    if(0 == shaderID){
        shaderID = glCreateShader(shaderType);
    }
	std::string fileName(filepath);
    if (fileName.empty()){
        fileName = "./__defaultGLSL__.glsl";
    }
	std::string shaderSource(shaderString);

    try{
        //include files are processed in a recursive way, no worry!!
        shaderSource = manageIncludes(shaderSource, fileName);

        //Define global macros
        std::map<string, string>::iterator itr;
	    for( itr = shadersMacroMap.begin(); itr != shadersMacroMap.end(); itr++){
            const char *macro = itr->first.c_str();
            const char *value = itr->second.c_str();
		    defineMacro(shaderSource, macro, value);
	    }

	    //Passing shader source code to GL
	    //Source used for "shaderID" shader, there is only "1" source code and 
	    //the string is NULL terminated (no sizes passed)
	    //std::cout << shaderSource;
	    const char *src = shaderSource.c_str();
	    glShaderSource(shaderID, 1, &src, NULL);
	    glCompileShader(shaderID);

        //check GL runtime error
        GLenum error;
        while ((error = glGetError() ) != GL_NO_ERROR){
            const char* format = "GL error at file %s, line %d: %s\n";
            fprintf (stderr, format, __FILE__, __LINE__, gluErrorString(error));
            shaderID = 0;
        }
    }
    catch(...){
        glDeleteShader(shaderID);
        shaderID = 0;
    }

	return shaderID;
}
示例#8
0
int main(int argc, char** argv)
{	
	if (argc != 3)
	{
		std::cerr << "syntax: ShaderImporter {input fullpath} {output fullpath without extension}" << std::endl;
		return 1;
	}

	std::cout << "input: " << argv[1] << " output: " << argv[2] << std::endl;

	std::ifstream file(argv[1], std::ios::binary | std::ios::ate);
	auto fileLength = file.tellg();

	if (fileLength <= 0)
	{
		std::cerr << "unable to read file " << argv[1] << std::endl;
		return 1;
	}

	std::string shaderSource(static_cast<unsigned int>(fileLength), '0');

	file.seekg(0, std::ios::beg);
	file.read(&shaderSource[0], fileLength);
	file.close();
	
	if (shaderSource.find("main_vertex") != std::string::npos)
	{
		importShader(argv[1], std::string(argv[2]) + ".cvs", "/Emain_vertex", "/Tvs_5_0");
	}

	if (shaderSource.find("main_geometry") != std::string::npos)
	{
		importShader(argv[1], std::string(argv[2]) + ".cgs", "/Emain_geometry", "/Tgs_5_0");
	}

	if (shaderSource.find("main_pixel") != std::string::npos)
	{
		importShader(argv[1], std::string(argv[2]) + ".cps", "/Emain_pixel", "/Tps_5_0");
	}	

	return 0;
}
示例#9
0
GLuint loadShader(char const *fname, GLenum shaderType, bool *errorFlagPtr) {
    std::ifstream fileStream(fname);
    std::stringstream buffer;
    buffer << fileStream.rdbuf();
    std::string shaderSource(buffer.str());

    GLuint shaderId = glCreateShader(shaderType);
    const GLchar * const shaderSourceCStr = shaderSource.c_str();

    glShaderSource(shaderId, 1, &shaderSourceCStr, nullptr);
    glCompileShader(shaderId);

    *errorFlagPtr = checkShaderCompileStatus(shaderId);
    if(*errorFlagPtr) {
        glDeleteShader(shaderId);
        return 0;
    }

    return shaderId;
}
/** @brief Function builds test's GLSL program.
 *         If succeded, the program will be set to be used.
 *
 *  @note The function may throw if unexpected error has occured.
 */
void TextureCubeMapArrayETC2Support::prepareProgram()
{
	/* Shortcut for GL functionality */
	const glw::Functions& gl = m_context.getRenderContext().getFunctions();

	struct Shader
	{
		glw::GLchar const* const source;
		glw::GLenum const		 type;
		glw::GLuint				 id;
	} shader[] = { { s_vertex_shader, GL_VERTEX_SHADER, 0 }, { s_fragment_shader, GL_FRAGMENT_SHADER, 0 } };

	bool			  programPreparationFailed = false;
	glw::GLuint const shader_count			   = sizeof(shader) / sizeof(shader[0]);

	/* Create program. */
	m_program = gl.createProgram();
	GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateProgram call failed.");

	/* Shader compilation. */
	for (glw::GLuint i = 0; i < shader_count; ++i)
	{
		if (DE_NULL != shader[i].source)
		{
			shader[i].id = gl.createShader(shader[i].type);

			GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateShader call failed.");

			gl.attachShader(m_program, shader[i].id);

			GLU_EXPECT_NO_ERROR(gl.getError(), "glAttachShader call failed.");

			glu::ContextType contextType = m_context.getRenderContext().getType();
			glu::GLSLVersion glslVersion = glu::getContextTypeGLSLVersion(contextType);
			std::string		 shaderSource(glu::getGLSLVersionDeclaration(glslVersion));
			shaderSource += shader[i].source;
			const char* source = shaderSource.c_str();

			gl.shaderSource(shader[i].id, 1, &source, NULL);

			GLU_EXPECT_NO_ERROR(gl.getError(), "glShaderSource call failed.");

			gl.compileShader(shader[i].id);

			GLU_EXPECT_NO_ERROR(gl.getError(), "glCompileShader call failed.");

			glw::GLint status = GL_FALSE;

			gl.getShaderiv(shader[i].id, GL_COMPILE_STATUS, &status);
			GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv call failed.");

			if (GL_FALSE == status)
			{
				glw::GLint log_size = 0;
				gl.getShaderiv(shader[i].id, GL_INFO_LOG_LENGTH, &log_size);
				GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv call failed.");

				glw::GLchar* log_text = new glw::GLchar[log_size];

				gl.getShaderInfoLog(shader[i].id, log_size, NULL, &log_text[0]);

				m_context.getTestContext().getLog() << tcu::TestLog::Message << "Shader compilation error, log:\n"
													<< log_text << "\n"
													<< "Shader source code:\n"
													<< shaderSource << "\n"
													<< tcu::TestLog::EndMessage;

				delete[] log_text;

				GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderInfoLog call failed.");

				programPreparationFailed = true;
				break;
			}
		}
	}

	if (programPreparationFailed)
	{
		if (m_program)
		{
			gl.deleteProgram(m_program);
			m_program = 0;
		}
	}
	else
	{
		/* Link. */
		gl.linkProgram(m_program);

		GLU_EXPECT_NO_ERROR(gl.getError(), "glLlinkProgram call failed.");

		glw::GLint status = GL_FALSE;

		gl.getProgramiv(m_program, GL_LINK_STATUS, &status);

		if (GL_TRUE == status)
		{
			for (glw::GLuint i = 0; i < shader_count; ++i)
			{
				if (shader[i].id)
				{
					gl.detachShader(m_program, shader[i].id);

					GLU_EXPECT_NO_ERROR(gl.getError(), "glDetachShader call failed.");
				}
			}
		}
		else
		{
			glw::GLint log_size = 0;

			gl.getProgramiv(m_program, GL_INFO_LOG_LENGTH, &log_size);

			GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramiv call failed.");

			glw::GLchar* log_text = new glw::GLchar[log_size];

			gl.getProgramInfoLog(m_program, log_size, NULL, &log_text[0]);

			m_context.getTestContext().getLog() << tcu::TestLog::Message << "Program linkage has failed due to:\n"
												<< log_text << "\n"
												<< tcu::TestLog::EndMessage;

			delete[] log_text;

			GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramInfoLog call failed.");

			programPreparationFailed = true;
		}
	}

	for (glw::GLuint i = 0; i < shader_count; ++i)
	{
		if (0 != shader[i].id)
		{
			gl.deleteShader(shader[i].id);
			shader[i].id = 0;
		}
	}

	if (m_program)
	{
		glw::GLint textureSampler = gl.getUniformLocation(m_program, "texture_sampler");
		GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation call failed.");
		gl.useProgram(m_program);
		GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram call failed.");
		gl.uniform1i(textureSampler, 0);
		GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i call failed.");
	}
	else
		TCU_FAIL("Failed to prepare program");
}