OpenGL渲染不适用于Linux Machine(Windows Renders)---可能与CMAKE脚本有关(请参

OpenGL rendering not working on Linux machine (windows renders) --- probably related to cmake script (See Updates)

本文关键字:CMAKE 脚本 请参 Renders 不适用 适用于 Linux OpenGL Windows Machine      更新时间:2023-10-16

我正在使用OpenGL上使用自制图形引擎。我使用C ,CMAKE,GLEW和WXWIDGETS。到目前为止,我只是在Windows机器上工作,一切都很好。现在,我试图移植到Linux。现在的问题是,除了渲染外,一切似乎都起作用。我使用了一个非常简单的着色器:

#VERTEX // ----------------------------------------------
#version 430 core
layout (location = 0) in vec3 VertexPosition;
layout (location = 1) in vec3 VertexNormal;
layout (location = 2) in vec2 VertexTexCoord;
void main()
{
    gl_Position         = vec4(VertexPosition,1.0);
}

#FRAGMENT // --------------------------------------------
#version 430 core
out vec4 FragColor;
void main()
{
    FragColor = vec4(1.0,0.0,0.0,1.0);  
}

在Windows上,我可以渲染一个简单的红色正方形,而无需任何问题。在Linux上,什么都没有,只是透明的颜色(backface culling disabled)。我还尝试将每个帧切换清晰的颜色,以查看上下文是否正确绑定并且掉期正常工作。我得到了预期的闪烁屏幕,因此上下文和缺少掉期不是问题。我还插入了一张格林的支票,没有得到。着色器的编译似乎可以按预期工作,并且程序运行毫无例外或其他问题,除了丢失的输出。我还阅读了另一个线程,其中OS上出现了同样的问题。问题是,没有VAO绑定的呼吁使用GlenableVertexattribarray。但这不是我的情况。这是我如何生成对象的代码段:

// Create VAO
    glGenVertexArrays(1, &pVAOHandle_r);
    glBindVertexArray(pVAOHandle_r);
    // Create VBO
    glGenBuffers(1, &pVBOHandle_r);
    glBindBuffer(GL_ARRAY_BUFFER, pVBOHandle_r);
    // Transfer data
    glBufferData(GL_ARRAY_BUFFER, NumVertexAttribFloats * pVertices_cr.size() * sizeof(F32), VertexArray.data(), GL_STATIC_DRAW);

    // Set Attributes
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0,
                          3,
                          GL_FLOAT,
                          GL_FALSE,
                          NumVertexAttribFloats * sizeof(GLfloat),
                          0);
    U16 AttribNumber = 1;
    GLuint Offset = 12;
    if(pVertices_cr[0]->HasNormal())
    {
        glEnableVertexAttribArray(AttribNumber);
        glVertexAttribPointer(AttribNumber,
                              3,
                              GL_FLOAT,
                              GL_FALSE,
                              NumVertexAttribFloats * sizeof(GLfloat),
                              (void*)Offset);
        ++AttribNumber;
        Offset += 12;
    }
    if(pVertices_cr[0]->HasColor())
    {
        glEnableVertexAttribArray(AttribNumber);
        glVertexAttribPointer(AttribNumber,
                              4,
                              GL_FLOAT,
                              GL_FALSE,
                              NumVertexAttribFloats * sizeof(GLfloat),
                              (void*)Offset);
        ++AttribNumber;
        Offset += 16;
    }
    if(pVertices_cr[0]->HasTexCoord())
    {
        glEnableVertexAttribArray(AttribNumber);
        glVertexAttribPointer(AttribNumber,
                              2,
                              GL_FLOAT,
                              GL_FALSE,
                              NumVertexAttribFloats * sizeof(GLfloat),
                              (void*)Offset);
        ++AttribNumber;
        Offset+=8;
    }

和这里的渲染呼叫:

    glBindVertexArray(mVertexMeshReference.GetVAO());
//  glBindBuffer(GL_ARRAY_BUFFER,mVertexMeshReference.GetVBO());
    glBindTexture(GL_TEXTURE_2D, mTextureReference.GetHandle());
    glDrawArrays(mVertexMeshReference.GetGLPrimitiveType(),
                 0,
                 mVertexMeshReference.GetNumPrimitives() * mVertexMeshReference.GetNumPrimitiveVertices());

