GLSL Отправка цветовой формы данных Fragment Shader в Vertex Shader, кажется, всегда равна 0 - PullRequest
1 голос
/ 13 октября 2019

Итак, у меня есть равнина, и я хочу, чтобы она работала с картами высот, поэтому я просто использую heightMap как обычную текстуру, вычисляю ее цвет, но вместо того, чтобы установить цвет моих фрагментов на цвет текстуры, я установил свой начальный position.yдо position.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);
}

Итак, что я сделал здесь, это отправил текстурные координаты в вершинный шейдер, затем передал его фрагментному шейдеру, в фрагментном шейдере я вычисляю цвет текстуры, соответствующий текущей позиции, а затем отправляюэтот цвет обратно в Vertex Shader для выполнения расчетов. Однако кажется, что texColor.r всегда равно 0, поскольку сетка ведет себя так же, как и раньше, без изменений.

Я проверил, все ли правильно, фактически отобразив текстуру на моей сетке, и это выглядело нормально, но я неНе знаю, почему этот подход не работает.

Любая подсказка, где я допустил ошибку?

Спасибо за все ответы!

1 Ответ

0 голосов
/ 13 октября 2019

Так что я должен был просто сделать все это в вершинном шейдере, как это:

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