#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. Подумайте о том, чтобы поставить ему лайк, если это решило вашу проблему :).