2015-05-09 3 views
2

Я, в прошлом месяце, следил за учебниками на разных страницах (learnopengl.com) среди других.
Я добрался до секции освещения (я создал загрузчик, чтобы сначала загружать сетки с Assimp), мой код fragmentshader почти такой же, как и подсветка учебников (learnopengl.com/basic_lighting).Освещение OpenGL 3.3 дает поистине странные ошибки

код Frag:

#version 130 

out vec4 outColor; 

in vec3 fragPos; 
in vec3 normal; 
in vec2 texcoord; 

uniform sampler2D tex; 
uniform vec3 lightPos; 
uniform vec3 lightColor; 

void main(){ 
    float ambientStrength = 0.1f; 
    vec3 ambient = ambientStrength * lightColor; 

    //Diffuse 
    vec3 norm = normalize(normal); 
    vec3 lightDir = normalize(lightPos - fragPos); 
    float diff = max(dot(norm, lightDir), 0.0f); 
    vec3 diffuse = diff * lightColor; 
    float objectColor = 0.5f; 
    //texture(tex, texcoord) 
    vec3 result = (ambient + diffuse) * objectColor; 
    outColor = vec4(result, 1.0f); 
} 

Когда, например, освещение самолет дает мне эти результаты:

OpenGLplane_light_distortions

Когда я не зажигая самолет это обычный серый.

Вот файл .obj или самолет:

Blender v2.69 (sub 0) OBJ File: 'plane.blend' 
# www.blender.org 
mtllib plane.mtl 
o Plane 
v 10.000000 0.000000 10.000000 
v -10.000000 0.000000 10.000000 
v 10.000000 0.000000 -10.000000 
v -10.000000 0.000000 -10.000000 
vn 0.000000 1.000000 0.000000 
usemtl None 
s off 
f 2//1 1//1 3//1 
f 4//1 2//1 3//1 

Это получить в корректном импортировано, каждой вершине нормали {0, 1, 0} и индексы также правильны.

При поиске таких вещей, как «OpenGL light disortions» или просто «OpenGL lighting», я не могу найти ничего подобного. Поэтому я действительно не знаю, что случилось.

О да, я использую openGL 3.3, и у меня встроенный Intel GPU. CPU - это ядро ​​i3-2367M от Intel, если есть проблема с оборудованием.

Спасибо за ваше время: D

EDIT:

Так что я просто пытался показать цвет моих нормалей на плоскости, они должны быть твердыми зелеными, но они это мерзость:

OpenGL disortion Normals

Я также сваливать свою vertexshadercode здесь:

#version 130 
in vec3 position; 
in vec3 normal; 
in vec2 texCoord; 


out vec3 fragPos; 
out vec3 Normal; 
out vec2 texcoord; 

uniform mat4 transform; 
uniform mat4 view; 
uniform mat4 projection; 

void main(){ 
    texcoord = texCoord; 
    Normal = normal; 
    fragPos = vec3(transform * vec4(position, 1.0f)); 
    gl_Position = projection * view * transform * vec4(position, 1.0); 
} 

Вот как я создал свою сетку:

void mesh::bindVertices(){ 
    glBindVertexArray(vertexArrayObject); 

    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
    glBufferData(GL_ARRAY_BUFFER, this->vertices.size() * sizeof(Vertex), &vertices[0], GL_STATIC_DRAW); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, this->indices.size() * sizeof(GLuint), &indices[0], GL_STATIC_DRAW); 



    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)0); // Position 

    glEnableVertexAttribArray(1); 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, normal)); //Normal 

    glEnableVertexAttribArray(2); 
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, texCoord)); //Texcoord 


    glBindVertexArray(0); 

} 

Vertex.h

#ifndef VERTEX_H 
#define VERTEX_H 

#include <vector> 
#include <glm/glm.hpp> 

class Vertex 
{ 
    public: 
     Vertex(){ 
      position = glm::vec3(0.0f, 0.0f, 0.0f); 
      normal = glm::vec3(0.0f, 0.0f, 0.0f); 
      texCoord = glm::vec2(0.0f, 0.0f); 
     }; 

     Vertex(glm::vec3 pos, glm::vec3 nor, glm::vec2 tex){ 
      setUpVertex(pos, nor, tex); 
     }; 
     ~Vertex(){} 

     void setUpVertex(glm::vec3 pos, glm::vec3 nor, glm::vec2 tex){ 
      this->position = pos; 
      this->normal = nor; 
      this->texCoord = tex; 
     }; 

     void print(){ 
      std::cout << "Position: { " << position.x << ", " << position.y << ", " << position.z << " }\n"; 
      std::cout << "Normals: { " << normal.x << ", " << normal.y << ", " << normal.z << " }\n"; 
      std::cout << "Texture Coordinates: { " << texCoord.x << ", " << texCoord.y << " }" << std::endl; 
     } 
     glm::vec3 position; 
     glm::vec3 normal; 
     glm::vec2 texCoord; 

    protected: 
    private: 

}; 

#endif // VERTEX_H 

Функция печати есть для отладки, и выводит правильные значения, так что я действительно понятия не имею, что не является продолжается.
Одна вещь, которая не представляет проблемы: загрузка в модели - это то, что мне удалось собрать, и нормали ведут себя очень странно.

+0

Трудно сказать, что происходит, вам следует разместить больше кода. – derhass

+0

@derhass Думайте, что этого будет достаточно? Есть ли какие-то конкретные образцы кода, которые вы хотите, или вы хотите, чтобы я просто сбросил весь проект здесь? – Tritzium

ответ

2

Вы неправильно передаете свои нормальные данные из вершинного шейдера в шейдер фрагмента. Вы используете out vec3 Normal в VS, но in vec3 normal (обратите внимание на строчку) в FS, поэтому ваше входное значение просто не определено.

+0

Итак, всякий раз, когда я передаю значения между vertexshader и fragmentshader, переменная out на VS должна иметь то же имя, что и значение в FS?
Я этого не знал, спасибо вам большое. Теперь это работает! : D – Tritzium

+0

В этом случае да. (Есть более продвинутые вещи, такие как ['GL_ARB_separate_shader_objects'] (https://www.opengl.org/registry/specs/ARB/separate_shader_objects.txt), где сопоставление также может быть выполнено с использованием определенных пользователем мест, но вы следует игнорировать это здесь). – derhass

 Смежные вопросы

  • Нет связанных вопросов^_^