OpenGL版本开始(截至2014年底)

时间:2014-09-24 01:42:31

标签: c++ opengl opengl-es

我对OpenGL一无所知,但事实证明可能需要我正在处理的东西(想象一下这只是因为我想要一些需要快速绘图的视觉效果 - 硬件加速)。

因此,我对于从当前日期开始编码的OpenGL版本感到非常困扰? (2014年9月为未来的读者)。

到目前为止,我已经阅读过OpenGL 3.x是最常用的(读作:支持)版本,即使在非常旧的硬件上(即为Windows XP设计)也是如此。但是,如果我为OpenGL 4.x开发,我的应用程序是否可以与3.x支持的硬件向后兼容?或者它只是在那里打破并且仅在4.x(以及未来?)支持的硬件上运行?

我对OpenGL的使用不适用于视频游戏或任何类似的东西,因此我可能永远不需要高级功能(截至目前我无法命名为您提供我可能永远不会使用的示例,我希望有经验的OpenGL人员会理解我的观点)。但是,我认为这不会降低驱动程序支持所需的任何方式,我是对的吗?

请注意,我可能使用了错误的术语,我想开始学习OpenGL,这使我处于一个不太好理解的位置,无法理解我是否需要 this 功能和/或可能的要求 - 我需要真正的建议才能开始并找到出路。

1 个答案:

答案 0 :(得分:5)

我确信这个答案会跳过很多细节和例外(所以请加盐,如果你不同意或有什么要补充的话,请发表评论:P),但......每个OpenGL版本大多只是添加功能,所以如果你开始使用新功能,它可能会限制你可以运行你的应用程序的硬件(所以这个问题吸引了一个downvote,而它应该引起了解释)。

基本绘图几乎保持不变,有一个非常大的例外:所有deprecated in version 3 and removed in 3.1的内容。

旧,< GL 3:​​

我们曾经能够做到这样的事情:

glEnable(GL_LIGHTING); //fixed-pipeline lighting. replaced with shaders
glEnable(GL_TEXTURE_2D); //fixed texturing
glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(...); //builtin matrices
glBegin(GL_TRIANGLES); glVertex3f(...) ...; glEnd(); //immediate mode with per-vertex calls
glVertexPointer(..., myArray); glDrawArrays(...); //immediate mode with client side array

但即便如此,我们仍然有GLSL着色器和VBO。存在相当多的重叠并且GL3弃用并未立即取代所有内容:

glBufferData(...); //buffer mesh data to bound VBO
...
glVertexAttribPointer(...); //attach data to myCustomVar (either VBO or immediate mode local array)
...
attribute vec3 myCustomVar;
varying vec3 myVarying;
...
gl_Position = gl_ProjectionMatrix * gl_ModelviewMatrix * gl_Vertex;
...
gl_FragColor = vec4(1, 0, 0, 1);

新,> = GL 3:​​

新的绘图方式删除了立即模式和许多这些内置功能,因此您可以从头开始做很多事情,添加一些功能和语法更改。您必须使用VBO和着色器:

glBufferData(...); //buffer mesh data
...
glVertexAttribPointer(...); //attach VBOs, but have to set your own position etc too
...
#version 150 //set GLSL version number
out vec3 myVarying; //replaces "varying"
gl_Position = myProjection * myModelview * myPosition;
...
in vec3 myVarying;
out vec4 fragColour; //have to define your own fragment shader output
...
fragColour = vec4(1, 0, 0, 1);

要回答你的问题,这完全是我的意见,我开始学习GLES2.0(afaik几乎是GL3的一个子集),因为它现在得到了很好的支持。 GL2 /立即模式肯定不会作为一个学习步骤受到伤害,并且还有很多不被弃用的东西。如果您发现需要它们,您可以随时使用GL 4功能,但正如所述,基本功能实际上只在上述版本之间发生了变化。即使您使用已弃用的功能,您也必须不遗余力地获得不允许某些通话/功能的纯GL3.2(例如)上下文。我不是在提倡它,但完全有可能将非常旧的和非常新的混合起来,大多数司机似乎都允许它。

TLDR: 1.使用VBO,2。使用着色器。只是为了学习,不要打扰明确的版本上下文。

另见: