Vetores normais de face e vértice (Direct3D 9)
Cada rosto em uma malha tem um vetor normal de unidade perpendicular, conforme mostrado na ilustração a seguir. A direção do vetor é determinada pela ordem na qual os vértices são definidos e se o sistema de coordenadas é destro ou canhoto. O rosto normal aponta para longe do lado da frente do rosto. No Direct3D, somente a frente de um rosto é visível. Um rosto frontal é aquele em que os vértices são definidos em ordem no sentido horário.
Qualquer rosto que não seja um rosto frontal é uma face traseira. O Direct3D nem sempre renderiza faces traseiras; portanto, dizem que as faces traseiras são eliminadas. Você pode alterar o modo de eliminação para renderizar faces de volta, se desejar. Consulte do Estado de Abate (Direct3D 9) para obter mais informações.
O Direct3D usa os normais de unidade de vértice para efeitos de sombreamento, iluminação e texturaud gouraud. A ilustração a seguir mostra normais de exemplo.
Ao aplicar o sombreamento Gouraud a um polígono, o Direct3D usa os normais de vértice para calcular o ângulo entre a fonte de luz e a superfície. Ele calcula os valores de cor e intensidade para os vértices e os interpola para cada ponto em todas as superfícies do primitivo. O Direct3D calcula o valor da intensidade da luz usando o ângulo. Quanto maior o ângulo, menos luz brilha na superfície.
Se você estiver criando um objeto simples, defina os normais de vértice para apontar perpendicular para a superfície, conforme mostrado na ilustração a seguir.
É mais provável, no entanto, que seu objeto seja composto por tiras de triângulo e os triângulos não sejam coplanares. Uma maneira simples de obter sombreamento suave em todos os triângulos na faixa é primeiro calcular o vetor normal da superfície para cada face poligonal com a qual o vértice está associado. O vértice normal pode ser definido para tornar um ângulo igual com cada superfície normal. No entanto, esse método pode não ser eficiente o suficiente para primitivos complexos.
Esse método é ilustrado pelo diagrama a seguir, que mostra duas superfícies, S1 e S2 vistas de cima. Os vetores normais para S1 e S2 são mostrados em azul. O vetor normal do vértice é mostrado em vermelho. O ângulo que o vetor normal de vértice faz com a superfície normal de S1 é o mesmo que o ângulo entre o vértice normal e a superfície normal de S2. Quando essas duas superfícies são iluminadas e sombreadas com sombreamento Gouraud, o resultado é uma borda suavemente sombreada e arredondada suavemente entre elas.
Se o vértice normal se inclina em direção a um dos rostos com os quais está associado, faz com que a intensidade da luz aumente ou diminua para pontos nessa superfície, dependendo do ângulo que faz com a fonte de luz. O diagrama a seguir mostra um exemplo. Novamente, essas superfícies são vistas no limite. O vértice normal inclina-se para S1, fazendo com que ele tenha um ângulo menor com a fonte de luz do que se o vértice normal tivesse ângulos iguais com os normais de superfície.
Você pode usar o sombreamento Gouraud para exibir alguns objetos em uma cena 3D com bordas afiadas. Para fazer isso, duplicar os vetores normais de vértice em qualquer interseção de rostos em que uma borda afiada é necessária, conforme mostrado na ilustração a seguir.
Se você usar os métodos DrawPrimitive para renderizar sua cena, defina o objeto com bordas afiadas como uma lista de triângulos, em vez de uma faixa de triângulo. Quando você define um objeto como uma faixa de triângulo, o Direct3D o trata como um único polígono composto por várias faces triangulares. O sombreamento gouraud é aplicado em cada face do polígono e entre rostos adjacentes. O resultado é um objeto que é sombreado suavemente de face a face. Como uma lista de triângulos é um polígono composto por uma série de rostos triangulares desarticulados, o Direct3D aplica o sombreamento Gouraud em cada face do polígono. No entanto, ele não é aplicado de cara a cara. Se dois ou mais triângulos de uma lista de triângulos forem adjacentes, eles parecem ter uma borda afiada entre eles.
Outra alternativa é alterar para sombreamento simples ao renderizar objetos com bordas afiadas. Esse é computacionalmente o método mais eficiente, mas pode resultar em objetos na cena que não são renderizados de forma tão realista quanto os objetos sombreados por Gouraud.
Tópicos relacionados
-
sistemas de coordenadas e geometria