本站提倡有节制游戏,合理安排游戏时间,注意劳逸结合。

【源码天空 模仿cad】【相亲管理系统源码】【号卡联盟源码】opengl源码阅读

2024-11-24 23:45:11 来源:热点 分类:热点

1.OpenGL自学笔记(四)(着色器)
2.用Python和OpenGL探索数据可视化(基础篇)- OpenGL简介及演化
3.opengl超级宝典和OpenGL编程指南哪个适合新手哪个好
4.OpenGL学习之旅(6)---imgui库使用
5.opengl-01:源码编译
6.用Python和OpenGL探索数据可视化(基础篇)- 重构代码组织OpenGL核心对象包pygl

opengl源码阅读

OpenGL自学笔记(四)(着色器)

       这一章节没有太多新内容,源码阅读主要是源码阅读对之前内容的复述。如果你熟悉shadertoy,源码阅读那么这一部分可能不需要过多解释。源码阅读更建议阅读资深人士的源码阅读教程。

       着色器(Shader)是源码阅读源码天空 模仿cad一种运行在GPU上的小程序,为图形渲染管道的源码阅读特定部分提供支持。从基本意义上讲,源码阅读着色器是源码阅读一种将输入转换为输出的程序。着色器非常独立,源码阅读它们之间不能相互通信,源码阅读唯一的源码阅读沟通方式是通过输入和输出。

       着色器使用GLSL(类似C语言)编写。源码阅读除了GLSL,源码阅读还有HLSL、源码阅读CG等其他语言。GLSL是为图形计算专门设计的,包含针对向量和矩阵的有用特性。

       以下是着色器的基础结构。

       在顶点着色器中,每个输入变量被称为顶点属性。可声明的顶点属性数量有限,通常由硬件决定。一般至少有个(包含4个分量)的顶点属性可用。

       GLSL包含C等其他语言的大部分默认基础类型:int、float、double、unit和bool。同时还有两种容器类型:向量(Vector)和矩阵(Matrix)。

       GLSL中的向量是一个可以包含最高4个分量的容器,分量类型是基础类型之一。大多数情况下,使用vecn就足够了。一个拥有4个分量的向量可以通过点访问符号进行访问,分别使用.x、.y、.z和.w来获取第1~4个分量。对于颜色,则使用rgba进行访问,同理对纹理坐标则使用stpq访问相同的分量。

       重组是向量分量的一种灵活用法,允许使用原来向量的分量任意组合形成一个新的向量。但是不允许从vec2中获取.z元素,即2维向量不能获取第四个分量。也可以把一个向量作为一个参数传给不同的相亲管理系统源码向量构造函数。

       着色器是独立的小程序,但也是整体的一部分。因此,每个着色器都有输入和输出,以便进行数据交流和传递。GLSL定义了in和out关键字专门来实现这个目的。每个着色器使用这两个关键字设定输入和输出,只要一个输出变量与下一个着色器阶段的输入匹配,它就会传递下去。但在顶点和片段着色器中会有所不同。

       顶点着色器应该接收特殊形式的输入,否则会效率低下。顶点着色器的输入特殊在于它直接从顶点数据中接收输入。为了定义顶点数据该如何管理,使用location这一元数据指定输入变量,这样我们才可以在CPU上配置顶点属性。我们已经在前面的教程中看过这个了,layout (location = 0)。顶点着色器需要为它的输入提供一个额外的layout标识,以便将其链接到顶点数据。也可以通过在OpenGL代码中使用glGetAttribLocation查询属性位置值(Location)。

       另一个例外是片段着色器,它需要一个vec4颜色输出变量,因为片段着色器需要生成一个最终输出的颜色。如果你在片段着色器中没有定义输出颜色,OpenGL会把你的物体渲染为黑色(或白色)。

       因此,如果我们打算从一个着色器向另一个着色器发送数据,我们必须在发送方着色器中声明一个输出,在接收方着色器中声明一个类似的输入。当类型和名字都一样的时候,OpenGL就会把两个变量链接到一起,它们之间就能发送数据了(这是在链接程序对象时完成的)。

       uniform是一种从CPU中的应用向GPU中的着色器发送数据的方式,但uniform和顶点属性有些不同。首先,uniform是全局的(Global)。全局意味着uniform变量必须在每个着色器程序对象中都是独一无二的,而且它可以被着色器程序的任意着色器在任意阶段访问。其次,无论你把uniform值设置成什么,uniform会一直保存它们的数据,直到它们被重置或更新。

       我们可以在一个着色器中添加uniform关键字至类型和变量名前来声明一个GLSL的号卡联盟源码uniform。从此处开始我们就可以在着色器中使用新声明的uniform了。通过uniform设置三角形的颜色:

       这里在片段着色器中声明了一个uniform的四维向量作为最终颜色输出。因为uniform是全局变量,可以在任何着色器中定义它们,而无需通过顶点着色器作为中介,所以不用在顶点着色器中定义这个uniform。

       如果声明了一个uniform却在GLSL代码中没用过,编译器会静默移除这个变量,导致最后编译出的版本中并不会包含它,这可能导致几个非常麻烦的错误!

       这个uniform现在还是空的;我们还没有给它添加任何数据,所以下面我们就做这件事。我们首先需要找到着色器中uniform属性的索引/位置值。当我们得到uniform的索引/位置值后,我们就可以更新它的值了。这次我们不去给像素传递单独一个颜色,而是让它随着时间改变颜色:

       glfwGetTime()获取程序运行秒数,使用sin得到[-1,1]区间的值,最后做一个[0-1]区间的规范化,储存为一个变量。用glGetUniformLocation查询uniform变量的位置值。参数就是着色器程序对象和uniform变量名。如果返回-1,意味着没有找到。最后是通过glUniform4f函数设置uniform变量的值(根据位置值设置变量)第一个参数是位置值,后面就是设置的值了。

       查询uniform地址不要求你之前使用过着色器程序,但是更新一个uniform之前你必须先激活程序,因为它是在当前激活的着色器程序中设置uniform的。

       现在写一个着色器类用来读取硬盘中的着色器文件,编译并链接它们。

       这里把所有的着色器类都放在头文件中。第一行的包含是用来防止链接冲突的,once意思是该头文件只被包含一次。着色器类储存了着色器程序的ID。它的构造函数需要顶点和片段着色器源代码的文件路径,这样可以把着色器源码的文本文件储存在硬盘上。use用来激活着色器程序。所有的set…函数能够查询一个uniform的位置值并设置它的值。

       这里我创建了一个新的CPP文件用来定义着色器头文件中的声明内容。

       构造函数中是处理着色器文件的读取并编译和链接着色器。而检查编译和链接的函数如下。除此之外还有激活程序,自己额外加了个删除的吉林打车app源码程序。

       uniform的setter函数:

       创建一个着色器对象,读取文件路径即可。

       有可能这一步会出一点问题,不知道具体包含路径。我这里的../表示上级目录,这里是返回到解决方案文件夹了。

       其实可以在构造函数中的catch中打印当前输入的路径,就可以知道路径与资源文件夹中路径是否一致。

       最后在渲染循环中渲染:

