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

标签 c++ opengl glsl shader fragment-shader

所以我有一个平面,我希望它与高度贴图一起使用,所以我只是将 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,因为网格的行为与之前相同,没有任何变化。

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

有什么线索是我哪里出错了吗?

谢谢大家的回答!

最佳答案

所以我应该做的就是像这样在顶点着色器中简单地完成所有操作:

#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);
};

关于c++ - GLSL 将颜色数据从片段着色器发送到顶点着色器似乎总是等于 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58363745/

相关文章:

glsl - 计算向量的余弦

opengl - opengl 和 GLSL 有什么区别?

java - 有什么方法可以通过 JNI 获取指向 Java 数组的直接指针吗?

android - c++ android ndk 使用数组

c++ - 确定数组是否可以排序旋转 3 个连续的数组元素?

c# - 在锁定的系统上渲染 3D 场景

opengl - 无法在glsl中使用 '%'

opengl - 实现使用统一 Sampler2D (lwjgl) 的片段着色器

c++ - 创建原始 OpenGL 纹理数据 (C++)

字符串的 C++ fwrite 和 fread