在 Linux 上的 Qt 5.4 中使用某些 OpenGL 函数
Using certain OpenGL functions with Qt 5.4 on Linux…
下面的代码块适用于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上。
相关文章:
- GLEW 未在 MSYS2 上定位 OpenGL 函数
- CMake 子项目不能调用 OpenGL 函数,但父项目可以
- EGL 在第一次 opengl 函数调用时崩溃
- 我是否需要这些 OpenGL 函数末尾的"3f"?
- 使用 QOpenGLWidget 加载 OpenGL 函数指针
- opengl32.lib如何在Windows(仅1.1版本)上工作?它是否真正实现了OpenGL函数
- 类中的 OpenGL 函数
- 加载的 OpenGL 函数是特定于上下文还是特定于线程?(视窗)
- SFML 环境中缺少 OpenGL 函数
- 为什么内联函数会导致编译器看不到OpenGL函数
- 加载 OpenGL > 1.1 函数窗口
- 手动检索和存储指向 OpenGL 函数的指针时遇到问题
- 在未加载上下文的情况下在对象构造函数中使用OpenGL函数
- 在 Linux 上的 Qt 5.4 中使用某些 OpenGL 函数
- OpenGL函数在VS2012 express中未定义
- 我可以在代码中明确禁用不推荐使用的OpenGL函数吗
- 如何替换以下(已弃用)OpenGL函数
- glxCreateContextAttribsARB和OpenGL函数在linux上的动态加载
- 调用OpenGL函数时程序崩溃
- OpenGL函数未定义glow