コード例 #1
0
ShaderObject::ShaderObject(char *vertexfile, char *fragmentfile)
{
	printf("%s %s\n", vertexfile, fragmentfile);
	program = glCreateProgram();
	vertexShader = glCreateShader(GL_VERTEX_SHADER);
	fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
	char** vertexShaderSource = loadShaderSource(vertexfile);
	char** fragmentShaderSource = loadShaderSource(fragmentfile);
	glShaderSource(vertexShader, 1, vertexShaderSource, NULL);
	glShaderSource(fragmentShader, 1, fragmentShaderSource, NULL);
	freeShaderSource(vertexShaderSource);
	freeShaderSource(fragmentShaderSource);
	glCompileShader(vertexShader);
	glCompileShader(fragmentShader);
	shaderLog(vertexShader);
	shaderLog(fragmentShader);
	glAttachShader(program, vertexShader);
	glAttachShader(program, fragmentShader);
	glLinkProgram(program);
}
コード例 #2
0
ファイル: shader.C プロジェクト: jellymann/graphics-c11
GLuint Shader::loadShader(const char* file, GLenum type)
{
  GLuint handle = glCreateShader(type);

  ifstream in(file);
  stringstream buffer;
  buffer << in.rdbuf();
  string content(buffer.str());
  in.close();

  const char * source = content.c_str();
  glShaderSource(handle, 1, &source, NULL);
  glCompileShader(handle);

  shaderLog(handle);

  return handle;
}
コード例 #3
0
GLuint ShaderLoader::loadShaderFromResources(char* vertShaderName, char* fragShaderName)
{
    GLuint linkedProgram;

    char combinedName[strlen(vertShaderName)+strlen(fragShaderName)];
    strncpy(combinedName, vertShaderName, sizeof(combinedName));
    strcat(combinedName, fragShaderName);

    linkedProgram = loadedShaders[combinedName];

    if (linkedProgram)
    {
        return linkedProgram;
    }
    ResourceLoader loader;

    const char* vFilePath = loader.getFilePathToResource(vertShaderName);
    assert(vFilePath);

    const char* fFilePath = loader.getFilePathToResource(fragShaderName);
    assert(fFilePath);

    size_t vFileLen = 0;
    const GLchar* vertSource = loader.getContentsOfResourceAtPath(vFilePath, vFileLen);

    size_t fFileLen = 0;
    const GLchar* fragSource = loader.getContentsOfResourceAtPath(fFilePath, fFileLen);

    int logLen;
    GLuint vHdl, fHdl;

    vHdl = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vHdl, 1, &vertSource, NULL);
    glCompileShader(vHdl);

    GLint res = GL_FALSE;
    glGetShaderiv( vHdl, GL_COMPILE_STATUS, &res );
    if( res == GL_FALSE ) {
        glGetShaderiv(vHdl, GL_INFO_LOG_LENGTH, &logLen);
        if ( logLen > 0 )
        {
            char error[logLen];
            glGetShaderInfoLog(vHdl, logLen, NULL, &error[0]);
            printf("glCompileShader %s : %s\n", vFilePath, error);
        }
    }

    fHdl = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fHdl, 1, &fragSource, NULL);
    glCompileShader(fHdl);

    res = GL_FALSE;
    glGetShaderiv( fHdl, GL_COMPILE_STATUS, &res );
    if( res == GL_FALSE ) {
        glGetShaderiv(fHdl, GL_INFO_LOG_LENGTH, &logLen);
        if ( logLen > 0 )
        {
            char error[logLen];
            glGetShaderInfoLog(fHdl, logLen, NULL, &error[0]);
            printf("glCompileShader %s : %s\n", fFilePath, error);
        }
    }

    linkedProgram = glCreateProgram();
    glAttachShader(linkedProgram, vHdl);
    glAttachShader(linkedProgram, fHdl);
    //glBindFragDataLocation(linkedProgram, 0, "fragCol");

    glLinkProgram(linkedProgram);

    res = GL_FALSE;
    glGetProgramiv(linkedProgram, GL_LINK_STATUS, &res);
    //if ( res == GL_FALSE )
    {
        GLint logSize;
        glGetProgramiv( linkedProgram, GL_INFO_LOG_LENGTH, &logSize );

        if (logSize > 0)
        {
            std::vector <char> shaderLog(logSize);
            GLsizei written;
            glGetProgramInfoLog(linkedProgram, logSize, &written, shaderLog.data());
            printf("%s\n",shaderLog.data());
        }

        if ( res == GL_FALSE )
        {
            glDeleteProgram(linkedProgram);
            printf("GLSL program build failed : %s : %d\n",__FILE__,__LINE__);
        }
    }

    loadedShaders[combinedName] = linkedProgram;

    return linkedProgram;
}