1. ホーム
  2. c++

[解決済み] glUniform3fvが動作しない OpenGL

2022-02-03 22:30:21

質問

私は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.org glm.g-truc.net/0.9.2/api/a00001.html しかし、このコードの何が問題なのかがわからない......。

解決方法は?

ベクトルそのものではなく、ベクトルへのポインタを与える必要があります。例えば

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