Ich habe eine extrem einfache Fragment-Shader bekam:OpenGL - Uniform nicht richtig übergeben?
#version 330 core
// Interpolated values from the vertex shaders
in vec3 positionW;
// Output data
out vec3 frag_color;
uniform vec3 alsoLightW;
void main(void) {
vec3 temp = normalize(alsoLightW);
frag_color = vec3((temp.x + 1.0)/2, (temp.y + 1.0)/2, (temp.z + 1.0)/2);
}
Alles, was es tut, ist eine einheitliche vec3 normalisieren Ich habe an sie übergeben, und setzen Sie es meine Fragmentfarbe (zwischen 0 und 1 - so eine Ein Vektor hätte eine Farbe von 0,5, 0,5, 0,5). Ich drucke diesen Vektor in meinem C++ Code aus und vergewissere mich, dass er mit renderdoc korrekt übergeben wurde, aber die tatsächlichen Farben, die er ausspuckt, sind durchweg falsch - sie scheinen nichts mit meiner Uniform zu tun zu haben, aber es ist immer so gib mir trotzdem die gleiche Farbe. Zum Beispiel soll mein vec3 eine y-Koordinate von 0 haben, also erwarte ich einen grünen Wert von 0,5, aber laut renderdoc bekomme ich stattdessen etwas .2
Was könnte der Grund dafür sein? Es hat mich verrückt gemacht und macht meinen viel komplizierteren Shader überhaupt nicht funktionierend.
Edit: Uniform OpenGL vorbei:
ctx.shader->Enable();
...
glm::vec3 oppOffset = *Object::globalOffset;
oppOffset *= -1;
glUniform3fv(lightLocation, 1, glm::value_ptr(oppOffset));
glm::vec3 norm = glm::normalize(oppOffset);
//Prints the correct information
std::cout << (norm.x + 1)/2 << "," << (norm.y + 1)/2 << "," << (norm.z + 1)/2 << std::endl;
Edit2: Ich habe versucht, sie als einzelne Wagen vorbei, und ich exakt die gleichen seltsamen Zahlen wie zuvor bekommen. I've uploaded an image of what I mean - links unten Zahlen sind die, die ich bin von cout bekommen, und das oben rechts sind diejenigen, die RenderDoc mir geben
Dies ist, was meine Uniform Gang sieht aus wie jetzt:
glm::vec3 norm = glm::normalize(oppOffset);
norm = (norm + glm::vec3(1.0, 1.0, 1.0)) * glm::vec3(0.5, 0.5, 0.5);
float x, y, z;
x = norm.x;
y = norm.y;
z = norm.z;
ctx.shader->uniform1fv("lightx", 1, &x);
ctx.shader->uniform1fv("lighty", 1, &y);
ctx.shader->uniform1fv("lightz", 1, &z);
std::cout << x << "," << y << "," << z << std::endl;
Und mein Shader:
#version 330 core
// Interpolated values from the vertex shaders
in vec3 positionW;
// Output data
out vec3 frag_color;
uniform float lightx;
uniform float lighty;
uniform float lightz;
void main(void) {
//vec3 temp = normalize(alsoLightW);
frag_color = vec3(lightx, lighty, lightz);
}
Etwas sehr seltsam passiert ...
Können Sie nach dem Code, der den Wert von 'alsoLightW' an den Shader tatsächlich passiert? – Matso
Ich habe die Post mit der Information aktualisiert –
Und wie wird 'lightLocation' erhalten? Ist der Shader gebunden, wenn es passiert? – lisyarus