OpenGL渲染不适用于Linux Machine(Windows Renders)---可能与CMAKE脚本有关(请参
OpenGL rendering not working on Linux machine (windows renders) --- probably related to cmake script (See Updates)
我正在使用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上使用的任何内容,这可能是问题。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用CMake创建QML插件
- cmake如何在fedora工作站中找到boost静态库包
- FindPOCO CMAKE 脚本无法找到 MYSQL::client
- CMake 引用我在 ~/bin 中创建的随机 shell 脚本(即使我删除了它)?
- cmake 安装"noconfig"脚本有什么用?即。 "XXXTarget-noconfig.cmake"
- 为什么这个 CMake 脚本找到"alloca"但仍然失败?
- 在构建之前,如何使Cmake在构建之前运行Python脚本,以生成用于构建中的项目的文件
- 使用C++脚本自动执行 CMake 生成
- 如何在没有外部脚本的情况下链接CMake和SQLite
- OpenGL渲染不适用于Linux Machine(Windows Renders)---可能与CMAKE脚本有关(请参
- CMake、"IMPORTED"库和查找脚本
- 在 cmake 中创建一个宏脚本,并在源文件中调用该宏
- 在后续'make'运行中强制刷新 cmake 脚本
- 如何使用cmake脚本从命令行选择用于编译C++代码的xcode版本
- cmake:试图在cmake脚本执行期间调用msbuild
- CMake:在执行CMake脚本期间生成源
- 在cmake脚本中提供帮助信息