0

私はこのコードをインターネットhttp://rioki.org/2013/03/07/glsl-skybox.htmlで見つけました (実際にはスカイボックスをレンダリングしています)。しかし、なぜそれが機能するのか理解できません。

void main()
{
    mat4 r = gl_ModelViewMatrix;
    r[3][0] = 0.0;
    r[3][1] = 0.0;
    r[3][2] = 0.0;

    vec4 v = inverse(r) * inverse(gl_ProjectionMatrix) * gl_Vertex;

    gl_TexCoord[0] = v; 
    gl_Position    = gl_Vertex;
} 

ワールド座標もそうgl_Vertexですが、これに射影行列の逆数を掛けてからモデルビュー行列を掛けるとどうなるでしょうか?

これは、スカイボックスを描画するために使用するコードです

void SkyBoxDraw(void)
{
GLfloat SkyRad = 1.0f;

glUseProgramObjectARB(glsl_program_skybox);
glDepthMask(0);
glDisable(GL_DEPTH_TEST);
// Cull backs of polygons
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
glEnable(GL_TEXTURE_CUBE_MAP);

glBegin(GL_QUADS);
    //////////////////////////////////////////////
    // Negative X
    glTexCoord3f(-1.0f, -1.0f, 1.0f);
    glVertex3f(-SkyRad, -SkyRad, SkyRad);

    glTexCoord3f(-1.0f, -1.0f, -1.0f);
    glVertex3f(-SkyRad, -SkyRad, -SkyRad);

    glTexCoord3f(-1.0f, 1.0f, -1.0f);
    glVertex3f(-SkyRad, SkyRad, -SkyRad);

    glTexCoord3f(-1.0f, 1.0f, 1.0f);
    glVertex3f(-SkyRad, SkyRad, SkyRad);
    ......
    ......
glEnd();

glDepthMask(1);
glDisable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glDisable(GL_TEXTURE_CUBE_MAP);

glUseProgramObjectARB(0);

}
4

1 に答える 1