OpenGL ES GLSL 编译

ChatGPT 3.5 国内中文镜像站免费使用啦

零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础

零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录  >> OpenGL ES 特效

零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录  >> OpenGL ES 转场

零基础 OpenGL ES 学习路线推荐 :  OpenGL ES 学习目录 >> OpenGL ES 函数

零基础 OpenGL ES 学习路线推荐 :  OpenGL ES 学习目录 >> OpenGL ES GPUImage 使用

零基础 OpenGL ES 学习路线推荐 :  OpenGL ES 学习目录 >> OpenGL ES GLSL 编程


一.GLSL 简介

OpenGL ES 是一个用于嵌入式设备的图形库,它提供了一系列的 API 来创建和渲染3D图形。GLSL(OpenGL Shading Language)是一种编程语言,用于在 OpenGL ES 中编写着色器程序。着色器程序是一种程序,用于在渲染过程中对图形进行着色和处理。在本文中,我们将介绍如何使用 GLSL 编写着色器程序,并将其编译为 OpenGL ES 可用的程序。

GLSL 程序由两个部分组成:顶点着色器和片段着色器。顶点着色器用于对输入的顶点进行处理,而片段着色器用于对像素进行处理。以下是一个简单的顶点着色器程序:

/*******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:OpenGL ES GLSL 编译
//@Time:2021/08/22 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/*******************************************************************************************/

attribute vec4 position;

void main() {
    gl_Position = position;
}

接下来是一个简单的片段着色器程序:

/*******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:OpenGL ES GLSL 编译
//@Time:2021/08/22 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/*******************************************************************************************/

void main() {
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

这个程序没有输入属性,它将一个四维向量赋值给内置变量 gl_FragColor ,这个变量表示像素的颜色。这个向量的前三个分量表示红、绿、蓝三个颜色通道的值,第四个分量表示透明度。


二.GLSL 编译流程

1.创建一个着色器程序对象

使用 glCreateShader 函数创建一个着色器程序对象:

/*******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:OpenGL ES GLSL 编译
//@Time:2023/03/18 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/*******************************************************************************************/


GLuint programObject = glCreateProgram();

2.创建顶点着色器对象和片元着色器对象

使用 glCreateShader 函数创建顶点着色器对象和片元着色器对象:

/*******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:OpenGL ES GLSL 编译
//@Time:2023/03/18 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/*******************************************************************************************/


GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

3.编译着色器程序

使用 glShaderSource 函数将着色器程序源码加载到着色器对象中:

/*******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:OpenGL ES GLSL 编译
//@Time:2023/03/18 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/*******************************************************************************************/


glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);

4.编译着色器对象

使用 glCompileShader 函数将着色器对象编译为可执行代码:

/*******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:OpenGL ES GLSL 编译
//@Time:2023/03/18 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/*******************************************************************************************/

glCompileShader(vertexShader);
glCompileShader(fragmentShader);

5.将着色器对象附加到着色器程序对象上

使用 glAttachShader 函数将顶点着色器对象和片元着色器对象附加到着色器程序对象上:

/*******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:OpenGL ES GLSL 编译
//@Time:2023/03/18 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/*******************************************************************************************/


glAttachShader(programObject, vertexShader);
glAttachShader(programObject, fragmentShader);

6.链接着色器程序

使用 glLinkProgram 函数将着色器程序链接为可执行程序:

/*******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:OpenGL ES GLSL 编译
//@Time:2023/03/18 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/*******************************************************************************************/

glLinkProgram(programObject);

7.使用着色器程序

使用 glUseProgram 函数将着色器程序设置为当前使用的程序:

/*******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:OpenGL ES GLSL 编译
//@Time:2023/03/18 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/*******************************************************************************************/

GLuint glCreateShader(GLenum type);

三.GLSL 编译流程代码演示

/*******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:OpenGL ES GLSL 编译
//@Time:2023/03/18 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/*******************************************************************************************/


#include <stdio.h>
#include <stdlib.h>
#include <GLES2/gl2.h>

GLuint LoadShader(GLenum type, const char *shaderSrc) {
    GLuint shader;
    GLint compiled;

    // Create the shader object
    shader = glCreateShader(type);

    if (shader == 0) {
        printf("Error creating shader.\n");
        return 0;
    }

    // Load the shader source
    glShaderSource(shader, 1, &shaderSrc, NULL);

    // Compile the shader
    glCompileShader(shader);

    // Check the compile status
    glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);

    if (!compiled) {
        GLint infoLen = 0;

        glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);

        if (infoLen > 1) {
            char *infoLog = (char*)malloc(sizeof(char) * infoLen);

            glGetShaderInfoLog(shader, infoLen, NULL, infoLog);
            printf("Error compiling shader:\n%s\n", infoLog);

            free(infoLog);
        }

        glDeleteShader(shader);
        return 0;
    }

    return shader;
}

