着色器翻转输出图像
Shader flips output image
我一直在努力找出为什么我的图像有时会在着色器 运行 并输出结果后翻转的问题。
我将位置和法线图像输入到我的着色器中以执行基本的光照计算。位置和法线图像的方向正确,但生成的输出似乎最终会翻转。这也发生在我的 SSAO 通道中,SSAO 通道翻转图像,但 SSAO 的模糊通道随后将取消翻转图像恢复正常。
我用过
vec2(1.0 - uvCoords.x, uvCoords.y);
虽然这确实会将图像反转回正常状态,但它也会反转键盘输入和鼠标控制,因此不是理想的解决方案。
着色器输出到创建为的四边形:
std::vector<Vertex> Quad = {
// pos // color //texcoords
{{-1.0f, -1.0f, 0.0f}, {1.0f, 0.0f, 0.0f}, {1.0f, 0.0f}},
{{1.0f, -1.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f}},
{{1.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {0.0f, 1.0f}},
{{-1.0f, 1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {1.0f, 1.0f}},
{{-1.0f, -1.0f, 0.0f}, {1.0f, 0.0f, 0.0f}, {1.0f, 0.0f}},
{{1.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {0.0f, 1.0f}},
};
光照通道着色器:
void main() {
vec3 FragPos = texture(gPosition, uvCoords).rgb;
vec3 Normal = texture(gNormal, uvCoords).rgb;
float ambientValue = 0.1;
vec3 ambient = ambientValue * light.LightColor.xyz;
vec3 lightingDirection = normalize(light.LightPosition.xyz - FragPos);
float diffCalc = max(dot(Normal, lightingDirection), 0.0);
vec3 diffuse = diffCalc * light.LightColor.xyz;
vec3 result = (ambient + diffuse) * light.ObjectColor.xyz;
outColor = vec4(result, 1.0);
}
我正在以正确的方向显示 G 缓冲区法线以及最终翻转的最终照明通道输出图像:
你的 uv 坐标网格中的 x 轴似乎翻转了
std::vector<Vertex> Quad = {
// pos // color //texcoords
{{-1.0f, -1.0f, 0.0f}, {1.0f, 0.0f, 0.0f}, {1.0f, 0.0f}},
{{1.0f, -1.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f}},
{{1.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {0.0f, 1.0f}},
{{-1.0f, 1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {1.0f, 1.0f}},
{{-1.0f, -1.0f, 0.0f}, {1.0f, 0.0f, 0.0f}, {1.0f, 0.0f}},
{{1.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {0.0f, 1.0f}},
};
你可以看到 pos x = -1.0f 映射到 texcoord 1.0f,pos x 1.0f 映射到 0.0f,所以它确实翻转了 x 轴。
Layout should be
std::vector<Vertex> Quad = {
// pos // color //texcoords
{{-1.0f, -1.0f, 0.0f}, {1.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
{{1.0f, -1.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {1.0f, 0.0f}},
{{1.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}},
{{-1.0f, 1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {0.0f, 1.0f}},
{{-1.0f, -1.0f, 0.0f}, {1.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
{{1.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}},
};
我一直在努力找出为什么我的图像有时会在着色器 运行 并输出结果后翻转的问题。
我将位置和法线图像输入到我的着色器中以执行基本的光照计算。位置和法线图像的方向正确,但生成的输出似乎最终会翻转。这也发生在我的 SSAO 通道中,SSAO 通道翻转图像,但 SSAO 的模糊通道随后将取消翻转图像恢复正常。
我用过
vec2(1.0 - uvCoords.x, uvCoords.y);
虽然这确实会将图像反转回正常状态,但它也会反转键盘输入和鼠标控制,因此不是理想的解决方案。
着色器输出到创建为的四边形:
std::vector<Vertex> Quad = {
// pos // color //texcoords
{{-1.0f, -1.0f, 0.0f}, {1.0f, 0.0f, 0.0f}, {1.0f, 0.0f}},
{{1.0f, -1.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f}},
{{1.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {0.0f, 1.0f}},
{{-1.0f, 1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {1.0f, 1.0f}},
{{-1.0f, -1.0f, 0.0f}, {1.0f, 0.0f, 0.0f}, {1.0f, 0.0f}},
{{1.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {0.0f, 1.0f}},
};
光照通道着色器:
void main() {
vec3 FragPos = texture(gPosition, uvCoords).rgb;
vec3 Normal = texture(gNormal, uvCoords).rgb;
float ambientValue = 0.1;
vec3 ambient = ambientValue * light.LightColor.xyz;
vec3 lightingDirection = normalize(light.LightPosition.xyz - FragPos);
float diffCalc = max(dot(Normal, lightingDirection), 0.0);
vec3 diffuse = diffCalc * light.LightColor.xyz;
vec3 result = (ambient + diffuse) * light.ObjectColor.xyz;
outColor = vec4(result, 1.0);
}
我正在以正确的方向显示 G 缓冲区法线以及最终翻转的最终照明通道输出图像:
你的 uv 坐标网格中的 x 轴似乎翻转了
std::vector<Vertex> Quad = {
// pos // color //texcoords
{{-1.0f, -1.0f, 0.0f}, {1.0f, 0.0f, 0.0f}, {1.0f, 0.0f}},
{{1.0f, -1.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f}},
{{1.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {0.0f, 1.0f}},
{{-1.0f, 1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {1.0f, 1.0f}},
{{-1.0f, -1.0f, 0.0f}, {1.0f, 0.0f, 0.0f}, {1.0f, 0.0f}},
{{1.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {0.0f, 1.0f}},
};
你可以看到 pos x = -1.0f 映射到 texcoord 1.0f,pos x 1.0f 映射到 0.0f,所以它确实翻转了 x 轴。
Layout should be
std::vector<Vertex> Quad = {
// pos // color //texcoords
{{-1.0f, -1.0f, 0.0f}, {1.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
{{1.0f, -1.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {1.0f, 0.0f}},
{{1.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}},
{{-1.0f, 1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {0.0f, 1.0f}},
{{-1.0f, -1.0f, 0.0f}, {1.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
{{1.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}},
};