示例#1
0
GLuint makeShaderFromSource(
    const char* vert,
    const char* frag,
    const char* geom)
{
    std::cout << "  vs-";
    GLuint vertSrc = loadShaderFile(vert, GL_VERTEX_SHADER);
    printShaderInfoLog(vertSrc);

    std::cout << "  fs-";
    GLuint fragSrc = loadShaderFile(frag, GL_FRAGMENT_SHADER);
    printShaderInfoLog(fragSrc);

    // Vertex and fragment shaders are required
    if ((vertSrc == 0) || (fragSrc == 0))
    {
        std::cout << "  SHADER NOT COMPILED - source not found." << std::endl;
        return 0;
    }

    //std::cout << "  gs: ";
    GLuint geomSrc = loadShaderFile(geom, GL_GEOMETRY_SHADER_EXT);

    GLuint program = glCreateProgram();

    glCompileShader(vertSrc);
    glCompileShader(fragSrc);

    GLint success = 0;
    glGetShaderiv(vertSrc, GL_COMPILE_STATUS, &success);
    assert(success == GL_TRUE);
    glGetShaderiv(fragSrc, GL_COMPILE_STATUS, &success);
    assert(success == GL_TRUE);

    glAttachShader(program, vertSrc);
    glAttachShader(program, fragSrc);

    // Will be deleted when program is.
    glDeleteShader(vertSrc);
    glDeleteShader(fragSrc);

    // Initialize Geometry shader state after creation, before linking.
    if (geomSrc)
    {
        std::cout << "  gs-";
        printShaderInfoLog(geomSrc);
        glCompileShader(geomSrc);
        glAttachShader (program, geomSrc);
    }

    glLinkProgram(program);
    std::cout << "  prog: ";
    printProgramInfoLog(program);

    std::cout << std::endl;

    glUseProgram(0);
    return program;
}
示例#2
0
/// Append any applicable suffixes to the name given and attempt to find
/// vertex, fragment and (optionally) geometry shader source.
GLuint makeShaderByName(const char* name)
{
    if (!name)
        return 0;

    std::string vs(name);
    std::string fs(name);
    std::string gs(name);
    vs += ".vert";
    fs += ".frag";
    gs += ".geom";

    std::cout << std::endl
        << "makeShaderByName("
        << vs
        << ", "
        << fs
        << ", "
        << gs
        << "):__"
        << std::endl;

    GLuint vertSrc = loadShaderFile(vs.c_str(), GL_VERTEX_SHADER);
    GLuint fragSrc = loadShaderFile(fs.c_str(), GL_FRAGMENT_SHADER);
    GLuint geomSrc = loadShaderFile(gs.c_str(), GL_GEOMETRY_SHADER_EXT);

    printShaderInfoLog(vertSrc);
    printShaderInfoLog(fragSrc);

    GLuint program = glCreateProgram();

    glCompileShader(vertSrc);
    glCompileShader(fragSrc);

    glAttachShader(program, vertSrc);
    glAttachShader(program, fragSrc);

    // Will be deleted when program is.
    glDeleteShader(vertSrc);
    glDeleteShader(fragSrc);

    // Initialize Geometry shader state after creation, before linking.
    if (geomSrc)
    {
        printShaderInfoLog(geomSrc);
        glCompileShader(geomSrc);
        glAttachShader (program, geomSrc);
    }

    glLinkProgram(program);
    printProgramInfoLog(program);

    glUseProgram(0);
    return program;
}
示例#3
0
void Shader::load(const std::string& vertexFile, const std::string& fragmentFile, const uint glslVersion)
{
	TRACE_INFO("Loading shader from: " << vertexFile << ", " << fragmentFile, 0);

	if (!GLEW_ARB_vertex_shader || !GLEW_ARB_fragment_shader)
	{
		TRACE_ERROR("Error: Cannot find GLEW_ARB_vertex_shader and GLEW_ARB_fragment_shader.", 0);
		TRACE_ERROR("Error: Probably not initialized glew.", 0);
		return;
	}

	//creation of shaders and program
	const GLuint vertexShaderHandle = loadShaderFile(GL_VERTEX_SHADER, (const char*) vertexFile.c_str(), glslVersion);
	const GLuint fragmentShaderHandle = loadShaderFile(GL_FRAGMENT_SHADER, (const char*) fragmentFile.c_str(), glslVersion);


	// create the program object
	m_shaderProg = glCreateProgram();

	glAttachShader(m_shaderProg, vertexShaderHandle);
	glAttachShader(m_shaderProg, fragmentShaderHandle);

	// link the program
	glLinkProgram(m_shaderProg);

	// check the link status
	GLint isLinked;
	glGetProgramiv(m_shaderProg, GL_LINK_STATUS, &isLinked);

	if (!isLinked)
	{
		GLint infoLen = 0;
		glGetProgramiv(m_shaderProg, GL_INFO_LOG_LENGTH, &infoLen);

		if (infoLen > 1)
		{
			char* infoLog = new char[sizeof(char) * infoLen];

			glGetProgramInfoLog(m_shaderProg, infoLen, nullptr, infoLog);
			TRACE_ERROR("Error: Error linking program:" << std::endl << infoLog, 0);

			delete[] infoLog;
		}

		glDeleteProgram(m_shaderProg);
		return;
	}

	setupCommonUniforms();
}
示例#4
0
文件: Ex10.cpp 项目: CompN3rd/cg2
bool loadShaderCode(const char* vertProgramCode, GLuint &vertProgram, const char* fragmentProgramCode, GLuint &fragProgram) {
    vertProgram = loadShaderFile(vertProgramCode, GL_VERTEX_SHADER);
    fragProgram = loadShaderFile(fragmentProgramCode, GL_FRAGMENT_SHADER);

    if (vertProgram == 0) {
        std::cout << "(initShader) - Could not create vertex shader." << std::endl;
        deleteShader();
        return false;
    }
    if (fragProgram == 0) {
        std::cout << "(initShader) - Could not create fragment shader." << std::endl;
        deleteShader();
        return false;
    }
    return true;
}
GLuint makeShaderFromSource(
    const char* vert,
    const char* frag,
    const char* geom)
{
    std::cout << "  vs-";
    GLuint vertSrc = loadShaderFile(vert, GL_VERTEX_SHADER);
    printShaderInfoLog(vertSrc);

    std::cout << "  fs-";
    GLuint fragSrc = loadShaderFile(frag, GL_FRAGMENT_SHADER);
    printShaderInfoLog(fragSrc);

    //std::cout << "  gs: ";
    GLuint geomSrc = loadShaderFile(geom, GL_GEOMETRY_SHADER_EXT);

    GLuint program = glCreateProgram();

    glCompileShader(vertSrc);
    glCompileShader(fragSrc);

    glAttachShader(program, vertSrc);
    glAttachShader(program, fragSrc);

    // Will be deleted when program is.
    glDeleteShader(vertSrc);
    glDeleteShader(fragSrc);

    // Initialize Geometry shader state after creation, before linking.
    if (geomSrc)
    {
        std::cout << "  gs-";
        printShaderInfoLog(geomSrc);
        glCompileShader(geomSrc);
        glAttachShader (program, geomSrc);
    }

    glLinkProgram(program);
    std::cout << "  prog: ";
    printProgramInfoLog(program);

    std::cout << std::endl;

    glUseProgram(0);
    return program;
}
示例#6
0
文件: Ex03.cpp 项目: blinrybot/cg2
void initShader() {
  shaderProgram = glCreateProgram();
  // check if operation failed //
  if (shaderProgram == 0) {
    std::cout << "(initShader) - Failed creating shader program." << std::endl;
    return;
  }

  GLuint vertexShader = loadShaderFile("../shader/simple.vert", GL_VERTEX_SHADER);
  if (vertexShader == 0) {
    std::cout << "(initShader) - Could not create vertex shader." << std::endl;
    deleteShader();
    return;
  }
  GLuint fragmentShader = loadShaderFile("../shader/simple.frag", GL_FRAGMENT_SHADER);
  if (fragmentShader == 0) {
    std::cout << "(initShader) - Could not create vertex shader." << std::endl;
    deleteShader();
    return;
  }

  // successfully loaded and compiled shaders -> attach them to program //
  glAttachShader(shaderProgram, vertexShader);
  glAttachShader(shaderProgram, fragmentShader);

  // mark shaders for deletion after clean up (they will be deleted, when detached from all shader programs) //
  glDeleteShader(vertexShader);
  glDeleteShader(fragmentShader);

  // link shader program //
  glLinkProgram(shaderProgram);



  // set address of fragment color output //
  glBindFragDataLocation(shaderProgram, 0, "color");
}
示例#7
0
void GLWidget::loadShaders(QString file)
{
	if (data.fsh) {
		glDeleteShader(data.fsh);
		glDetachShader(data.program, data.fsh);
	}

	if (!data.vsh) {
		qDebug("Loading vertex shader...");
		data.vsh = loadShaderFile(GL_VERTEX_SHADER, RESPFX "vertex.vsh");
	}
	qDebug(QString("Loading fragment shader: %1...").arg(file).toLocal8Bit());
	data.fsh = loadShaderFile(GL_FRAGMENT_SHADER, file);
	if (data.vsh == 0 || data.fsh == 0)
		return;

	glAttachShader(data.program, data.vsh);
	glAttachShader(data.program, data.fsh);

	qDebug() << "Linking program...";
	glLinkProgram(data.program);

	int logLength;
	glGetProgramiv(data.program, GL_INFO_LOG_LENGTH, &logLength);
	char log[logLength];
	glGetProgramInfoLog(data.program, logLength, &logLength, log);
	qWarning(log);

	data.loc.vertex = glGetAttribLocation(data.program, "vertex");
	data.loc.projection = glGetUniformLocation(data.program, "projection");
	data.loc.dim = glGetUniformLocation(data.program, "DIM");
	data.loc.zoom = glGetUniformLocation(data.program, "zoom");
	data.loc.animation = glGetUniformLocation(data.program, "animation");
	data.loc.position = glGetUniformLocation(data.program, "position");
	glEnableVertexAttribArray(data.loc.vertex);
	glUseProgram(data.program);
}
示例#8
0
	// this function loads only the certex and fragment programs and like the above it sets the vertex attribute locations
	// in the rare case you want to set these yourself then use any number you like above lets say 5, its really 1 but i might add support for like just vertex + texture and such later on
	// one thing to note is that the program is not linked, that function is lower down
	unsigned int glzShaderLoad(std::string const file_vert, std::string const file_frag, glzVAOType type)
	{
		glzAppinitialization app;
		if(!isinited_shd) ini_shd();

		unsigned int  program;

		program = glCreateProgram();


		loadShaderFile(program, file_vert, glzShadertype::VERTEX_SHADER);
		loadShaderFile(program, file_frag, glzShadertype::FRAGMENT_SHADER);


		if (type == glzVAOType::AUTO)
			{
				glBindAttribLocation(program, 0, "Position");
				glBindAttribLocation(program, 1, "TexCoord");
				glBindAttribLocation(program, 2, "Normal");
			}

		return program;

	}
