2017-10-20 112 views
1

我有一個非常簡單的片段着色器:OpenGL - Uniform沒有正確傳遞?

#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); 
} 

它所做的就是標準化的統一VEC3我傳遞給它,然後我的片段顏色設置爲它(0和1之間 - 所以0矢量將具有0.5,0.5,0.5的顏色)。我用我的C++代碼打印這個矢量,並驗證它是否正確地與renderdoc一起傳入,但它吐出的實際顏色始終是錯誤的 - 它們似乎與我的制服沒有任何關係,但它總是不管怎樣,給我相同的顏色。例如,我的vec3應該有一個0的y座標,所以我期望0.5的綠色值,但根據renderdoc,我反而得到了一些東西.2

這可能是什麼原因?這讓我發瘋,並且讓我的複雜着色器完全無法工作。

編輯:通過統一的OpenGL的:

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:我想將它們作爲單獨的花車,和我得到完全相同的奇異數如前。 I've uploaded an image of what I mean - 左下方數字是我從COUT得到的,而右上方是RenderDoc是給我

這是我的制服傳球貌似現在的那些:

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; 

而且我的着色器:

#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); 
} 

東西很奇怪的正在發生......

+1

您可以發佈,實際上通過'alsoLightW'的着色器值的代碼:

你所有的結果將通過這個公式來確定? – Matso

+0

我使用信息更新了帖子 –

+0

「lightLocation」是如何獲得的?着色器是在什麼時候發生的? – lisyarus

回答

1

的問題是不是與統一(或傳遞均勻),但形式在渲染緩衝區。緩衝區有一個SRGB格式,這意味着它不會存儲線性顏色,但是可以進行伽瑪校正。

color_srgb = pow(color_rgb, 2.2);