OpenGL Diffuse Shader, объект не отображается

У меня есть объект из 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, который, по-видимому, связан с проблемами "Недостаточно памяти". Тем не менее, я не использую какие-либо текстуры, поэтому я не совсем понимаю, почему это происходит?


person Joey Dewd    schedule 15.09.2012    source источник
comment
Вы проверили наличие ошибок с glGetError и проверили GL_COMPILE_STATUS и GL_LINK_STATUS ваших шейдеров?   -  person Tim    schedule 15.09.2012
comment
@Tim: Да, я проверяю свои шейдеры на ошибки, когда компилирую их, и никаких ошибок не появляется, что означает, что они должны были скомпилироваться успешно.   -  person Joey Dewd    schedule 15.09.2012
comment
И glGetError? Обычно, когда что-то просто «исчезает», у вас где-то что-то сломалось, о чем будет сообщено при обнаружении ошибок.   -  person Tim    schedule 15.09.2012
comment
@Tim: Информация о компиляторе говорит, что все скомпилировано идеально, поэтому ошибок на уровне шейдера нет.   -  person Joey Dewd    schedule 15.09.2012
comment
Вы не отвечаете на мой вопрос. Я не спрашиваю информацию о компиляторе, я спрашиваю, проверяете ли вы в своей программе значение результата glGetError через равные промежутки времени и подтверждаете, что оно всегда равно нулю?   -  person Tim    schedule 15.09.2012
comment
@Tim: извините, я все еще новичок в OpenGl. Я поместил вызов glGetError в свой метод рендеринга, и он отобразил код ошибки: 1285. Посмотрел его в Google, и кажется, что это ошибка нехватки памяти. Я понятия не имею, от чего это могло произойти, хотя o.O. Я предполагаю, что это где-то в шейдере, поскольку все отображается просто отлично, когда я вручную добавляю цвет в шейдер.   -  person Joey Dewd    schedule 15.09.2012
comment
Нет проблем, просто пытаюсь спросить как можно четче. Можете ли вы найти, из какой строки исходит сообщение об ошибке? Я бы порекомендовал разбросать glGetErrors по всему коду и установить точку останова в первый раз, когда он утверждает.   -  person Tim    schedule 15.09.2012
comment
Кроме того, вы можете просто опубликовать весь свой код opengl, чтобы я мог увидеть, сделали ли вы что-то явно неправильное, что может привести к такой ошибке. Я сам немного озадачен, почему вы получили это.   -  person Tim    schedule 15.09.2012
comment
@tim: я локализовал ошибку в вызове этой функции: glDrawElements(GL_TRIANGLES, this-›load.indicesVec.size(), GL_UNSIGNED_INT, 0); но, к сожалению, мало помогает. Это означает, что это где-то в бэкенде OpenGL или шейдерах.   -  person Joey Dewd    schedule 15.09.2012
comment
давайте продолжим это обсуждение в чате   -  person Tim    schedule 15.09.2012
comment
Я бы также рекомендовал изучить расширение GL_ARB_debug_output; это дает вам локализованные, значимые сообщения об ошибках прямо в момент сбоя. Это НАМНОГО лучше, чем традиционный подход glGetError() к бинарному поиску.   -  person postgoodism    schedule 17.09.2012
comment
@postgoodism: Спасибо, я поищу это расширение. Мне трудно отлаживать openGL, и подобная информация очень помогает, спасибо! :)   -  person Joey Dewd    schedule 18.09.2012


Ответы (1)


Я предполагаю, что вы:

  1. включение смешивания и / или альфа-теста
  2. умножая ваш angle на альфа-канал
  3. получение значения, которое на самом деле не то, что вы хотите для угла, заканчивающееся 0 для всех важных угловых случаев

Таким образом, альфа = 0, полигон полностью прозрачен/проверен альфа-каналом.

Что вы должны сделать в первую очередь, так это убедиться, что альфа всегда равна 1.f, и модулировать только rgb. Вы также можете отключить смешивание/альфа-тест.

Затем исправьте математику, которая фактически вычисляет переменную угла, как вы хотите.

person Bahbar    schedule 15.09.2012
comment
Я не включал смешивание, и, чтобы убедиться, что я даже отключил смешивание, это не имело никакого эффекта. Альфа-канал действительно может быть проблемой, поэтому я сделал цветовой вектор, в котором я умножил каналы RGB на угол и вручную добавил альфа-канал с 1.0f, а затем вывел этот цвет. Не работает. Однако странно то, что если мой угол равен 0 или -1 (что означает, что математика неверна), он должен отображать как минимум «черный» куб, потому что, если я вручную вставлю 0 или -1 вместо угла, это просто отображает черный куб. Так что проблема, к сожалению, ни в одном из этих пунктов :(. - person Joey Dewd; 15.09.2012
comment
@JoeyDewd: да, я согласен, исчезновение не имеет особого смысла, отсюда и теория прозрачного / альфа-теста. Ну что ж. Это было предположение! - person Bahbar; 15.09.2012
comment
@JoeyDewd: на самом деле, дополнительные данные интересны. Что произойдет, если вы попробуете theColor = normCamSpace; ? - person Bahbar; 15.09.2012
comment
Хм, следующая строка дает тот же результат, но без куба: theColor = vec4(normCamSpace.x, normCamSpace.y, normCamSpace.z, 1.0f); Я не уверен, как это может что-то означать? :) - person Joey Dewd; 15.09.2012
comment
Нормали должны быть в порядке, код .obj выглядит так, как должен, и нормали также правильно загружены. Это не должно быть проблемой, потому что, если что-то не так с нормалями, он должен, по крайней мере, отображать черный куб (без цвета) вместо ничего. Похоже, что настоящая проблема — это проблема «недостаточно памяти» с кодом ошибки 1285. Причина до сих пор неизвестна. - person Joey Dewd; 16.09.2012