OpenGL - Uniform传递不正确吗?

时间:2017-10-20 09:10:41

标签: c++ opengl glsl

我有一个非常简单的片段着色器:

#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坐标,所以我希望Green值为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 个答案:

答案 0 :(得分:1)

问题不在于制服(或传递制服),而在于渲染缓冲的格式。缓冲区具有SRGB格式,这意味着它不会存储线性颜色,而是存储经过伽马校正的颜色。

所有结果将由以下公式确定:

color_srgb = pow(color_rgb, 2.2);