用Python和OpenGL探索数据可视化(基础篇)- OpenGL简介及演化

       在年三十,祝福各位知友在甲辰龙年身体健康、万事如意!

       OpenGL,即开放图形库,是应用于图形硬件的API。它由数百个子程序和函数构成,旨在帮助程序员指定着色器程序、对象及操作,以生成高质量图形图像,特别是三维对象的彩色图像。

       OpenGL成为行业标准,因其独立于窗口系统和操作系统,使软件开发者在各种设备上(如手机、平板、台式机、笔记本、工作站及超级计算机)能够开发高性能、视觉效果引人注目的二维、三维图形软件。这些应用覆盖了如CAD、CAE、科学可视化、内容创作、能源、娱乐、游戏开发、制造、医疗和虚拟现实等多个领域。

       Khronos Group自年起负责OpenGL API规范的制定,截至年2月,官方已发布个版本。对于OpenGL的详细发展历史,可访问Khronos Group的官方网站。OpenGL使用的渲染管线和核心对象自4.3版本后基本稳定,如图所示。sim卡分销源码

       考虑到计算机图形硬件的迅速发展,Khronos Group从年起开始开发新一代OpenGL,即Vulkan。Vulkan是一种比OpenGL更接近硬件的低级API,可直接控制GPU,从而在各种硬件上实现更高效的渲染和更好的性能。

       掌握OpenGL中的渲染管线、着色器及GLSL对学习和应用Vulkan仍然有所帮助。

       如需查阅更多详细信息,可参考以下链接:

       registry.khronos.org/Op...

       khronos.org/opengl/

       khronos.org/opengl/wiki...

       本系列文章的源代码已上传至Gitee。

       以下为文章系列摘要:

       1. 《用Python和OpenGL探索数据可视化(基础篇)- 你好,窗口!》

       2. 《用Python和OpenGL探索数据可视化(基础篇)- 你好,OpenGL!》

       3. 《用Python和OpenGL探索数据可视化(基础篇)- 你好,ImGui!》

       4. 《用Python和OpenGL探索数据可视化(基础篇)- 你好,小不点!》

       5. 《用Python和OpenGL探索数据可视化(基础篇)- 重构代码“你好,小不点!”》

       6. 《用Python和OpenGL探索数据可视化(基础篇)- “你好,线段!”》

       7. 《用Python和OpenGL探索数据可视化(基础篇)- 重构代码组织OpenGL核心对象包pygl》

       8. 《用Python和OpenGL探索数据可视化(基础篇)- 你好,三角形!》

       9. 《用Python和OpenGL探索数据可视化(基础篇)- 改进OpenGL程序Program类》

       . 《用Python和OpenGL探索数据可视化(基础篇)- 你好,矩形!》

       . 《用Python和OpenGL探索数据可视化(基础篇)- 完善pygl增加索引缓存对象EBO》

       . 《用Python和OpenGL探索数据可视化(基础篇)- 你好,纹理!》

       . 《用Python和OpenGL探索数据可视化(基础篇)- 完善pygl增加OpenGL二维纹理对象》

       . 《用Python和OpenGL探索数据可视化(基础篇)- 细说纹理环绕》

       . 《用Python和OpenGL探索数据可视化(基础篇)- 细说纹理过滤》

       . 《用Python和OpenGL探索数据可视化(基础篇)- 处理键盘和鼠标事件》

       . 《用Python和OpenGL探索数据可视化(三维篇)- 你好,坐标轴》

       . 《用Python和OpenGL探索数据可视化(三维篇)- 用立方体体验模型矩阵》

       . 《用Python和OpenGL探索数据可视化(三维篇)- 创建三维坐标轴类和立方体类》

       . 《用Python和OpenGL探索数据可视化(三维篇)- 与照相机“共舞”》

       . 《用Python和OpenGL探索数据可视化(三维篇)- 创建照相机类》

       . 《用Python和OpenGL探索数据可视化(三维篇)- 四元数和轨迹球照相机》

