Programação com OpenGL/Modern OpenGL Tutorial Leitor de OBJ: diferenças entre revisões

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
Linha 139:
Eu enganei um pouco e implementei um modelo de iluminação de Gouraud, vamos melhorar aos poucos.
 
== Flat-shading - duplicando verticesvértices e normals ==
[[File:OpenGL Tutorial Suzanne flat-shading.png|thumb|Suzanne com flat-shading]]
Como discutimos em [[../Modern_OpenGL_Tutorial_06|Tutorial de texturização]], as algumas vértices obtém um valor diferente dependendo de qual face é usado
Isto acontece se nós não compartilharmos as normals (e escolheu um rosto arbitrário quando calcularmos uma vertex' normal, como fizemos acima). Neste caso nós precisamos duplicar um vértice toda vez que for usado com uma normal diferente e depois recriando o array de elementos. Isto fará que demore mais tempo para carregar mas será mais rápido para o OpenGL processo a longo prazo. quanto menos vértices for enviado para OpenGL melhor. ou, como dizemos anteriormente, neste exemplo apenas duplicaremos as vértices uma única vez quando eles aparecem e nós podemos fazer sem a array de elementos.
<source lang="cpp">
for (int i = 0; i < elements.size(); i++) {
vertices.push_back(shared_vertices[elements[i]]);
if ((i % 3) == 2) {
GLushort ia = elements[i-2];
GLushort ib = elements[i-1];
GLushort ic = elements[i];
glm::vec3 normal = glm::normalize(glm::cross(
shared_vertices[ic] - shared_vertices[ia],
shared_vertices[ib] - shared_vertices[ia]));
for (int n = 0; n < 3; n++)
normals.push_back(normal);
}
}
</source>
<source lang="cpp">
glDrawArrays(GL_TRIANGLES, 0, suzanne_vertices.size());
</source>
 
Com este ajuste, nós podemos ter uma flat-shading: a variável varying atualmente varia entre os vértices no fragment shader, por que as normal serão os mesmos para as 3 vértices do triângulo.
 
== Calculando as normals ==