我有一个非常简单的片段着色器: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);
}
东西很奇怪的正在发生......
您可以发布,实际上通过'alsoLightW'的着色器值的代码:
你所有的结果将通过这个公式来确定? – Matso
我使用信息更新了帖子 –
“lightLocation”是如何获得的?着色器是在什么时候发生的? – lisyarus