opengl超级宝典和OpenGL编程指南哪个适合新手哪个好

       本文将对比分析两款广受欢迎的OpenGL学习书籍,旨在帮助新手选择最适合自己的学习资源。两款书籍分别为《OpenGL超级宝典》第5版和《OpenGL编程指南》。

       对于新手而言,选择书籍时,应考虑书籍的深度、内容覆盖和错误信息的准确性。《OpenGL编程指南》(红宝书)和《OpenGL超级宝典》(蓝宝书)是两个不错的选择。红宝书侧重于原理讲解,适合深入理解OpenGL内部机制的学习者。蓝宝书则更注重实际应用和案例分析,适合实践操作较多的读者。

       关于《OpenGL超级宝典》第5版在Visual C++6.0环境下的编译使用问题,理论上,如果你正确配置了所需版本的OpenGL、GLUT和GLAUX等库,源代码应该可以在Visual C++6.0上编译使用。配置环境是学习者自行决定的。

       对于新手在学习OpenGL时选择书籍,根据个人需求和学习目的,选择《OpenGL编程指南》可能更有利于构建坚实的基础。此书深入浅出,涵盖OpenGL的原理和应用,适合从零开始学习的初学者。

       《OpenGL超级宝典》和《OpenGL编程指南》都是针对OpenGL编程的优秀学习资源。选择哪一本,关键在于你的学习需求和目标。若偏向理论理解,红宝书是不错的选择;若侧重实践操作,蓝宝书可能更适合你。

