У меня есть объект из Blender, отображаемый в моей сцене, и нормали загружаются правильно. Я использую затенение Gourrad Diffuse, передавая ModelViewProjectionMatrix (CameraToClip * ModelToCamera) в шейдер и версию ModelToCameraMatrix 3x3 для умножения на нормали.
Однако, когда я устанавливаю для выходного цвета значение DiffuseColor * Angle, весь мой объект (куб в моем случае) просто исчезает (даже не черные линии, на моем сером фоне ничего не отображается). Когда я заменяю вывод цвета на
theColor = Vec4(1.0f, 1.0f, 1.0f, 1.0f);
он отображает мой объект белым цветом без каких-либо оттенков. Мне очень интересно, почему я ничего не вижу? Что-то не так с моим шейдером или с тем, как я передаю форму?
Вершинный шейдер:
#version 330
layout(location = 0) in vec4 position;
layout(location = 1) in vec3 normal;
smooth out vec4 theColor;
uniform mat4 modelViewProjectionMatrix;
uniform vec3 lightDir;
uniform mat3 normalModelToCameraMatrix;
void main()
{
gl_Position = modelViewProjectionMatrix * position;
vec3 normCamSpace = normalize(normalModelToCameraMatrix * normal);
vec4 diffuseColor = vec4(0.6f, 0.7f, 0.8f, 1.0f);
float angle = dot(normCamSpace, lightDir);
angle = clamp(angle, 0, 1);
theColor = diffuseColor * angle;
}
Метод рендеринга:
stack.Translate(glm::vec3(0.0f, 0.0f, 3.0f));
glm::vec4 lightDirCameraSpace = stack.Top() * glm::vec4(1.5f, 1.0f, 0.0f, 0.0f);
glUniform3fv(lightDirUnif, 1, glm::value_ptr(lightDirCameraSpace));
glm::mat3 normalMatrix(stack.Top());
glUniformMatrix3fv(normalModelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(normalMatrix));
// Draw Blender object
glBindVertexArray(this->load.vertexArrayOBject);
glm::mat4 modelViewProjectionMatrix = cameraToClipMatrix * stack.Top();
glUniformMatrix4fv(modelViewProjectionMatrixUnif, 1, GL_FALSE, glm::value_ptr(modelViewProjectionMatrix));
glDrawElements(GL_TRIANGLES, this->load.indicesVec.size(), GL_UNSIGNED_INT, 0);
Я не вижу, что не так ни с шейдером, ни с частью рендеринга.
Обновление При использовании glGetError кажется, что я постоянно получаю код ошибки 1285, который, по-видимому, связан с проблемами "Недостаточно памяти". Тем не менее, я не использую какие-либо текстуры, поэтому я не совсем понимаю, почему это происходит?
glGetError
и проверилиGL_COMPILE_STATUS
иGL_LINK_STATUS
ваших шейдеров? - person Tim   schedule 15.09.2012glGetError
? Обычно, когда что-то просто «исчезает», у вас где-то что-то сломалось, о чем будет сообщено при обнаружении ошибок. - person Tim   schedule 15.09.2012glGetError
через равные промежутки времени и подтверждаете, что оно всегда равно нулю? - person Tim   schedule 15.09.2012