スポンサーリンク

0(8) : error C7528: OpenGL reserves names starting with ‘gl_’: gl_ModelViewMatrix

比較的最近の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);
}
Compiling shader : C:\test\verts.sh
0(8) : error C7528: OpenGL reserves names starting with 'gl_': gl_ModelViewMatrix
0(9) : error C7528: OpenGL reserves names starting with 'gl_': gl_ProjectionMatrix

ただし、上の場合、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);
}

C++側

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));

余談

なんか前にも書いた気がするのだが、日本語の検索結果があまり出てこなかったのでここにまとめておく。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: