在 Linux 上的 Qt 5.4 中使用某些 OpenGL 函数

Using certain OpenGL functions with Qt 5.4 on Linux…

本文关键字:OpenGL 函数 上的 Linux Qt      更新时间:2023-10-16

下面的代码块适用于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);
}

你可以试试:

#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上。