FFmpeg4.3系列之52:Android OpenGL实现3D画图及抛骰子案例实战

jhuh · · 54 次点击 · · 开始浏览    

FFmpeg4.3系列之52:Android OpenGL实现3D画图及抛骰子案例实战

获课:bcwit.top/13704/

获取ZY↑↑方打开链接↑↑

OpengGL实现点线面代码分析

OpenGL(Open Graphics Library)是一个跨平台的图形API,广泛用于3D和2D图形渲染。要使用OpenGL实现点、线、面的基本绘制,你需要了解几个关键概念和技术:设置OpenGL上下文、加载着色器程序、定义顶点数据以及调用绘制命令。下面我们将通过一个简单的例子来分析如何用OpenGL绘制点、线和面。

1. 设置OpenGL环境

首先确保你的开发环境中已经安装了OpenGL库,并且配置好了一个窗口系统,如GLFW或SDL。这里我们以GLFW为例:

cpp深色版本#include <GL/glew.h>#include <GLFW/glfw3.h>// 初始化GLFW并创建窗口if (!glfwInit()) {    // 处理初始化失败的情况}GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", NULL, NULL);glfwMakeContextCurrent(window);glewInit(); // 初始化GLEW

2. 编写着色器程序

接下来编写顶点着色器和片段着色器,它们将被用来处理每个顶点的位置和颜色信息:

Vertex Shader (vertex_shader.glsl):

glsl深色版本#version 330 corelayout(location = 0) in vec3 aPos; // 顶点位置layout(location = 1) in vec3 aColor; // 顶点颜色out vec3 ourColor;void main() {    gl_Position = vec4(aPos, 1.0);    ourColor = aColor;}

Fragment Shader (fragment_shader.glsl):

glsl深色版本#version 330 corein vec3 ourColor;out vec4 FragColor;void main() {    FragColor = vec4(ourColor, 1.0);}

编译这些着色器并在C++代码中链接成一个着色器程序:

cpp深色版本GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);//  加载并编译vertex_shader源码 GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);//  加载并编译fragment_shader源码 GLuint shaderProgram = glCreateProgram();glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);// 清理不再需要的对象glDeleteShader(vertexShader);glDeleteShader(fragmentShader);

3. 定义顶点数据

为点、线、面准备顶点数据。这里我们展示一个简单的三角形的例子:

cpp深色版本float vertices[] = {     0.5f, -0.5f, 0.0f,  // 右下角    -0.5f, -0.5f, 0.0f,  // 左下角     0.0f,  0.5f, 0.0f   // 顶部};unsigned int 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, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);// 注意 颜色属性在这里没有被绑定,因为我们的顶点数组中只有位置信息。// 如果你也想传递颜色信息,你需要扩展vertices数组,并相应地调整glVertexAttribPointer调用。

4. 绘制命令

最后,在主循环中调用glDrawArraysglDrawElements函数来进行实际的绘制:

cpp深色版本while (!glfwWindowShouldClose(window)) {    // 输入处理        // 渲染指令    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);    glClear(GL_COLOR_BUFFER_BIT);    // 使用着色器程序    glUseProgram(shaderProgram);        // 绑定VAO    glBindVertexArray(VAO);        // 绘制点、线或面    // 对于点,使用GL_POINTS;对于线,使用GL_LINES或GL_LINE_STRIP;    // 对于面(例如三角形),使用GL_TRIANGLES    glDrawArrays(GL_TRIANGLES, 0, 3); // 这里我们画一个三角形        // 交换缓冲区    glfwSwapBuffers(window);    glfwPollEvents();}

总结

上述代码展示了如何使用现代OpenGL API来绘制基本几何形状。你可以根据需要修改顶点数据、着色器逻辑以及绘制模式(如GL_POINTS, GL_LINES, GL_TRIANGLES等)来实现不同类型的图形元素。此外,还可以添加纹理映射、光照效果等功能来增强视觉表现力。随着对OpenGL理解的加深,你还可以探索更多高级特性,如帧缓冲对象、计算着色器等。


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

54 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传