Положение света в 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 конус недостаточно широк, чтобы осветить весь куб, как показано на следующем рисунке:
Чтобы зажечь все лицо куба, вам нужно либо отодвинуть свет дальше (как вы нашли), либо расширить световой конус.
Только с двумя треугольниками на лицо вы не получите много освещения в первом случае, так как ни одна из вершин не горит. Это свет на вершинах, которые определяют свет на лице. Если разбить модель на несколько граней, вы увидите эффект.