2017-10-20 5 views
1

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

+1

Können Sie nach dem Code, der den Wert von 'alsoLightW' an den Shader tatsächlich passiert? – Matso

+0

Ich habe die Post mit der Information aktualisiert –

+0

Und wie wird 'lightLocation' erhalten? Ist der Shader gebunden, wenn es passiert? – lisyarus

Antwort

1

Das Problem ist nicht mit dem einheitlichen (oder dem Bestehen der Uniform), aber mit der Form am Renderpuffer. Der Puffer hat ein SRGB-Format, was bedeutet, dass keine linearen Farben sondern gammakorrigierte Farben gespeichert werden.

Alle Ihre Ergebnisse werden durch diese Gleichung bestimmt werden:

color_srgb = pow(color_rgb, 2.2);

Verwandte Themen