Compartilhar via


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.

ilustração de um vetor normal para um rosto frontal

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.

ilustração de normais de vértice

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.

ilustração de uma superfície plana composta por dois triângulos com normais de vértice

É 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.

diagrama de duas superfícies (s1 e s2) e seus vetores normais e vetores normais de vértice

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.

diagrama de duas superfícies (s1 e s2) com um vetor normal de vértice que se inclina para um rosto

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.

ilustração de vetores normais de vértice duplicados em bordas afiadas

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.

sistemas de coordenadas e geometria