2016-03-21 15 views
3

bu vertex shader var kullanılan bir üniforma için:OpenGL -1 döndürür var olduğunu ve

#version 430 core 

layout (location = 0) in vec3 position; 
layout (location = 1) in vec2 textureCoordinate; 
layout (location = 2) in vec3 normal; 
layout (location = 4) in vec3 tangent; 

uniform mat4 projectionMatrix; 
uniform mat4 modelViewMatrix; 
uniform vec3 lightPosition = vec3(0.0, 1.0, 0.0); 

out vec2 texCoord; 
out vec3 lightDirection; 
out vec3 eyeDirection; 

void main() { 
    vec4 P = modelViewMatrix * vec4(position, 1.0); 
    vec3 N = normalize(mat3(modelViewMatrix) * normal); 
    vec3 T = normalize(mat3(modelViewMatrix) * tangent); 
    vec3 B = cross(N, T); 
    vec3 L = lightPosition - P.xyz; 
    vec3 V = -P.xyz; 

    lightDirection = normalize(vec3(dot(V, T), dot(V, B), dot(V, N))); 
    eyeDirection = normalize(vec3(dot(V, T), dot(V, B), dot(V, N))); 
    texCoord = textureCoordinate; 

    gl_Position = projectionMatrix * P; 
} 

Ve bu shader parçası:

#version 430 core 

in vec2 texCoord; 
in vec3 lightDirection; 
in vec3 eyeDirection; 

layout (binding = 0) uniform sampler2D tex; 
layout (binding = 1) uniform sampler2D normalMap; 

out vec4 color; 

void main() { 
    vec3 ambient = vec3(0.1); 

    vec3 V = normalize(eyeDirection); 
    vec3 L = normalize(lightDirection); 
    vec3 N = normalize(texture(normalMap, texCoord)).rgb * 2.0 - vec3(1.0); 
    vec3 R = reflect(-L, N); 

    vec3 diffuseAlbedo = texture(tex, texCoord).rgb; 
    /*vec3 diffuseAlbedo = vec3(1.0);*/ 
    vec3 diffuse = max(dot(N, L), 0.0) * diffuseAlbedo; 

    vec3 specular = vec3(0.0); 

    color = vec4(ambient + diffuse + specular, 1.0); 
} 

Gördüğünüz gibi, değişken lightPosition olduğunu Aslında hesaplamalarda kullanılmıştır. Ama bunun yerini aracılığıyla almak istediğimde, -1'u alırım.

O olanlar gibi, burada SO diğer sorularla baktı:

Özellikle

sonuncusu - ama benim durumumda, lightPositionlightDirection hesaplamak için kullanılır ve bu daha sonra parça gölgelendiricide kullanılır. Bu yüzden kaldırılmamalıdır.

Burada neler olduğu hakkında bir fikrin var mı? Ya da bu nasıl hata ayıklanır?

Ayrıca: Forma için varsayılan bir değer ayarladım. Varsayılan değeri kaldırırsam, hala -1 verir.

Nvidia 340.96 sürücüleri ve bir GF 710M kartı ile Ubuntu 15.10 çalıştırıyorum. Çekirdek profiliyle OpenGL 4.4 çalıştırıyorum.

+0

Birden çok gölgelendirici programı kullanıyor musunuz? – Amadeus

+0

@Amadeus no, sadece bir tane. Bu, yumru haritalama için basit bir testtir, bu yüzden sadece bir düzlem, bir dağınık doku ve bir normal haritaya sahiptir. Bu kadar. Olabildiğince basit. – poetryofruins

+0

Aslında "glGetUniformLocation()" yöntemini nasıl çağırdığınızı göstermeniz gerekir. Birincisi, bunu arayabilmeniz için programın birbirine bağlı olması gerekiyor. GlGetUniformLocation() 'ın bir bağlama gerektirmediği halde, bir tür bağlama ile ilgili sorun da olabilir. –

cevap

6

... Gördüğünüz gibi, değişken lightPosition aslında hesaplamalarda kullanılır. ...

Düşünürseniz haklısınız. Aslında bundan sonra Vertex Shader'da vec3 L'a bir değer atamak için kullanıyorsunuz.

Gölgelendiriciler için derleme işlemi çok titizdir. Vertex Shader'da bir hesaplamada kullanmış olabilirsiniz, ancak sonucu L hiçbir zaman kullanmadınız ve Fragment Shader'da hesaplanan son sonuca hiçbir katkı sağlamadınız, bu yüzden "optimize edildi".

L ürününü kullanmanız gerekir.

+0

Bunun için kullandığım kitapta bir hata olduğunu düşünüyorum - SuperBible 6th ed.dan 'lightDirection' hesaplama değiştirdikten sonra : ' lightDirection = normalize (vec3 (nokta (V, T), nokta (V, B), nokta (V H))); ' için: ' lightDirection = normalleştir (vec3 (nokta (L, T), nokta (L, B), nokta (L, N))); (sizin önerdiğiniz gibi "L" yi kullanır) her şey çalışmaya başladı. Teşekkürler! – poetryofruins

+0

remarque: Böyle bir durumda, 1E-15 * var bir yere ekliyorum. Etkisi yok, ama optimizasyonu önler :-) –

+0

@FabriceNEYRET Kinda, en başta optimizasyonun amacını ortadan kaldırır. OpenGL, -1'de ayarlanan üniformaları sessizce yok sayar, bu yüzden en iyi duruma getirilmiş olabileceğini görmezden gelmek en iyisidir. Tabii ki, zamanın en iyi duruma getirileceğini bilemezseniz, o zaman teoride, sürücünün bile bir no-op (tamamen anlamsız bir çaba IMO) olduğuna karar vermek zorunda kalmasını engelleyebilirsiniz. –

İlgili konular