GLSL将颜色数据从片段着色器发送到顶点着色器似乎总是等于0

Posted

技术标签:

【中文标题】GLSL将颜色数据从片段着色器发送到顶点着色器似乎总是等于0【英文标题】:GLSL Sending color data form Fragment Shader to Vertex Shader seems to be always equal to 0 【发布时间】:2019-10-13 12:52:13 【问题描述】:

所以我有一个平原,我希望它与高度图一起工作,所以我只是将 heightMap 作为常规纹理,计算它的颜色,但我没有将片段的颜色设置为纹理的颜色,而是设置了我的初始 position.yposition.y + texColor.r * u_Scale,这样顶点的高度会根据纹理的颜色而变化。

#shader vertex
#version 330 core

layout(location = 0) in vec3 position;
layout(location = 1) in vec3 color_in;
layout(location = 3) in vec2 texCoord;

uniform mat4 u_MVP;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
uniform float u_Scale;

in vec4 texColor;

out vec3 FragPos;
out vec3 color_f;
out vec2 v_TexCoord;

void main()

    v_TexCoord = texCoord;
    color_f = color_in;

    vec3 newPosition = vec3(position.x, position.y + texColor.b * u_Scale, position.z);

    FragPos = vec3(model * vec4(newPosition, 1.0));

    gl_Position = projection * view * vec4(FragPos, 1.0);
;
#shader fragment
#version 330 core
out vec4 color;

in vec3 FragPos;
in vec2 v_TexCoord;
in flat vec3 color_f;

out vec4 texColor;

uniform sampler2D u_Texture;

void main()

    texColor = texture(u_Texture, v_TexCoord);

    color = vec4(color_f, 1.0);

所以我在这里所做的是将纹理坐标发送到顶点着色器,然后将其传递给片段着色器,在片段着色器中,我计算与当前位置对应的纹理颜色,然后将该颜色发送回顶点着色器进行计算.然而,texColor.r 似乎始终为 0,因为网格的行为与之前相同,没有任何变化。

我通过在我的网格上实际显示纹理来检查一切是否正确,看起来不错,但我不知道为什么这种方法不起作用。

任何线索我在哪里犯了错误?

感谢大家的回答!

【问题讨论】:

"然后我将该颜色发送回 Vertex Shader 以执行计算" 这到底是怎么发生的? @Rabbid76 是的 @NicolBolas 在片段着色器中有out vec4 texColor;,在顶点着色器中有in vec4 texColor; 这是我发送数据的想法 @StanisławSolarewicz:着色器管道不是。 Data flows in one direction only:从上到下。 @NicolBolas 嗯不知道,那么我如何在顶点着色器中获取颜色或从片段着色器发送颜色? 【参考方案1】:

所以我应该做的只是像这样在顶点着色器中完成这一切:

#shader vertex
#version 330 core

layout(location = 0) in vec3 position;
layout(location = 1) in vec3 color_in;
layout(location = 3) in vec2 texCoord;

uniform mat4 u_MVP;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
uniform float u_Scale;

in vec4 texColor;

out vec3 FragPos;
out vec3 color_f;

void main()

    vec4 texColor = texture(u_Texture, texCoord);

    color_f = color_in;

    vec3 newPosition = vec3(position.x, position.y + texColor.b * u_Scale, position.z);

    FragPos = vec3(model * vec4(newPosition, 1.0));

    gl_Position = projection * view * vec4(FragPos, 1.0);
;

【讨论】:

以上是关于GLSL将颜色数据从片段着色器发送到顶点着色器似乎总是等于0的主要内容,如果未能解决你的问题,请参考以下文章

glsl片段着色器颜色添加逻辑

GLSL/C++:自定义着色器的默认行为

片段着色器中设置的颜色未显示 GLSL 1.30

GLSL 问题:一个程序中有多个着色器

OpenGL、GLSL 片段着色器无法读取 Sampler2D 纹理

GLSL 将 uint 转换为 float 以获取颜色