OpenGL 版本问题

OpenGL version issues

本文关键字:问题 版本 OpenGL      更新时间:2023-10-16

我正在使用OpenGL,但我使用的版本遇到了一些问题。当我使用 glGetString(GL_VERSION) 检查我的版本时,我得到"4.2.0 - Build 10.18.10.3574"。我有以下问题:

  1. 在一种方法中,我使用固定管道进行渲染,但我知道对固定管道的支持已从 OpenGL 3.1 中删除,那么我的代码如何使用 4.2?我正在使用像 glTranslatef()glMatrixMode(GL_PROJECTION) 这样的 API。我认为这些都已弃用,仅适用于 OpenGL 1.1。那么,当我将上下文字符串作为 OpenGL 4.2 获取时,代码是如何工作的呢?我想我一定在使用 OpenGL 1.1,但是为什么上下文版本是 4.2?

  2. 当我使用着色器时,我使用以下代码创建 3.1 或更高版本的上下文。我使用的着色器是与OpenGL 2.0兼容的旧着色器,并且具有"属性","变化"等关键字,并且不应与OpenGL 3.1或更高版本一起使用。我应该需要将我的着色器更新到 OpenGLSL 3.1,例如使用"in"、"out"等。还有一些不推荐使用的东西,如 GL_LINE_SMOOTH_HINTglMatrixMode(GL_PROJECTION) 。我认为这些东西已经从OpenGL 3.0中弃用了。那么这些东西是如何与 GL 上下文 3.1 及更高版本一起使用的呢?

用于创建上下文 3.1 或更高版本的代码

if ( 0 == (m_tempContext = ::wglCreateContext( m_pDC->GetSafeHdc() ) ) )
{
    AfxMessageBox(_T("wglCreateContext failed."));
    return FALSE;
}
if ( FALSE == ::wglMakeCurrent( m_pDC->GetSafeHdc(), m_tempContext ) )
{
    AfxMessageBox(_T("wglMakeCurrent failed."));
    return FALSE;
}
int attribs[] =
{
    WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
    WGL_CONTEXT_MINOR_VERSION_ARB, 1,
    WGL_CONTEXT_FLAGS_ARB, 0,
    0
};
if(wglewIsSupported("WGL_ARB_create_context") == 1)
{
m_hRC = wglCreateContextAttribsARB(m_pDC->GetSafeHdc() ,0, attribs);
wglMakeCurrent(NULL,NULL);
wglDeleteContext(m_tempContext);
wglMakeCurrent( m_pDC->GetSafeHdc(), m_hRC);
}

我正在使用的着色器之一

const GLchar* vertexShaderCode =                                        
    "attribute vec4 a_Position;                                n"  
    "attribute vec2 a_TexCoordinate;                           n"  
    "uniform mat4 u_MVPMatrix;                                 n"  
    "varying vec2 v_TexCoordinate;                             n"  
                                                                    
    "void main()                                               n"  
    "{                                                         n"  
    "    gl_Position = u_MVPMatrix * a_Position;               n"  
    "    v_TexCoordinate = a_TexCoordinate;                    n"  
    "}                                                         n"; 
                                                                    
const GLchar* fragmentShaderCode =                                      
    "#extension GL_OES_standard_derivatives : enable            n" 
    "#ifdef GL_ES                                               n" 
    "precision highp float;                                     n" 
    "#endif                                                     n" 
    "varying vec2       v_TexCoordinate;                        n" 
    "uniform sampler2D  u_Texture;                              n" 
    "uniform vec4       u_Color;                                n" 
    "uniform float      u_InsideCutoff;                         n" 
    "uniform float      u_OutsideCutoff;                        n" 
    "uniform float      u_TextureSize;                          n" 
                                                                    
    "void main()                                                n" 
    "{                                                          n" 
    "   vec4 distance = texture2D(u_Texture, v_TexCoordinate);  n" 
    "   vec3 color;                                             n" 
    "   float ic;                                               n" 
    "   float oc;                                               n" 
    "   float alpha;                                            n" 
                                                                    
    "   vec4  duvdxy  = vec4(dFdx(v_TexCoordinate), dFdy(v_TexCoordinate));              n" 
    "   float pixSize = length(u_TextureSize*duvdxy);                                    n" 
    "   ic = 0.5 + u_InsideCutoff*pixSize;                                               n" 
    "   oc = 0.5 + u_OutsideCutoff*pixSize;                                              n" 
    "   alpha = (clamp(distance.r,oc,ic) - oc)/(ic-oc);                                  n" 
    "   alpha *= u_Color.a;                                                              n" 
    "   color = u_Color.rgb;                                                             n" 
    "   gl_FragColor = vec4(color, alpha);                                               n" 
    "}                                                                                   n";

基本上,我需要更新我的着色器和其他代码以使用 OpenGL 3.1 和更高的上下文。我已经与OpenGL失去联系一段时间了。很抱歉,如果它太幼稚的问题

OpenGL 3.1确实删除了以前弃用的功能。但是,3.1 还引入了 ARB_compatibility 扩展,这有效地将其全部恢复。如果您要求版本 3.1,您的实现将决定是否也可以使用已删除的功能。

对于版本 3.2 或更高版本,OpenGL 分为核心配置文件和兼容性配置文件。如果要与 wgl/glXCreateContextAttribsARB 的兼容性配置文件,则必须通过将 CONTEXT_CORE_PROFILE_BIT_ARB 设置为 CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 来显式请求它。否则,当您将 ARB_create_context_attrib 用于 3.2 或更高版本时,将假定核心配置文件。

请注意,如果使用 wglCreateContext ,您将始终获得兼容性配置文件(或在核心/兼容性区别之前获得 OpenGL 版本)。