Почему масштабирование GLKit приводит к затемнению цвета/освещения?

Я вижу странное поведение, которое я не могу понять. По какой-то причине, когда я применяю масштаб (по оси z), моя полигональная сетка с текстурным отображением становится затемненной, как будто освещение внезапно отключается или диффузный цвет устанавливается на 0. Если я реверсирую масштаб (чтобы масштабирование вернулось к 0), затем цвет снова становится ярким и насыщенным.

* Обновление с дополнительной информацией. * Яркость кажется нормальной, когда значения z в моих вершинах соответствуют исходным/инициализированным значениям. Но когда я масштабирую по оси z, это когда цвет тускнеет (не совсем темный, но заметное изменение яркости). Я использую индексный буфер для рендеринга.

С чем может быть связан этот "глюк"?

Код, связанный с этим, находится здесь:

float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height);
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(60.0f), aspect, 0.1f, 100.0f);

self.effect.transform.projectionMatrix = projectionMatrix;

// Compute the model view matrix for the object rendered with GLKit
GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 15.0f, -90.0f);
modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, rotationAngle, 0, 1, 0);

// where g_depthScale is a value that increases based on a slider control.
modelViewMatrix = GLKMatrix4Scale(modelViewMatrix, 0.1f, 0.1f, g_depthScale);

self.effect.transform.modelviewMatrix = modelViewMatrix;

person AlvinfromDiaspar    schedule 29.04.2013    source источник
comment
Самая распространенная ошибка при этом заключается в том, что когда вы используете масштаб, вы также масштабируете нормали. Нормализуйте нормали, чтобы они всегда имели длину 1.   -  person Matic Oblak    schedule 29.04.2013
comment
@Матик. Преобразуйте этот комментарий в ответ, и награда достается вам.   -  person AlvinfromDiaspar    schedule 30.04.2013
comment
в порядке. я включил glEnable(GL_NORMALIZE) во время инициализации. Теперь вся текстура полностью черная. Это совершенно неожиданно!   -  person AlvinfromDiaspar    schedule 01.05.2013
comment
возможно, glEnable(GL_NORMALIZE) не работает, потому что я использую GLKitBaseEffect (который, я думаю, является основным готовым способом создания пиксельных шейдеров). Если это так, я считаю, что нормализация через OpenGL не работает.   -  person AlvinfromDiaspar    schedule 01.05.2013
comment
Вы знаете, вы можете просто нормализовать нормаль в любом из шейдеров, поскольку вы, похоже, их используете. Просто обратите внимание на этот момент, что вам нужно нормализовать вектор 3d, а не 4d.   -  person Matic Oblak    schedule 06.05.2013


Ответы (1)


Как говорит Matic Oblak, вы можете масштабировать нормали по мере масштабирования модели.

Дешевый и простой способ масштабирования всей сцены — изменить угол обзора проекционной матрицы, см. OpenGL ES 2.0 Pinch and Zoom

person AlunAlun    schedule 29.04.2013
comment
В порядке. Если это правда (мне еще предстоит проверить, каковы мои нормали... что я даже не уверен, как это сделать после их инициализации), то это должно быть глупейшая ошибка. Я имею в виду, это ошибка, верно? - person AlvinfromDiaspar; 30.04.2013