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. Direção do vetor é determinada pela ordem em que os vértices são definidos, e se o sistema de coordenadas é orientado à direita ou esquerda. A face normal aponta para longe do lado frontal da face. No Direct3D, somente a frente de um rosto fica visível. Uma face frontal é aquela na qual os vértices estão definidos em ordem no sentido horário.
Qualquer face que não é uma face frontal é uma face traseira. O Direct3D nem sempre renderiza faces traseiras; portanto, dizem que as faces traseiras são abatidas. Você pode alterar o modo de remoção para renderizar faces traseiras se desejar. Consulte Estado de abate (Direct3D 9) para obter mais informações.
O Direct3D usa as normais de unidade de vértice para os efeitos de sombreamento Gouraud, iluminação e texturização. A ilustração a seguir mostra normais de exemplo.
Ao aplicar o sombreamento Gourard em um polígono, o Direct3D usa as 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 entre todas as superfícies do primitivo. O Direct3D calcula o valor de intensidade de luz, usando o ângulo. Quanto maior o ângulo, menos a luz chega à 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 alcançar o sombreamento suave entre todos os triângulos na faixa é primeiro calcular o vetor normal de superfície para cada face poligonal à qual o vértice está associado. A normal de vértice pode ser definida para fazer um ângulo igual com cada superfície normal. No entanto, esse método talvez não seja eficiente o suficiente para primitivos complexos.
Esse método é ilustrado pelo diagrama a seguir, que mostra duas superfícies, S1 e S2 vistas a partir de cima. Os vetores normais de S1 e S2 são mostrados em azul. O vetor normal de vértice é mostrado em vermelho. O ângulo que o vetor normal de vértice faz com a superfície normal de S1 é igual ao ângulo entre a normal de vértice e a normal de superfície de S2. Quando essas duas superfícies são iluminadas e sombreadas com sombreamento Gouraud, o resultado é uma borda suavemente sombreada, suavemente arredondada entre eles.
Se a normal de vértice estiver em direção a uma das faces com a qual ela está associada, ela fará com que a intensidade de luz aumente ou diminua para os pontos nessa surface, dependendo do ângulo que ela faz com a fonte de luz. O diagrama a seguir mostra um exemplo. Novamente, essas superfícies são vistas no limite. A normal de vértice está na direção C1, fazendo com que ela tenha um ângulo menor com a fonte de luz do que se a normal de vértice tivesse ângulos iguais com as normais de superfície.
Você pode usar o sombreamento Gouraud para exibir alguns objetos em uma cena 3D com bordas afiadas. Para fazer isso, duplize 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 a cena, defina o objeto com bordas afiadas como uma lista de triângulos, em vez de uma faixa de triângulos. Quando você define um objeto como uma faixa triangular, o Direct3D trata isso como um único polígono composto de várias faces triangulares. O sombreamento Gouraud é aplicado em cada face do polígono e entre as faces adjacentes. O resultado é um objeto que é suavemente sombreado de face para face. Como uma lista de triângulos é um polígono composto de uma série de faces triangulares separadas, o Direct3D aplica o sombreamento Gouraud em cada face do polígono. No entanto, ele não é aplicado de face para face. Se dois ou mais triângulos de uma lista de triângulos forem adjacentes, eles aparentam ter uma borda afiada entre eles.
Outra alternativa é alterar para o sombreamento simples ao renderizar objetos com bordas afiadas. Computacionalmente, este é o método mais eficiente, mas isso resultar em objetos na cena que não são renderizados de forma tão realista quanto os objetos que estão com sombreamento Gouraud.
Tópicos relacionados