【问题标题】:Using certain OpenGL functions with Qt 5.4 on Linux…在 Linux 上将某些 OpenGL 函数与 Qt 5.4 一起使用……
【发布时间】:2015-01-18 22:47:14
【问题描述】:

以下代码块适用于 Windows(在 VC++ 2013 中),因为我已包含 GL/glew.h,但在 Linux 上使用 QT Creator 会取消定义包含,因此下面的粗体函数不可用。

如何才能在 Linux 下使用 OpenGL 函数 glGetUniformBlockIndex()glUniformBlockBinding()glBindBufferBase()喜欢我在 Windows 下如何使用这些功能?

感谢您的宝贵时间。

void QTOpenGLWindow::loadShaderUniforms() {

 glUseProgram(MainOpenGLShaderProgramID);

 MatricesUniformBlockID = glGetUniformBlockIndex(MainOpenGLShaderProgramID, "Matrices");
 glUniformBlockBinding(MainOpenGLShaderProgramID, MatricesUniformBlockID, 1);
 glGenBuffers(1, &MatricesUniformBufferID);
 glBindBuffer(GL_UNIFORM_BUFFER, MatricesUniformBufferID);
 glBindBufferBase(GL_UNIFORM_BUFFER, 1, MatricesUniformBufferID);
 GLsizeiptr TotalBufferSize = sizeof(glm::mat4) + sizeof(glm::mat4);
 TotalBufferSize += sizeof(glm::mat3);

 glBufferData(GL_UNIFORM_BUFFER, TotalBufferSize, NULL, GL_DYNAMIC_DRAW);
 glBindBuffer(GL_UNIFORM_BUFFER, NULL);

 LightsUniformBlockID = glGetUniformBlockIndex(MainOpenGLShaderProgramID, "Lights");
 glUniformBlockBinding(MainOpenGLShaderProgramID, LightsUniformBlockID, 2);
 glGenBuffers(1, &LightsUniformBufferID);
 glBindBuffer(GL_UNIFORM_BUFFER, LightsUniformBufferID);
 glBindBufferBase(GL_UNIFORM_BUFFER, 2, LightsUniformBufferID);

 GLfloat LightDirection[3] = { -4.0f, -3.0f, -3.0f };

 glBufferData(GL_UNIFORM_BUFFER, sizeof(LightDirection), &LightDirection, GL_DYNAMIC_DRAW);
 glBindBuffer(GL_UNIFORM_BUFFER, NULL);

 MaterialsUniformBlockID = glGetUniformBlockIndex(MainOpenGLShaderProgramID, "Materials");
 glUniformBlockBinding(MainOpenGLShaderProgramID, MaterialsUniformBlockID, 3);
 glGenBuffers(1, &MaterialsUniformBufferID);
 glBindBuffer(GL_UNIFORM_BUFFER, MaterialsUniformBufferID);
 glBindBufferBase(GL_UNIFORM_BUFFER, 3, MaterialsUniformBufferID);

 GLfloat Material[18];

 //Diffuse
 Material[0] = 0.5f;
 Material[1] = 0.0f;
 Material[2] = 0.0f;
 Material[3] = 1.0f;

 //Ambient
 Material[4] = 0.2f;
 Material[5] = 0.2f;
 Material[6] = 0.2f;
 Material[7] = 1.0f;

 //Specular
 Material[8] = 1.0f;
 Material[9] = 1.0f;
 Material[10] = 1.0f;
 Material[11] = 1.0f;

 //Emissive
 Material[12] = 0.0f;
 Material[13] = 0.0f;
 Material[14] = 0.0f;
 Material[15] = 1.0f;

 //Shininess
 Material[16] = 5.0f;

 //Texture Count
 Material[17] = 0.0f;

 glBufferData(GL_UNIFORM_BUFFER, sizeof(Material), &Material, GL_DYNAMIC_DRAW);
 glBindBuffer(GL_UNIFORM_BUFFER, NULL);

}

【问题讨论】:

  • 为什么它们不可用?您在哪里/如何在该代码中使用 GLEW? (另外,Qt 已经提供了类似于 GLEW 的东西。看看qopengl.h' header (which will include the right gl.h` 头),以及QOpenGLContext::versionFunctions(它返回一个类,其中函数指针已经为给定的版本/配置文件解析) )
  • @peppe 好的,我会试试这个。

标签: c++ linux qt opengl


【解决方案1】:

你可以试试:

#if defined(Q_OS_WIN32)
#include <GL/glew.h>
#include <GL/wglew.h>
#elif defined(Q_OS_MAC)
#include <OpenGL/gl.h>
#include <OpenGL/glext.h>
#else
#include <GL/gl.h>
#include <GL/glext.h>
#endif

这就是我们对我目前正在从事的项目所做的事情。我不是设置它的人,但我认为值得一试。 如果您有兴趣查看原始代码,请访问Github

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 2020-09-13
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多