我不确定我是否必须再次绑定VBO,所以我对其进行了测试,没有有所作为。

还有一个区别:在Windows上,我正在静态构建静态和Linux上。我不确定它是否可能与二手液体有关。也许有些人丢失了,但我希望链接者会抱怨它。我还检查了GPU OpenGL正在使用的,因为我也有一个板载芯片组,但是输出显示了合适的芯片组。到目前为止,我不知道可能是什么问题。也许有人发现错误,这在Windows上与Linux无关。如果您需要其他代码段,请让我知道。希望你能帮我。

-----------------------------------------------------------------------------------------------------------/p>

我将在此处列出任何建议解决方案的结果,以便您不需要阅读所有帖子及其评论。

从OpenGL输出:

   glGetString(GL_VENDOR) = NVIDIA Corporation
   glGetString(GL_RENDERER) = GeForce GTX 980M/PCIe/SSE2
   glGetString(GL_SHADING_LANGUAGE_VERSION) = 4.50 NVIDIA
   glGetString(GL_VERSION) = 4.5.0 NVIDIA 370.28

发现样品有相同的问题!在其中一条评论中,我说样本正在起作用。我错了。当我使用自己的WXWIDGETS构建时,他们起作用。但是我在WXWIDGETS设置和CMAKE上还有其他问题,这些设置通过使用Ubuntu存储库中的LIB来解决。现在,我复制了企鹅示例,并编写了一个CMAKE文件。我在这里有同样的问题,除了缺少企鹅外,一切似乎都起作用。所以我想问题在我的cmake脚本中的某个地方,而与程序本身无关。

这是脚本(忽略最小WXWidgets样本的2个命令):

 PROJECT(Sample)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
SET(CMAKE_VERBOSE_MAKEFILE ON)

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++14 -Wall  -Wno-long-long -pedantic -D__WXGTK__")
find_package(wxWidgets COMPONENTS gl core base REQUIRED)
FIND_PACKAGE(OpenGL)
include(${wxWidgets_USE_FILE})
add_executable(Minimal
   minimal.cpp)
target_link_libraries(Minimal ${wxWidgets_LIBRARIES})
add_executable(Penguin
   opengl/penguin/penguin.cpp
   opengl/penguin/dxfrenderer.cpp
   opengl/penguin/penguin_trackball.o)
LINK_DIRECTORIES(opengl/penguin)
target_link_libraries(Penguin
    ${wxWidgets_LIBRARIES}
    ${OPENGL_gl_LIBRARY}
    ${OPENGL_glu_LIBRARY})

更新2

现在,我99%肯定它与我的cmake脚本有关。我切换回自己的构建wxwidgets。使用它(版本3.1),我可以用提供的Makefile构建企鹅样本,如果我运行该程序,我可以看到企鹅。如果我用上面显示的CMAKE脚本构建相同的文件,那么企鹅却丢失了!

那么我在CMAKE文件中做错了什么?少了什么东西?也许有人可以复制脚本并在自己的机器上尝试?

如果它在Windows上运行,但在Linux上不运行,则您的驱动程序可能无法运行该OGL版本。

您使用哪些WXWIDGETS版本?在WX 3.0之前,只有OGL 2.1可用。使用WX 3.1,OGL版本仅受OS驱动程序的限制,但您应该要求使用计划使用的版本。

您是否测试过wxwidgets ogl样品?

这真的是所有顶点着色器吗?我本人还没有使用过glew或wxwidgets,所以我不知道它们是否在编译之前插入其他代码,但是我认为某个地方有一个" vec3 pertexposition"。

永远不要期望您的顶点属性的位置始终相同,除非您通过在链接之前使用glbindattriblocation将其放在固定位置,或者通过在Vertex Shader中使用布局限定符。使用GlgetAttriblocation让GlenableVertexattribarray和Glvertexattribpointer确定它们在哪里。如果您想在Windows上使用的任何内容,这可能是问题。