OpenGL es 封装shader载入编译链接

来源:互联网 发布:h5页面分享到朋友圈js 编辑:程序博客网 时间:2024/06/11 00:55
static void CheckGLError(const char* printMsg){    for (GLint error = glGetError(); error; error = glGetError())    {        ALog_E("after %s() glError (0x%x)", printMsg, error);    }}/** * Compile a shader * shaderType is GL_VERTEX_SHADER or GL_FRAGMENT_SHADER */static GLuint LoadShader(GLenum shaderType, const char* shaderSource){// Create the shader objectGLuint shader = glCreateShader(shaderType);if (shader == 0){CheckGLError("glCreateShader");return shader;}// Load the shader sourceglShaderSource(shader, 1, &shaderSource, NULL);// Compile the shaderglCompileShader(shader);GLint compiled;// Check the compile statusglGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);if (!compiled){GLint infoLen;glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);if (infoLen != 0){char buf[infoLen];glGetShaderInfoLog(shader, infoLen, NULL, buf);ALog_E("Could not compile shader %d:%s", shaderType, buf);glDeleteShader(shader);return 0;}}    return shader;}/** * Load vertex and fragment shader, create a program object, link program */static GLuint LoadProgram(const char* vertexSource, const char* fragmentSource){GLuint program;// Load the vertex shadersGLuint vertexShader = LoadShader(GL_VERTEX_SHADER, vertexSource);if (vertexShader == 0){return 0;}// Load the fragment shadersGLuint fragmentShader = LoadShader(GL_FRAGMENT_SHADER, fragmentSource);if (fragmentShader == 0){return 0;}// Create the program objectprogram = glCreateProgram();if (program == 0){CheckGLError("glCreateProgram");return 0;}glAttachShader(program, vertexShader);glAttachShader(program, fragmentShader);// Link the programglLinkProgram(program);GLint linkStatus;// Check the link statusglGetProgramiv(program, GL_LINK_STATUS, &linkStatus);if (!linkStatus){GLint bufLength;glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength);if (bufLength != 0){char buf[bufLength];glGetProgramInfoLog(program, bufLength, NULL, buf);ALog_E("Could not link program: %s", buf);}glDeleteProgram(program);return 0;}// Free up no longer needed shader resourcesglDeleteShader(vertexShader);glDeleteShader(fragmentShader);return program;}


可以载入顶点和片段shader,并编译附加到Program上,最后返回链接后的Program, 开箱即用,支持错误输出。

1 0
原创粉丝点击