Opengl / glsl: передать массив с плавающей точкой в ​​текстуру - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь передать float *, который содержит 128 * 128 float, в шейдер. Поскольку этот массив слишком велик, я пытаюсь пройти мимо текстуры, чтобы мой float * попал в мой шейдер. Проблема в том, что я не знаю, как использовать этот массив внутри моего шейдера. Я печатаю свой float * перед отправкой в ​​мой шейдер, и он содержит числа от -1 до 1.

Моя цель - симулировать волны на воде с перлин-шумом, поэтому мой массив float - это перлин-шумы.

Итак, я создаю свою текстуру шума следующим образом:

_perlin_noise = new float[_dimension * _dimension];

//... I put float inside my _perlin_noise variable

//Then I instantiate my texture : 

glGenTextures(1, &_perlin_noise_text);
glBindTexture(GL_TEXTURE_2D, _perlin_noise_text);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, _dimension, _dimension, 0,
    GL_RED, GL_FLOAT, _perlin_noise);


glActiveTexture(0);
glBindTexture(GL_TEXTURE_2D, 0);

В моей воде используются две текстуры: одна текстура полностью синего цвета, другая - текстура пены. Так что теперь у меня есть третья текстура, это мой перлин-шум. И я хочу отрегулировать высоту моих вершин с помощью шума перлина.

Итак, прежде всего, я назначаю равномерную переменную своему шейдеру следующим образом:

main_water_shader->use();
glUniform1i(glGetUniformLocation(main_water_shader->getProgram(), "main_water_texture"), 0);
glUniform1i(glGetUniformLocation(main_water_shader->getProgram(), "foam_texture"), 1);
glUniform1i(glGetUniformLocation(main_water_shader->getProgram(), "perlin_noise"), 2);

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

uniform sampler2D perlin_noise;
//some other uniform...

void main()
{
    //calculating vertex height
    float height = float( texture2D(perlin_noise, vec2(x, y)) ); 
    vec3 new_vertex_position = vertex_position;
    new_vertex_position.y = height;

    //Standard stuff
    vs_position = vec4(ModelMatrix * vec4(new_vertex_position, 1.f)).xyz;
    vs_texcoord = vec2(vertex_texcoord.x, vertex_texcoord.y );
    vs_normal = mat3(ModelMatrix) * vertex_normal;

    gl_Position = ProjectionMatrix  * ViewMatrix * ModelMatrix * vec4(new_vertex_position, 1.f);
}

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

enter image description here

Вы можете увидеть мою плоскость (которая являетсяочень большой) с черно-белой текстурой, которая повторяется. Поэтому я предполагаю, что моя текстура perlin_noise содержит что-то (даже если это немного странно), но я не могу понять, как использовать ее в моем вершинном шейдере.

РЕДАКТИРОВАТЬ: В моем скриншоте я также используюВершинный шейдер с высотой, отрегулированной с помощью перлин-шума, но, как вы можете видеть, моя плоскость плоская, поэтому она не работает.

EDIT2: Если я не достаточно ясен, скажите мне

...