示例#9
0
GLuint Shader::CreateShader(const GLenum shaderType, const GLchar* shaderPath)
{
    GLuint shader = glCreateShader(shaderType);
    std::string shaderCode;
    loadShaderFile(shaderPath, shaderCode);
    char const * shaderSource = shaderCode.c_str();
    glShaderSource(shader, 1, &shaderSource, NULL);
    glCompileShader(shader);

    GLint result;
    GLchar infoLog[512];
    glGetShaderiv(shader, GL_COMPILE_STATUS, &result);

    if(!result)
    {
        glGetShaderInfoLog(shader, 512, NULL, infoLog);
        std::cout << "ERROR: " << shaderPath << std::endl;
        std::cout << infoLog << std::endl;
    }

    return shader;
}
示例#10
0
文件: Ex07.cpp 项目: Aegyr/cg2
void initShader() {
	shaderProgram = glCreateProgram();
	// check if operation failed //
	if (shaderProgram == 0) {
		std::cout << "(initShader) - Failed creating shader program." << std::endl;
		return;
	}

	GLuint vertexShader = loadShaderFile("../shader/texture.vert", GL_VERTEX_SHADER);
	if (vertexShader == 0) {
		std::cout << "(initShader) - Could not create vertex shader." << std::endl;
		deleteShader();
		return;
	}
	GLuint fragmentShader = loadShaderFile("../shader/texture.frag", GL_FRAGMENT_SHADER);
	if (fragmentShader == 0) {
		std::cout << "(initShader) - Could not create vertex shader." << std::endl;
		deleteShader();
		return;
	}

	// successfully loaded and compiled shaders -> attach them to program //
	glAttachShader(shaderProgram, vertexShader);
	glAttachShader(shaderProgram, fragmentShader);

	// mark shaders for deletion after clean up (they will be deleted, when detached from all shader programs) //
	glDeleteShader(vertexShader);
	glDeleteShader(fragmentShader);

	// link shader program //
	glLinkProgram(shaderProgram);

	// get log //
	int logMaxLength;
	glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &logMaxLength);
	char log[logMaxLength];
	int logLength = 0;
	glGetProgramInfoLog(shaderProgram, logMaxLength, &logLength, log);
	if (logLength > 0) {
		std::cout << "(initShader) - Linker log:\n------------------\n" << log << "\n------------------" << std::endl;
	}

	// set address of fragment color output //
	glBindFragDataLocation(shaderProgram, 0, "color");

	// get uniform locations for common variables //
	uniformLocations["projection"] = glGetUniformLocation(shaderProgram, "projection");
	uniformLocations["modelview"] = glGetUniformLocation(shaderProgram, "modelview");

	// material unform locations //
	uniformLocations["material.ambient"] = glGetUniformLocation(shaderProgram, "material.ambient_color");
	uniformLocations["material.diffuse"] = glGetUniformLocation(shaderProgram, "material.diffuse_color");
	uniformLocations["material.specular"] = glGetUniformLocation(shaderProgram, "material.specular_color");
	uniformLocations["material.shininess"] = glGetUniformLocation(shaderProgram, "material.specular_shininess");

	// store the uniform locations for all light source properties
	for (int i = 0; i < 10; ++i) {
		UniformLocation_Light lightLocation;
		lightLocation.ambient_color = glGetUniformLocation(shaderProgram, getUniformStructLocStr("lightSource", "ambient_color", i).c_str());
		lightLocation.diffuse_color = glGetUniformLocation(shaderProgram, getUniformStructLocStr("lightSource", "diffuse_color", i).c_str());
		lightLocation.specular_color = glGetUniformLocation(shaderProgram, getUniformStructLocStr("lightSource", "specular_color", i).c_str());
		lightLocation.position = glGetUniformLocation(shaderProgram, getUniformStructLocStr("lightSource", "position", i).c_str());

		std::stringstream sstr("");
		sstr << "light_" << i;
		uniformLocations_Lights[sstr.str()] = lightLocation;
	}
	uniformLocations["usedLightCount"] = glGetUniformLocation(shaderProgram, "usedLightCount");

	// get texture uniform location //
	uniformLocations["tex"] = glGetUniformLocation(shaderProgram,"tex");
}
示例#11
0
文件: Ex05.cpp 项目: blinrybot/cg2
void initShader() {
  shaderProgram = glCreateProgram();
  // check if operation failed //
  if (shaderProgram == 0) {
    std::cout << "(initShader) - Failed creating shader program." << std::endl;
    return;
  }

  GLuint vertexShader = loadShaderFile("../shader/material_and_light.vert", GL_VERTEX_SHADER);
  if (vertexShader == 0) {
    std::cout << "(initShader) - Could not create vertex shader." << std::endl;
    deleteShader();
    return;
  }
  GLuint fragmentShader = loadShaderFile("../shader/material_and_light.frag", GL_FRAGMENT_SHADER);
  if (fragmentShader == 0) {
    std::cout << "(initShader) - Could not create vertex shader." << std::endl;
    deleteShader();
    return;
  }

  // successfully loaded and compiled shaders -> attach them to program //
  glAttachShader(shaderProgram, vertexShader);
  glAttachShader(shaderProgram, fragmentShader);

  // mark shaders for deletion after clean up (they will be deleted, when detached from all shader programs) //
  glDeleteShader(vertexShader);
  glDeleteShader(fragmentShader);

  // link shader program //
  glLinkProgram(shaderProgram);

  // get log //
  /*int logMaxLength;
  glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &logMaxLength);
  char log[logMaxLength];
  int logLength = 0;
  glGetProgramInfoLog(shaderProgram, logMaxLength, &logLength, log);
  if (logLength > 0) {
    std::cout << "(initShader) - Linker log:\n------------------\n" << log << "\n------------------" << std::endl;
  }*/

  // set address of fragment color output //
  glBindFragDataLocation(shaderProgram, 0, "color");

  // get uniform locations for common variables //
  uniformLocations["projection"] = glGetUniformLocation(shaderProgram, "projection");
  uniformLocations["modelview"] = glGetUniformLocation(shaderProgram, "modelview");
  // TODO: insert the uniform locations for all light and material properties
  // - insert then into the provided map 'uniformLocations' and give them a proper identifier
  // - when accessing a GLSL uniform within a struct (as used in the provided vertex shader),
  //   use the following technique: glGetUniformLocation(shaderID, "structName.propertyName")
  //   So, when having a struct
  //	 struct MyStruct {vec3 MyVector};
  //   and a uniform declaration
  //     uniform MyStruct MyStructUniform;
  //   you can get the location of MyVector by passing the string "MyStructUniform.MyVector" to
  //   glGetUniformLocation(...)
  uniformLocations["lightSource.ambient_color"] = glGetUniformLocation(shaderProgram, "lightSource.ambient_color");
  uniformLocations["lightSource.diffuse_color"] = glGetUniformLocation(shaderProgram, "lightSource.diffuse_color");
  uniformLocations["lightSource.specular_color"] = glGetUniformLocation(shaderProgram, "lightSource.specular_color");
  uniformLocations["lightSource.position"] = glGetUniformLocation(shaderProgram, "lightSource.position");

  uniformLocations["material.ambient_color"] = glGetUniformLocation(shaderProgram, "material.ambient_color");
  uniformLocations["material.diffuse_color"] = glGetUniformLocation(shaderProgram, "material.diffuse_color");
  uniformLocations["material.specular_color"] = glGetUniformLocation(shaderProgram, "material.specular_color");
  uniformLocations["material.specular_shininess"] = glGetUniformLocation(shaderProgram, "material.specular_shininess");
}