Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 开始的OpenGL版本(截至2014年底)_C++_Opengl_Opengl Es - Fatal编程技术网

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

C++ 开始的OpenGL版本(截至2014年底),c++,opengl,opengl-es,C++,Opengl,Opengl Es,我对OpenGL一无所知,但它可能是我正在研究的东西所需要的(我明白这一点只是因为我想要一些需要快速绘制的视觉效果——硬件加速) 因此,我非常担心从目前开始为哪个版本的OpenGL编码?(2014年9月供未来读者阅读) 到目前为止,我已经读到OpenGL 3.x是最可用(读作:受支持)的版本,即使是在非常旧的硬件上(即为Windows XP设计的)。但是,如果我为OpenGL4.x开发,我的应用程序会与支持3.x的硬件向后兼容吗?或者它只是在那里中断,只在4.x(和未来?)支持的硬件上运行 我对

我对OpenGL一无所知,但它可能是我正在研究的东西所需要的(我明白这一点只是因为我想要一些需要快速绘制的视觉效果——硬件加速)

因此,我非常担心从目前开始为哪个版本的OpenGL编码?(2014年9月供未来读者阅读)

到目前为止,我已经读到OpenGL 3.x是最可用(读作:受支持)的版本,即使是在非常旧的硬件上(即为Windows XP设计的)。但是,如果我为OpenGL4.x开发,我的应用程序会与支持3.x的硬件向后兼容吗?或者它只是在那里中断,只在4.x(和未来?)支持的硬件上运行

我对OpenGL的使用不适用于视频游戏或任何类似的东西,因此我可能永远不需要高级功能(目前为止,我无法命名任何功能,以向您提供一个我可能永远不会使用的示例,我希望有经验的OpenGL人会理解我的观点)。然而,我不认为这会以任何方式降低所需的驾驶员支持,对吗


请注意,我可能使用了错误的术语,我想开始学习OpenGL,这使我无法很好地理解我是否需要这个或那个功能和/或可能的需求-我需要真正的建议来开始并找到出路。

我确信这个答案跳过了许多细节和细节例外情况(如果你不同意或有什么要补充的,请留下评论:P),但是。。。每个OpenGL版本大多只是添加了一些功能,因此如果你开始使用新功能,它可能会限制你可以在上面运行应用程序的硬件(因此这个问题引起了反对票,而实际上它应该得到解释)

基本绘图基本上保持不变,只有一个非常大的例外:所有的东西

旧的,
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/即时模式作为一个学习步骤当然不会有什么坏处,而且还有很多没有被弃用。如果您发现需要GL4功能,您可以随时使用它们,但正如前面所说,基本功能实际上只在上述版本之间发生了更改。即使您使用了不推荐的功能,您也必须不遗余力地获得纯GL3.2(例如)上下文,该上下文不允许某些调用/功能。我不是在提倡它,但它完全可以将非常旧的和非常新的混合在一起,而且大多数司机似乎都允许这样做

TLDR:1。使用VBOs,2。使用着色器。只是为了学习,不要费心于明确的版本上下文

另见:


我对最广泛支持的建议:请求OpenGL-2.1上下文,使用GL_ARB_framebuffer_对象扩展获取帧缓冲区(它们是最晚进入核心的OpenGL-3)并以“现代”风格完成所有操作,即不使用固定函数管道,在着色器中不使用内置变量。通过这种方式,您的代码可以经得起未来的考验,但也可以在较旧的系统上运行。还有一些顶点数组对象在3.0中成为核心,这些对象是“现代”样式所必需的。应用程序开始时至少有一个绑定为;)你说的“现代风格”是什么意思?对于那些对我的帖子投了反对票的人,我认为他们要么不想帮忙,要么他们知道答案,认为人们应该在发帖前仔细阅读自己的想法。我真的不在乎,因为你的回答,jozxyqk,是我期待的那种回答。到目前为止,我将讨论GLES2,因为我的应用程序将仅是二维的,而且正如我所读到的,许多添加到OpenGL的功能是为了更好地进行三维开发,而不是我的情况。我将查看GLES2和OGL3,看看是否应该进一步了解OGL3。最后一个简单问题:我可以在一个应用程序中使用多个上下文(2+3)吗?thx@BlindedInChains无论哪种方式,GL都会为您提供一个3D上下文,但使用2D就可以了。我对GLES2显式上下文的体验仅限于webgl(简单)和一点android(不确定)。在桌面上。您可能不需要这样做。GL 3.3有什么特别之处?是GL 3.2引入了兼容和核心上下文吗?@无效是的,这是错误的,已更新。谢谢你的评论!!