Pergunta

Eu tento implementar luzes ponto em OpenGL com GLSL. I enviar todos os dados necessários para os shaders. Para simplificar eu só uso a luz difusa aqui.

O meu exemplo mostra um triângulo enorme que eu quero iluminar com uma única fonte de luz. A fonte de luz é mostrado como um pequeno triângulo azul.

Para difusa I necessidade de luz para conhecer o ângulo entre a luz ea superfície. Portanto, eu calcular as normais e direção da luz. O produto ponto, então, dar-me um número entre -1 e 1 ao passo que tudo entre 0 e 1 é iluminado.

No entanto, aqui estou preso porque este ângulo é calculado incorretamente no meu exemplo. Uma vez que é difícil de shaders de depuração, eu usei várias saídas como a cor da minha superfície. Eu usei o normal, como a cor para o triângulo e onde a luz era, a superfície foi sempre verde. Ou seja, as normais apontar-se o eixo-y e, portanto, eles são computados direita. Ou seja, a direção da luz deve estar errado. No entanto, não consigo encontrar a razão pela qual é errado. A posição da luz e a posição vértice' são passados ??no espaço do mundo para o shader de vértice, que, em seguida, transforma-los para o espaço olho, calcular a direção da luz e passar isso para o shader de fragmento:

Vertex Shader:

vec4 pos = modelview_matrix * <input vertex>;
vec4 lightPos = modelview_matrix * <light position>;

vec3 lightDir = normalize(lightPos.xyz - pos.xyz);

fragmento de shader:

float NdotL = max(dot(normalize(<correct normal>), normalize(lightDir)), 0.0);
gl_FragColor = vec4(1.0, NdotL, 0.0, 1.0);

Eu já anexado algumas fotos deste exemplo que definitivamente mostram, que a interpolação é realmente estranho. Sei que querem saber se o código que eu colado está correto ou se você precisa saber mais do código. Além disso, é este comportamento interpolação normal, ou é um bug no meu código?

http://img41.imageshack.us/img41/3566/interpolation.png http://img189.imageshack.us/img189/3566/interpolation.png

especialmente a primeira imagem mostra que o ponto central da luz é não diretamente sob a luz, mas ligeiramente movido para o centro do triângulo.

Se eu passar "pos" para o shader de fragmento (ou seja, ele é interpolada) e depois calcular "lightDir" no shader de fragmento, tudo funciona bem.

Foi útil?

Solução

Eu acho que normalizar o seu lightDir no shader de vértice afeta o resultado que você começa quando interpolação dos vetores, porque leva o comprimento de fora da equação e, portanto, afeta a "velocidade" da interpolação.

Se você quer uma explicação (visual), tente desenhá-lo em 2D no papel. Primeiro desenhe uma linha (o triângulo) e um ponto (fonte de luz). Adicionar duas linhas (lightDir) para ambas as extremidades da linha para a fonte de luz e então encolher (normalizar) dessas linhas lightDir de modo que eles têm o mesmo comprimento e ambos se encontram na fonte de luz. Se você conectar ambas as extremidades das linhas lightDir normalizados você vai obter uma linha não-paralela (se a fonte de luz não é exatamente no meio da sua primeira linha). Agora, se você desenhar uma linha que vai exatamente no meio de uma das linhas que você vai ver que ele não passar pelo meio do outro lado da linha, mas vai bater-lo um pouco para a esquerda ou direita.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top