GLuint CreateProgram(const char *vertexShaderSrc, const char *fragmentShaderSrc) {
    GLuint vertexShader, fragmentShader, program;
    GLint linked;

    // Load the vertex/fragment shaders
    vertexShader = LoadShader(GL_VERTEX_SHADER, vertexShaderSrc);
    if (vertexShader == 0) {
        return 0;
    }

    fragmentShader = LoadShader(GL_FRAGMENT_SHADER, fragmentShaderSrc);
    if (fragmentShader == 0) {
        glDeleteShader(vertexShader);
        return 0;
    }

    // Create the program object
    program = glCreateProgram();

    if (program == 0) {
        printf("Error creating program object.\n");
        return 0;
    }

    // Attach the shaders to the program object
    glAttachShader(program, vertexShader);
    glAttachShader(program, fragmentShader);

    // Link the program
    glLinkProgram(program);

    // Check the link status
    glGetProgramiv(program, GL_LINK_STATUS, &linked);

    if (!linked) {
        GLint infoLen = 0;

        glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLen);

        if (infoLen > 1) {
            char *infoLog = (char*)malloc(sizeof(char) * infoLen);

            glGetProgramInfoLog(program, infoLen, NULL, infoLog);
            printf("Error linking program:\n%s\n", infoLog);

            free(infoLog);
        }

        glDeleteProgram(program);
        return 0;
    }

    // Free up no longer needed shader resources
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);

    return program;
}

int main() {
    const char *vertexShaderSrc =
        "attribute vec4 vPosition;\n"
        "void main() {\n"
        "   gl_Position = vPosition;\n"
        "}\n";

    const char *fragmentShaderSrc =
        "precision mediump float;\n"
        "void main() {\n"
        "   gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n"
        "}\n";

    GLuint programObject;
    GLint linked;

    // Create the program object
    programObject = CreateProgram(vertexShaderSrc, fragmentShaderSrc);

    if (programObject == 0) {
        printf("Error creating program object.\n");
        return 1;
    }

    printf("Program object created successfully.\n");

    // Set the current program object
    glUseProgram(programObject);

    printf("Program object set as current.\n");

    return 0;
}

在这个例子中,我们定义了一个简单的顶点着色器和片元着色器,并使用 CreateProgram 函数将它们编译成可执行程序。如果编译出错,将打印出错信息。

注意,在使用 OpenGL ES 2.0 GLSL 编写着色器程序时,需要使用 precision qualifier 来限定变量的精度,否则会导致编译错误。在本例中,我们使用” precision mediump float “来限定片元着色器中的变量精度。


四.GLSL 编译流程案例

1.IOS Object-C 版本

IOS Object-C 图像 lookup 色彩调整:源码下载

图片[1]-OpenGL ES GLSL 编译 - 猿说编程

2.Windows OpenGL ES 版本

Windows OpenGL ES 图像 lookup 色彩调整:源码下载

图片[2]-OpenGL ES GLSL 编译 - 猿说编程

3.Windows OpenGL 版本

Windows OpenGL 图像 lookup 色彩调整:源码下载

图片[3]-OpenGL ES GLSL 编译 - 猿说编程

4.MAC QT OpenGL 版本

MAC QT OpenGL 图像 lookup 色彩调整:源码下载

图片[4]-OpenGL ES GLSL 编译 - 猿说编程

五.猜你喜欢

  1. OpenGL ES 简介
  2. OpenGL ES 版本介绍
  3. OpenGL ES 2.0 和 3.0区别
  4. OpenGL ES 名词解释(一)
  5. OpenGL ES 名词解释(二)
  6. OpenGL ES GLSL 着色器使用过程
  7. OpenGL ES EGL 简介
  8. OpenGL ES EGL 名词解释
  9. OpenGL ES EGL eglGetDisplay
  10. OpenGL ES EGL eglInitialize
  11. OpenGL ES EGL eglGetConfigs
  12. OpenGL ES EGL eglChooseConfig
  13. OpenGL ES EGL eglGetError
  14. OpenGL ES EGL eglCreateContext
  15. OpenGL ES EGL eglCreateWindowSurface
  16. OpenGL ES EGL eglCreatePbufferSurface
  17. OpenGL ES EGL eglMakeCurrent
  18. OpenGL ES EGL eglSwapBuffer
  19. OpenGL ES EGL eglDestroySurface
  20. OpenGL ES EGL eglDestroyContext
  21. OpenGL ES EGL eglQueryContext
  22. OpenGL ES EAGLContext 和 EGLContext
  23. OpenGL ES OpenGL WebGL EGL WGL 区别
  24. OpenGL ES freeglut 下载和使用
  25. OpenGL ES glew 下载和使用
  26. OpenGL ES glut 下载和使用
  27. OpenGL ES glfw 下载和使用
  28. OpenGL ES glad 下载和使用
  29. OpenGL ES glut glew glfw glad freeglut
  30. OpenGL ES google angle
  31. OpenGL Windows 搭建环境(MFC版本)
  32. OpenGL ES Windows 搭建环境(MFC版本)
  33. OpenGL ES 版本检测
  34. OpenGL GLES 和 GLSL
  35. OpenGL ES 获取最大纹理尺寸 GL_MAX_TEXTURE_SIZE
  36. OpenGL ES 获取最多纹理单元数量 GL_MAX_TEXTURE_IMAGE_UNITS
  37. OpenGL ES 纹理采样的数量限制
  38. OpenGL ES 视口宽高限制 GL_MAX_VIEWPORT_DIMS
  39. OpenGL ES 笛卡尔坐标系之纹理坐标和顶点坐标
  40. OpenGL ES 查看显卡信息
  41. OpenGL ES 正交投影和透视投影
  42. OpenGL ES GLSL 简介
  43. OpenGL ES GLSL 编译
ChatGPT 3.5 国内中文镜像站免费使用啦
© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容