Положение света в opengl

Я пытаюсь нарисовать вращающийся куб и добавить точечный источник света в фиксированном положении перед этим кубиком. Но поскольку я установил неправильное значение по оси Z, свет не появляется. После того, как я попробовал другое положение света, кубик наконец-то отображается так, как я хотел. Но я до сих пор не знаю, почему это значение работает.

Вот неправильный код. Но я думаю, что ценность разумна.

    Matrix.setIdentityM(mLightModelMatrix, 0);
    Matrix.translateM(mLightModelMatrix, 0, 0.0f, 0.0f, 0.5f);
    Matrix.multiplyMV(mLightPosInWorldSpace, 0, mLightModelMatrix, 0, mLightPosInModelSpace, 0);
    Matrix.multiplyMV(mLightPosInEyeSpace, 0, mViewMatrix, 0, mLightPosInWorldSpace, 0);
    GLES20.glUniform3f(muLightPosHandler,
            mLightPosInEyeSpace[0],
            mLightPosInEyeSpace[1],
            mLightPosInEyeSpace[2]);

Вот правильный код. Но я не знаю, почему это работает.

    Matrix.setIdentityM(mLightModelMatrix, 0);
    Matrix.translateM(mLightModelMatrix, 0, 0.0f, 0.0f, 2.8f);
    Matrix.multiplyMV(mLightPosInWorldSpace, 0, mLightModelMatrix, 0, mLightPosInModelSpace, 0);
    Matrix.multiplyMV(mLightPosInEyeSpace, 0, mViewMatrix, 0, mLightPosInWorldSpace, 0);
    GLES20.glUniform3f(muLightPosHandler,
            mLightPosInEyeSpace[0],
            mLightPosInEyeSpace[1],
            mLightPosInEyeSpace[2]);

Разница между этими двумя фрагментами заключается только в положении оси света. Вы можете получить весь исходный код здесь.

Причина я думаю 0.0f, 0.0f, 0.5f разумная позиция заключается в том, что центральная точка кубической передней грани 0.0f, 0,0f, 0.5f до трансформации. Так что это даст самый сильный кубический свет.

1 ответ

Решение

Это потому, что у вас есть точечный свет, который определяется световым конусом. На любом расстоянии до 2.8 конус недостаточно широк, чтобы осветить весь куб, как показано на следующем рисунке:

Чтобы зажечь все лицо куба, вам нужно либо отодвинуть свет дальше (как вы нашли), либо расширить световой конус.

Только с двумя треугольниками на лицо вы не получите много освещения в первом случае, так как ни одна из вершин не горит. Это свет на вершинах, которые определяют свет на лице. Если разбить модель на несколько граней, вы увидите эффект.

Другие вопросы по тегам