零基础 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 色彩调整:源码下载
2.Windows OpenGL ES 版本
Windows OpenGL ES 图像 lookup 色彩调整:源码下载
3.Windows OpenGL 版本
Windows OpenGL 图像 lookup 色彩调整:源码下载
4.MAC QT OpenGL 版本
MAC QT OpenGL 图像 lookup 色彩调整:源码下载
五.猜你喜欢
- OpenGL ES 简介
- OpenGL ES 版本介绍
- OpenGL ES 2.0 和 3.0区别
- OpenGL ES 名词解释(一)
- OpenGL ES 名词解释(二)
- OpenGL ES GLSL 着色器使用过程
- OpenGL ES EGL 简介
- OpenGL ES EGL 名词解释
- OpenGL ES EGL eglGetDisplay
- OpenGL ES EGL eglInitialize
- OpenGL ES EGL eglGetConfigs
- OpenGL ES EGL eglChooseConfig
- OpenGL ES EGL eglGetError
- OpenGL ES EGL eglCreateContext
- OpenGL ES EGL eglCreateWindowSurface
- OpenGL ES EGL eglCreatePbufferSurface
- OpenGL ES EGL eglMakeCurrent
- OpenGL ES EGL eglSwapBuffer
- OpenGL ES EGL eglDestroySurface
- OpenGL ES EGL eglDestroyContext
- OpenGL ES EGL eglQueryContext
- OpenGL ES EAGLContext 和 EGLContext
- OpenGL ES OpenGL WebGL EGL WGL 区别
- OpenGL ES freeglut 下载和使用
- OpenGL ES glew 下载和使用
- OpenGL ES glut 下载和使用
- OpenGL ES glfw 下载和使用
- OpenGL ES glad 下载和使用
- OpenGL ES glut glew glfw glad freeglut
- OpenGL ES google angle
- OpenGL Windows 搭建环境(MFC版本)
- OpenGL ES Windows 搭建环境(MFC版本)
- OpenGL ES 版本检测
- OpenGL GLES 和 GLSL
- OpenGL ES 获取最大纹理尺寸 GL_MAX_TEXTURE_SIZE
- OpenGL ES 获取最多纹理单元数量 GL_MAX_TEXTURE_IMAGE_UNITS
- OpenGL ES 纹理采样的数量限制
- OpenGL ES 视口宽高限制 GL_MAX_VIEWPORT_DIMS
- OpenGL ES 笛卡尔坐标系之纹理坐标和顶点坐标
- OpenGL ES 查看显卡信息
- OpenGL ES 正交投影和透视投影
- OpenGL ES GLSL 简介
- OpenGL ES GLSL 编译
暂无评论内容