零基础 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 编程
前言
OpenGL(Open Graphics Library)是一个跨平台的图形编程接口,它提供了一系列函数,可以实现 2D 和 3D 图形的创建、渲染和处理。OpenGL 绘制流程如下:
一.初始化OpenGL环境
/*******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:OpenGL 绘制流程
//@Time:2023/03/11 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/*******************************************************************************************/
// 创建窗口和OpenGL上下文
GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL Window", NULL, NULL);
if (window == NULL)
{
printf("Failed to create GLFW window\n");
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
// 初始化GLEW库
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK)
{
printf("Failed to initialize GLEW\n");
return -1;
}
二.定义图形数据
/*******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:OpenGL 绘制流程
//@Time:2023/03/11 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/*******************************************************************************************/
// 定义顶点数组
GLfloat vertices[] = {
// 位置 // 颜色
-0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f
};
// 创建顶点缓冲对象
GLuint VBO, VAO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 设置顶点属性指针
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(1);
三.加载纹理
/*******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:OpenGL 绘制流程
//@Time:2023/03/11 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/*******************************************************************************************/
// 加载纹理
int width, height;
unsigned char* image = SOIL_load_image("container.jpg", &width, &height, 0, SOIL_LOAD_RGB);
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
glGenerateMipmap(GL_TEXTURE_2D);
SOIL_free_image_data(image);
glBindTexture(GL_TEXTURE_2D, 0);
四.编写着色器程序
/*******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:OpenGL 绘制流程
//@Time:2023/03/11 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/*******************************************************************************************/
// 顶点着色器
const GLchar* vertexSource =
"#version 330 core\n"
"layout (location = 0) in vec3 position;\n"
"layout (location = 1) in vec3 color;\n"
"layout (location = 2) in vec2 texCoord;\n"
"out vec3 Color;\n"
"out vec2 TexCoord;\n"
"uniform mat4 transform;\n"
"void main()\n"
"{\n"
" gl_Position = transform * vec4(position, 1.0f);\n"
" Color = color;\n"
" TexCoord = vec2(texCoord.x, 1.0f - texCoord.y);\n"
"}\0";
// 片元着色器
const GLchar* fragmentSource =
"#version 330 core\n"
"in vec3 Color;\n"
"in vec2 TexCoord;\n"
"out vec4 outColor;\n"
"uniform sampler2D ourTexture;\n"
"void main()\n"
"{\n"
" outColor = texture(ourTexture, TexCoord) * vec4(Color, 1.0f);\n"
"}\n\0";
// 编译着色器程序
GLuint vertexShader, fragmentShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexSource, NULL);
glCompileShader(vertexShader);
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
glCompileShader(fragmentShader);
// 创建着色器程序并链接
GLuint shaderProgram;
shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
五.绑定顶点数组和着色器程序
/*******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:OpenGL 绘制流程
//@Time:2023/03/11 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/*******************************************************************************************/
// 使用着色器程序和顶点数组
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glBindTexture(GL_TEXTURE_2D, texture);
六.执行绘制命令
/*******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:OpenGL 绘制流程
//@Time:2023/03/11 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/*******************************************************************************************/
// 渲染循环
while (!glfwWindowShouldClose(window))
{
// 清空颜色缓冲区
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 创建变换矩阵
glm::mat4 transform;
transform = glm::translate(transform, glm::vec3(0.5f, -0.5f, 0.0f));
transform = glm::rotate(transform, (GLfloat)glfwGetTime() * 50.0f, glm::vec3(0.0f, 0.0f, 1.0f));
GLint transformLoc = glGetUniformLocation(shaderProgram, "transform");
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(transform));
// 绘制图形
glDrawArrays(GL_TRIANGLES, 0, 3);
// 交换缓冲区并检查事件
glfwSwapBuffers(window);
glfwPollEvents();
}
七.完整代码
以上是一个 glfw + OpenGL 绘制一个三角形并旋转的示例代码。
八.OpenGL 实战演示
1.Windows OpenGL 色阶调节:源码下载
2.Windows 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 编译
- OpenGL ES glDrawArrays 函数
- OpenGL ES glDrawArrays 崩溃
- OpenGL ES glDrawArray 和 glDrawElements 用法区别
- OpenGL 绘制流程
- OpenGL ES 绘制流程
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容