我有一个非常简单的片段着色器:
#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 vector 的颜色将为0.5、0.5、0.5)。我在我的C++代码中打印出了这个 vector ,并验证了它是否与renderdoc一起正确传递,但是它喷出的实际颜色始终是错误的-它们似乎与我的制服无关,但始终给我一样的颜色例如,我的vec3的y坐标应该为0,所以我希望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);
}
发生了很奇怪的事情...
最佳答案
问题不在于统一(或通过统一),而在于渲染缓冲区的格式。缓冲区具有SRGB格式,这意味着它将不存储线性颜色,而是经过 Gamma 校正的颜色。
您的所有结果将由以下公式确定:color_srgb = pow(color_rgb, 2.2);