Процедурная сетка на плоскости в 3D-пространстве в opengl

#c #opengl #3d #glsl

#c #opengl #3D #glsl

Вопрос:

У меня есть простая графическая программа, написанная на c , которая использует opengl для рендеринга. У меня есть плоскость, которую я рисую в начале координат, и я хочу добавить к ней текстуру процедурной сетки. В моем текущем фрагментном шейдере я выполняю только некоторые вычисления освещения:

 #version 330 core
out vec4 FragColor;

in vec3 Normal;  
in vec2 TexCoord;
in vec3 FragPos;  

uniform vec3 objectColor;
uniform vec3 lightColor;
uniform vec3 lightPos;  


void main()
{

    float ambientStrength = 0.5;
    vec3 ambient = ambientStrength * lightColor;

    vec3 norm = normalize(Normal);
    vec3 lightDir = normalize(lightPos - FragPos);  

    float diff = max(dot(norm, lightDir), 0.0);
    vec3 diffuse = diff * lightColor;

    vec3 result = (((ambient   diffuse) * objectColor) * 0.5) ;
    FragColor = vec4(result, 1.0);
}


  

Мой вопрос заключается в том, является ли изменение фрагментного шейдера лучшим способом создания процедурной сетки на моей плоскости, и если да, то как мне следует писать такой шейдер?

Комментарии:

1. Поскольку у вас уже есть атрибут texcoord, вам необходимо создать текстуру, заполнить ее данными, привязать ее к текстурной единице, создать переменную uniform sampler, установить ее значение так, чтобы оно указывало на соответствующую текстурную единицу, выполнить выборку текстуры и объединить результат с вашим текущим кодом. Если вы вообще не хотите использовать текстуру, в этом случае вы можете поместить генерацию непосредственно в шейдер фрагментов.

2. @BartekBanachewicz Спасибо за предложение. Я не хочу использовать текстуры, но я борюсь с созданием сетки в шейдере фрагментов.

Ответ №1:

Самый простой способ сделать это — поиграть с тригонометрическими функциями. Поскольку вы уже передаете координаты текстуры.

Пусть интенсивность цвета max(cos(u), cos(v)) равна . Это даст вам начало. Затем вам следует поиграть с формулой cos, чтобы получить ее именно такой, какой вы хотите (т. Е. Умножьте ее на некоторые коэффициенты и применяйте к ней степени, пока она не будет выглядеть именно так, как вам нужно).

Комментарии:

1. Привет @Makogan. Спасибо за предложение. что означают «u» и «v» в приведенном выше примере кода?

2. координаты текстуры u и v, то есть первый и второй компоненты текстурных координат, вводятся в шейдер

3. Большое спасибо, это работает. Я постараюсь добавить готовую шейдерную программу, когда закончу.

4. Подумайте о том, чтобы поставить ему лайк, если это решило вашу проблему :).