2015-04-22 60 views
-1

我正在研究OpenGL中的一段代码。 我收到以下错误信息,同时试图编译:glUniform3fv不工作OpenGL

MyGLWidget.cpp: In member function ‘virtual void MyGLWidget::initializeGL()’: 
MyGLWidget.cpp:30:38: error: cannot convert ‘glm::vec3 {aka glm::tvec3<float, (glm::precision)0u>}’ to ‘const GLfloat* {aka const float*}’ in argument passing 
MyGLWidget.cpp:31:39: error: cannot convert ‘glm::vec3 {aka glm::tvec3<float, (glm::precision)0u>}’ to ‘const GLfloat* {aka const float*}’ in argument passing 

我已经宣布在MyGLWidget.h这些位置如下:

GLuint llumLoc, focusLoc; 

而且有MyGLWidget.cpp它们初始化为:

llumLoc = glGetUniformLocation (program->programId(), "llumAmbient"); 
    focusLoc = glGetUniformLocation (program->programId(), "posFocus"); 

“llumAmbient” 和 “posFocus” 在我的顶点着色器的制服:

uniform vec3 llumAmbient; 
uniform vec3 posFocus; 

我得到的提到的错误信息,同时试图调用MyGLWidget内将以下代码:: initializeGL

glUniform3fv(llumLoc, 1, glm::vec3(0.2)); 
glUniform3fv(focusLoc, 1, glm::vec3(1.0)); 

很显然,我试图跟随在www.opengl.orgglm.g-truc.net/0.9.2/api/a00001.html的文件,但我可以”看看这个代码有什么问题...

回答

3

你需要给一个指向矢量的指针,而不是矢量本身。例如:

glm::vec3 v(1.0f); 
glUniform3fv(focusLoc, 1, glm::value_ptr(&v[0])); 
+3

我很确定这应该是'glm :: value_ptr(v)' – chbaker0

+0

完美的是,这个小小的改正完成了。现在工作。谢谢! – houcros

1

其实我今天才发现有更清洁更直接的方法。简单地说:

glUniform3fv(focusLoc, 1, &v[0]); 

不需要输入value_ptr