关于OpenGL中的文本呈现已经有很多问题,例如:
但主要讨论的是使用固定功能管道渲染纹理四边形.当然着色器必须做出更好的方法.
我并不真正关心国际化,我的大部分字符串都是情节刻度标签(日期和时间或纯数字).但是这些图将以屏幕刷新率重新渲染,并且可能会有相当多的文本(屏幕上不超过几千个字形,但足够硬件加速布局会很好).
使用现代OpenGL进行文本渲染的推荐方法是什么?(引用现有软件使用该方法是很好的证据,它运作良好)
我知道有一些关于学习OpenGL的问题.这就是我所知道的:
以下是我想知道的: - OpenGL 4.0 核心配置文件(或后者) - Shader Language 400(或后者) - 上面的每一部分(如果它不能在供应商之间工作那么它仍然不会打扰我)
这是我不想知道的 - 固定功能管道(永远不会使用它!) - 旧的OpenGL - 兼容性配置文件
我更喜欢大部分信息,如教程,系列文章,书籍.
PS如果您了解opengl 3.x核心配置文件的资源,也可以发布它们
我知道在过去的几年中也有类似的问题,但在做了一些研究后,我仍然无法决定从哪里学习,应该学什么.我还希望通过更多的C++ OOP和着色器方法来了解您对现代OpenGL编程的当前实际观点.并确保我对某些事情的实际理解是有效的.
所以...目前我们已经有了OpenGL 4.2,当我读到某个地方需要dx11硬件(它是什么意思?)和一组'侧'库时,例如创建窗口.
有最常见的GLUT,我非常讨厌.其中一个主要原因是函数调用,它不允许我们创建主循环的方式自由.正如一些人所说,它不适合游戏.
还有GLFW,实际上对我来说非常好而直截了当.出于某种原因,人们将其与GLUT一起使用.(它不仅提供窗口初始化,还提供其他实用程序?)
还有SFML和SDL(SDL <SFML imo),而它们两者有时需要使用奇怪的方法来处理OGL,并且在某些情况下并不是很快.
而且我们还有GLEW,这是扩展加载实用程序......等待...... GLUT/GLFW已经不是扩展了吗?是否有任何理由使用它,就像是否有任何真正重要的扩展感兴趣?
直到现在我们都有窗口创建(和一些实用程序),但是...... OGL不会处理纹理,也不管3D模型.我需要多少个其他库?
我们现在提一下教育部分.有着名的NeHe教程.用C语言编写,使用WinApi,代码极其不清晰,过时的解决方案,但仍然是最受欢迎的解决方案.可以找到像Red Book这样的东西,这些东西与2.x或3.x等版本有关,但是只有少数(和未完成的)教程提到4.x.
怎么办?
glLineStipple已在最新的OpenGL API中弃用.什么被取代?如果没有更换,我怎么能得到类似的效果?(我当然不想使用兼容性配置文件...)
好的,所以我已经知道为什么我需要GLEW,但只有一点.
如果我使用现代OpenGL的东西,可能是从版本3.0开始,和/或使用核心配置文件,那么GLEW是必需的,因为没有它编译产生的错误,如未glGenVertexArrays声明.
所以GLEW做了一些背景工作,包括我们想要使用的现代OpenGL函数.
除此之外,还有什么其他的吗?另外,它是如何工作的.
举个例子,它是否改进了跨平台编译?(例如,如果从Linux迁移到Windows或OS X,需要对代码进行少量修改?
它是否也改善了图形硬件的"跨平台性"?例如,假设我们有两台相同的计算机,包括操作系统.在一个系统上使用OpenGL 4.3命令编译程序.如果其他系统有只支持OpenGL 3.3的显卡或驱动程序,那么GLEW会帮忙吗?(也许是为旧版OpenGL编译着色器?)
所以你可能会发现我实际上并不知道GLEW做了什么或它是如何做到的.
最后一点; 有谁知道如何使用GLEW与GLFW?我可能会将其作为一个单独的问题发布.
鉴于我们使用OpenGL 4.5或支持GL_ARB_direct_state_access扩展,我们有新功能glCreateBuffers.
此函数具有相同的签名glGenBuffers,但指定:
返回
n先前未使用的缓冲区名称buffers,每个缓冲区名称表示初始化的新缓冲区对象,就好像它已绑定到未指定的目标一样
glGenBuffers 有以下规格:
调用返回的缓冲区对象名称
glGenBuffers不会被后续调用返回,除非它们首先被删除glDeleteBuffers.
因此,返回的任何缓冲区名称glCreateBuffers将永远不会再次使用,但可以使用glGenBuffers.
似乎glCreateBuffers总会创建新的缓冲区对象并返回它们的名称,并且glGenBuffers只有在之前没有删除过的缓冲区时才会创建新的缓冲区.
添加此功能有什么优势?
我什么时候应该glCreateBuffers用完glGenBuffers?
PS
我认为这代表所有glCreate*添加的功能GL_ARB_direct_state_access
我知道OpenGL 4和3非常相似,尤其是3.1和4.1.由于两者基本上一起发布,因此很难理解OpenGL 4.0/4.1的基本原理.
在以前的OpenGL版本中,次要版本会向上递增,直到大量更改累积到新的主要版本中.OpenGL 3.x和4.x引入了向后兼容的API变化,然后OpenGL 3.2和3.3被认为是3系列的特定分支,它们不向前兼容,而3.1与4.1+兼容
与OpenGL 3.1相比,OpenGL 4.1提供哪些主要差异,保证将其归入新的主要版本?
额外奖励:在任何情况下,任何差异都会导致GL3的性能提升或只是可访问性吗?
编辑:基于答案的一些额外发现
OpenGL 3.3用于补充OpenGL 4.0,以尽可能多地将功能集成到旧硬件中.OpenGL的3和4,3.3之间进行选择可以是一个更好的选择有时.4.1添加了GL ES 2.0兼容性和一些不错的功能.
更大的工作流程差异之一是通过新的曲面细分着色器在管道中添加GPU编程步骤.另一个是要渲染的多个视口.我相信新的细节级别功能会改变我正在使用的工作流程,也许还会改变其他工作流程,尽管我还没有深入研究这个功能.
如果您发现任何误解或需要改进的地方,请与我们联系.
主题演讲(显然是在回答问题时从答案中删除了..暂时参考实际答案是什么.)
附录G-K对于OpenGL 3.1功能,通过OpenGL 4.1 功能
Khronos Group发布OpenGL 4.0可能"更容易阅读":)
- 采样器对象
- 实例化数组和着色器
texture_cube_map_array和texture_gather
GLSL 4.0和动态LOD
- shader_subroutine和sample_shading
- separate_shader_objects
- 增加纹理/渲染缓冲区所需的大小
- 64位浮点顶点属性
- get_program_binary
- +2 Tesselation着色器
只要旋转/轴与世界一致,我就会Camera附加一个SceneNode并且运动工作正常SceneNode.然而,当物体在旋转不同的方向,以"看",并告知"前进"它并没有沿着新的"前进"方向移动.相反,它继续沿着应用旋转之前面向的方向移动.
我有一个场景图来管理3D场景.图形是一个SceneNode对象树,它们知道它们相对于父元素和世界的变换.
根据TL; DR; 片段,假设你有一个cameraNode零旋转(例如朝北),然后cameraNode围绕+ Y"向上"轴向左旋转90度,即向西看.到目前为止事情还可以.如果你现在尝试移动cameraNode现在向西的"向前",那么cameraNode移动就好像"向前"仍然面向北方.
简而言之,它就像从未旋转过一样.
下面的代码显示了我最近尝试过的内容以及我(当前)最佳猜测,即缩小最可能与问题相关的区域.
SceneNode成员该SceneNode实施具有以下字段(仅是有关这个问题显示):
class GenericSceneNode implements SceneNode {
// this node's parent; always null for the root scene node in the graph
private SceneNode parentNode;
// transforms are relative to a parent scene node, if any
private Vector3 relativePosition = Vector3f.createZeroVector();
private Matrix3 relativeRotation …Run Code Online (Sandbox Code Playgroud) OpenGL的4.3和OpenGL ES 3.1添加若干替代功能用于指定顶点数组:glVertexAttribFormat,glBindVertexBuffers等,但我们已经有了用于指定顶点数组功能.即glVertexAttribPointer.
为什么要添加与旧版API相同的新API?
新API如何运作?
我使用OpenGL4.X.最近我读到了这个 Apple OpenGLES2文档,其中声明使用交错属性数组可以提高IOS移动设备的性能,并且是推荐的方式(而不是使用属性块).
对于那些不明白我的意思的人来说,这是一个例子:
单个属性数组中的属性块:
float vertices[]{
//Triangle vertices:
v0x , v0y , v0z ,
v1x , v1y , v1z ,
v2x , v2y , v2z ,
//Triangle UVs:
uv0s , uv0t ,
uv1s , uv1t ,
uv2s , uv2t ,
//Triangle Normals:
n0x , n0y , n0z ,
n1x , n1y , n1z ,
n2x , n2y , n2z
}
Run Code Online (Sandbox Code Playgroud)
交错属性数组:
float vertices[]{
v0x , v0y , v0z ,
uv0s , uv0t , ////vertex 1 attributes
n0x , …Run Code Online (Sandbox Code Playgroud)