Простой вопрос, я только что получил свой первый зеркальный шейдер, и, изучая математику, я не могу помочь подумать, что угол между каждым краем должен вызывать «зеркальность», чтобы вспять/стать зубчатым. Но его полностью жидкость/сферическая.Почему основная зеркальная затеняющая жидкость, а не зубчатая?
Идея состоит в том, чтобы вычислить угол от вершины-нормали, но их так много, и тем не менее «зеркальный оттенок» получается совершенно ровным.
Я не могу видеть, как gpu знает угол фрагмента, основанный только на одной вершине.
редактировать: верт шейдер
#version 400 core
layout (location = 0) in vec3 vertex_position;
layout (location = 2) in vec2 tex_cord;
layout (location = 3) in vec3 vertex_normal;
uniform mat4 transform; //identity matrix
uniform mat3 lmodelmat; //inverse rotation
out vec2 UV;
out vec3 normal;
void main()
{
UV=tex_cord;
normal=normalize(vertex_normal*lmodelmat); //normalize to keep brightness
gl_Position=transform*vec4(vertex_position,1.0);
}
и осколочной
#version 400 core
in vec2 UV;
in vec3 normal;
uniform sampler2D mysampler;
uniform vec3 lightpos; //lights direction
out vec4 frag_colour;
in vec3 vert2cam; //specular test
void main()
{
//skip invis frags
vec4 alphatest=texture(mysampler,UV);
if(alphatest.a<0.00001)discard;
//diffuse'ing fragment
float diffuse=max(0.1,dot(normal,lightpos));
//specular'izing fragment
vec3 lpnorm=normalize(lightpos); //vector from fragment to light
vec3 reflection=normalize(reflect(-lpnorm,normal)); //reflection vector
float specularity=max(0,dot(lpnorm,reflection));
specularity=pow(specularity,50);
frag_colour=alphatest*diffuse+specularity;
}
// Редактировать
Я нашел ответ на это кстати (год спустя): Вертикальные нормали (vn) являются комбинированным значением для каждого из f асы/треугольники, соединенные с ним. То есть, одна вершина, соединенная с несколькими гранями, будет иметь граничные нормали, объединенные при нормализации. Это значение vn, рассчитывается как среднее из соседних граничных нормалей. Когда значение рассчитано для указания яркости, графический процессор будет обеспечивать «затенение», которое является нормализованным кросс-продуктом каждой из соседних сторон.
Я понял это, когда перерасчет лица нормалей для проекта им делать:
псевдокода пересчитывать Vertice нормалей:
for (for each face/triangle, find face-normal and add to adjacent vn's)
vec3 face_normal=cross(face[1]-face[0],face[2]-face[0]);
vn[0]+=face_normal; //notice +=
vn[1]+=face_normal;
vn[2]+=face_normal;
//then just normalize them to get the weighted average
for(auto&x:vn)x=normalize(x);
Это будет, для визуализатора, приравнивает как усредненные кривой, и не зазубренный край (плоское затенение)
Вы используете Gouraud или Phong shading? –
Я бы предположил, что происходит какая-то интерполяция. Но без какого-либо кода трудно сказать, что происходит. –
вы бы назвали это phong shading? его в основном cosA между отражением света и вершиной нормали добавляется к цвету. Я просто не могу видеть, как glsl читает его как четную кривую, когда im вводит только несколько значений – Charlie