OpenGL学习之旅(6)---imgui库使用

       在OpenGL学习之旅的第六部分,我们将探索如何将imgui库集成到我们的项目中,为OpenGL程序增添交互性。首先,我们从GitHub上克隆imgui库的源码,并确保将其编译成动态库以便于链接至可执行程序。在CMakeLists.txt文件中,我们需添加编译imgui库中源文件的路径,同时确保链接到glfw库和opengl库。

       在我们的main函数中,包含imgui头文件后,我们进行初始化。随后,在渲染循环中创建imgui窗口帧,并显示默认窗口。在渲染部分,我们需要更新imgui窗口,以实现动态交互。最后,在程序结束时释放imgui资源。

       通过imgui窗口,我们可以动态调试3D空间变换。首先定义用于动态调试的变量,如旋转轴和旋转角度,以及平移向量,用于调整透视投影变换中的视场角。在渲染循环中,将这些变量添加至imgui窗口中,以便用户能够实时观察3D变换效果。运行程序后,用户能够通过调节参数,如帧率,动态观察3D空间变换。

       本文总结了使用imgui进行动态调试参数的流程,并提供了main.cpp与CMakeLists.txt的完整源码。

opengl-:源码编译

       1 源码编译 + cmake + vscode

       系统环境:ubuntu ..6

       编译环境: g++9.4 cmake3..3

       编译工具:vscode

       1.1 glfw源码编译

        Release 3.3. · glfw/glfw 下载 glfw-3.3..zip

       安装依赖

       解压源码文件

       cmake配置

       编译工程 edgelee / vscode-opengl-tutorial -1-glfw

       1.2 glad源码编译

        glad.dav1d.de/ 选择配置内容(如图)

       生成源文件 glad.zip

       解压zip

       cmake配置

       一级CmakeList

       二级CmakeList

       编译工程 edgelee / vscode-opengl-tutorial -2-glad

       1.3 imgui源码编译(依赖系统OpenGL)

       imgui源码下载

       github.com/ocornut/imgu...

       ubuntu安装opengl

       解压zip

       cmake配置

       一级CmakeList

       二级CmakeList

       根据makefile内容配置CmakeList(imgui-1..4/examples/example_glfw_opengl3/Makefile)

       编译输出 edgelee / vscode-opengl-tutorial -3-imgui-(system-gl)

       1.4 imgui源码编译(不依赖系统OpenGL)

       imgui源码下载:同1.3

       ubuntu安装opengl:不需要(即使安装,不使用)

       解压zip:同1.3

       cmake配置

       一级CmakeList:同1.3

       二级CmakeList:去掉OpenGL依赖

       编译错误

       根据错误提示,修正

       imgui-1..4/backends/imgui_impl_glfw.cpp文件的添加

       编译结果 edgelee / vscode-opengl-tutorial -3-imgui-(no-system-gl)

       2 实例2.1 旋转三角形 glfw +glad

       源码文件:glfw-3.3./examples/simple.c(不采用glfw自带glad,修改到自编译glad)

       一级CmakeList

       二级CmakeList

       生成效果 edgelee / vscode-opengl-tutorial -sample-glfw-glad

       2.2 gui界面 glfw +imgui

       源码文件:imgui-1..4/examples/example_glfw_opengl3/main.cpp

       一级CmakeList

       二级CmakeList

       生成效果 edgelee / vscode-opengl-tutorial -sample-glfw-imgui

       2.3 gui界面 glfw +glda +imgui(建议方式)

       注:建议采用此方式,openGL api 统一使用 gdal api

       源码文件:imgui-1..4/examples/example_glfw_opengl3/main.cpp(修改到 gdal api)

       一级CmakeList

       二级CmakeList

       生成效果 edgelee / vscode-opengl-tutorial -sample-glfw-glad-imgui

