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ı:
- glGetActiveUniform reports uniform exists, but glGetUniformLocation returns -1
- glGetUniformLocation return -1 on nvidia cards
- glGetUniformLocation() returning -1 even though used in vertex shader
sonuncusu - ama benim durumumda, lightPosition
lightDirection
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.
Birden çok gölgelendirici programı kullanıyor musunuz? – Amadeus
@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
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. –