比較的最近のGLSLでは、gl_ModelViewMatrix、gl_ProjectionMatrixという名前の変数を定義するとエラーになる。正確には、「先頭に gl_ がついている変数名はコンパイルエラーになる」。
glTranslatedなどが使用できないとか以前に、「変数名によってエラーになる」ことが問題。例えば以下のようなコードを書くと、コンパイルエラーが発生する。
#version 330 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 incolor; out vec4 vertexColor; uniform mat4 gl_ModelViewMatrix; uniform mat4 gl_ProjectionMatrix; void main() { gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * vec4(aPos, 1.0); vertexColor = vec4(incolor, 1.0); }
ただし、上の場合、gl_Positionは自分で定義しているわけではないのでエラーにならない。
gl_が頭についていない変数を使えばよい。ところで、gl_ModelViewMatrixやgl_ProjectionMatrixは、glMatrixMode→glTranslatef等で渡された行列の可能性がある。これが使えなくなるので、行列は自分で計算しなければいけない。面倒なのでglmを使用することになる。
#version 330 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 incolor; out vec4 vertexColor; uniform mat4 MyModelViewMatrix; uniform mat4 MyProjectionMatrix; void main() { gl_Position = MyProjectionMatrix * MyModelViewMatrix * vec4(aPos, 1.0); vertexColor = vec4(incolor, 1.0); }
glUseProgram(ProgramID); // これの代わりに glGetUniformLocation + glUniformMatrix4fv // //glMatrixMode(GL_MODELVIEW); //glLoadMatrixf(glm::value_ptr(projectionMatrix)); //glMatrixMode(GL_MODELVIEW); //glLoadMatrixf(glm::value_ptr(modelViewMatrix)); glm::mat4 modelViewMatrix; // モデルビュー行列の計算 static int theta = 0.0f; modelViewMatrix = glm::rotate( glm::mat4(1.0), glm::radians((float)theta), glm::vec3(0.0, 0.0, 1.0) ); theta += 5; glm::mat4 projectionMatrix = glm::mat4(1.0); // 投影行列の計算 GLint modelViewMatrixID = glGetUniformLocation(ProgramID, "MyModelViewMatrix"); GLint projectionMatrixID = glGetUniformLocation(ProgramID, "MyProjectionMatrix"); glUniformMatrix4fv(modelViewMatrixID, 1, GL_FALSE, glm::value_ptr(modelViewMatrix)); glUniformMatrix4fv(projectionMatrixID, 1, GL_FALSE, glm::value_ptr(projectionMatrix));
なんか前にも書いた気がするのだが、日本語の検索結果があまり出てこなかったのでここにまとめておく。