用Python和OpenGL探索数据可视化(基础篇)- 重构代码组织OpenGL核心对象包pygl

       使用Python和OpenGL进行数据可视化的开发时,需要确保电脑支持OpenGL 4.5版本,可以通过检测显卡和OpenGL信息来确认。配置Windows下VS Code + Python + OpenGL开发环境的步骤也在文中有所提及。

       在上一节中,我们深入学习了OpenGL的核心对象顶点数组对象(VAO)和顶点缓存对象(VBO)之间的绑定,以及如何使用OpenGL绘制“线”。然而,在对比point_app.py和line_app.py后,可以发现一些明显的重复代码,如创建“着色器”、“程序”、VAO、VBO的过程。为遵循DRY(Don't Repeat Yourself)原则,有必要重构代码。

       首先,在"D:\pydev\pygl"目录下新建一个"pygl"子文件夹,并在其中创建"shader.py"文件。在该文件中,定义了一个OpenGL着色器类,构造函数包含着色器类型和源代码文件名参数。类中定义了创建和删除着色器对象的方法,以及加载、编译着色器源代码的逻辑。

       接下来,在"pygl"文件夹下新建"program.py"文件,定义了OpenGL程序类,构造函数接收一个着色器对象列表作为参数。该类包含创建、使用、删除程序对象的方法,以及加载和链接着色器对象以形成最终程序的逻辑。

       进一步,创建了从"program.py"派生的"ProgramVF"类,专门用于创建只使用顶点着色器和片段着色器的OpenGL程序类。构造函数接收顶点和片段着色器源代码文件名作为参数,并自动创建、链接着色器对象,最后删除不再使用的对象。

       在"pygl"目录下,还创建了"vertexbufferobject.py"和"vertexarrayobject.py"文件,分别定义了顶点缓存对象(VBO)和顶点数组对象(VAO)类。这些类分别提供了创建、绑定、删除对象的方法,以及处理顶点数据和属性的逻辑。

       在"__init__.py"文件中,通过导入这些类,将"pygl"目录组织成一个Python包,使得用户可以轻松导入和使用其中的类。

       在"basic"文件夹中,新建"shaders"子文件夹,并在其中创建"line.vs"和"line.fs"文件,分别包含顶点和片段着色器代码。在"line_app_v1.py"文件中,导入重构后的"pygl"包,并使用新类创建OpenGL程序、顶点缓存和顶点数组对象,实现了"你好,线段!"功能,重构后代码精简明显,逻辑更清晰。

       对比"line_app_v1.py"和原始代码"line_app.py",重构后的源代码减少了重复代码,提高了代码的可读性和可维护性。重构工作不仅简化了代码结构,还通过使用面向对象方法提高了代码的模块化程度,使得后续扩展和修改变得更加容易。

OpenGL中gltranslate()的函数代码,我会用这个函数,我要的是这个函数的实现代码

           是这样的,你电脑上OpenGL的实现代码其实是不可能看到的,它是跟着显卡走的,应该在显卡驱动程序里(或许是用汇编实现的),这是我的认识。

           但并不是没有办法了,Mesa一直以开源的形式实现了OpenGL的一些接口,我们可以拿来学习和参考,比如你说的这个translate接口,其实就是一个模型矩阵运算问题,我摘抄了Mesa的m_matrix.c文件里的实现:

void _math_matrix_translate( GLmatrix *mat, GLfloat x, GLfloat y, GLfloat z )

       {

          GLfloat *m = mat->m;

          m[] = m[0] * x + m[4] * y + m[8]  * z + m[];

          m[] = m[1] * x + m[5] * y + m[9]  * z + m[];

          m[] = m[2] * x + m[6] * y + m[] * z + m[];

          m[] = m[3] * x + m[7] * y + m[] * z + m[];

          mat->flags |= (MAT_FLAG_TRANSLATION |

        MAT_DIRTY_TYPE |

        MAT_DIRTY_INVERSE);

       }

       Mesa的网址是www.mesa3d.org,你可以去down代码。

用Python和OpenGL探索数据可视化(基础篇)- 细说纹理环绕

       本系列文章将指导如何使用Python与OpenGL 4.5进行数据可视化开发。首先,请参考《准备工作(一)Windows下检测显卡和OpenGL信息》以确认您的电脑支持OpenGL 4.5版本。接着,《准备工作(二)配置Windows下VS Code + Python + OpenGL开发环境》将帮助您设置开发环境。

       在《用Python和OpenGL探索数据可视化(基础篇)- 你好,纹理!》一文后,您已学习如何在物体的“面”上贴上复杂色彩,通过《用Python和OpenGL探索数据可视化(基础篇)- 完善pygl增加OpenGL二维纹理对象》形成了单独的OpenGL二维纹理类ImageTexture2D。本节我们探讨如何利用ImageTexture2D详细解释纹理环绕的概念。

       在“画图”工具中打开D:\pydev\pygl\textures\cratetex.png,并将其另存为cratetex_text.png。在原有基础上添加“GL”文字。在VS Code中创建texture_wrap_app.py文件,输入特定代码并运行。

       改变垂直环绕方式为GL_CLAMP_TO_EDGE,分别调整水平环绕方式,您将看到不同的输出效果。接着,将垂直环绕更改为GL_REPEAT,再次调整水平环绕,观察结果变化。类似地,当垂直环绕为GL_MIRRORED_REPEAT时,改变水平环绕会得到新的输出。最后,保持垂直环绕为GL_CLAMP_TO_BORDER,改变水平环绕,您将看到更多样化的输出。

       通过对比这些截图,结合ImageTexture2D类的setWrapMode方法的使用,您可以更深入地理解纹理环绕的机制。例如,当纹理坐标不在0到1之间时,OpenGL会重复绘制纹理。

       在代码第-行,定义了矩形的顶点属性,需要注意纹理坐标的范围。在《用Python和OpenGL探索数据可视化(基础篇)- 你好,纹理!》一文中提到,纹理坐标的范围是0到1,但这里的坐标范围超出这一范围,导致重复绘制纹理。结合setWrapMode方法,当使用GL_REPEAT、GL_MIRRORED_REPEAT、GL_CLAMP_TO_EDGE或GL_CLAMP_TO_BORDER时,OpenGL会根据不同的设置重复、镜像重复或使用边缘或指定边界颜色绘制纹理。

       代码第、行定义了类属性wrap_s_mode和wrap_t_mode,用于保存纹理环绕的具体设置值。第行设置了边界颜色为蓝色,第、行定义了ImGui窗口的宽度和高度。第行设置纹理过滤参数。第-行使用ImGui的单选按钮为wrap_s_mode和wrap_t_mode设置不同的环绕数值。第行调用setWrapMode方法更新纹理环绕参数,影响绘制结果。最后,第-行展示了设置纹理对象tex的边界颜色的效果。

       本文系列源代码已上传至gitee.com/eagletang/pygl...(链接省略)。相关文章包括但不限于《用Python和OpenGL探索数据可视化(基础篇)- 你好,窗口!》、《用Python和OpenGL探索数据可视化(基础篇)- 重构代码“你好,小不点!”》等,为您的学习提供全面指导。

相关推荐
一周热点