Я пытаюсь отобразить карту высот с помощью обычной карты, используя OpenGL и GLSL. Что я до сих пор: Квадратная сетка с высотой, обновляемая в вершинном шейдере на основе карты высот. Сформирован нормальная текстура Примера оды одного предложения этого типа: http://www.leadwerks.com/wiki/images/0/08/Terr16.JPGOpenGL рендеринг hieghtmap с нормальной картой
местность не имеет касательные или вершинные нормали. Я не могу заставить свою световую систему работать без этих атрибутов. Я предполагаю, что я должен использовать матрицу TBN для корректного создания векторов. Но как это сделать без вершинного нормального или касательного? Есть ли более простой способ, чем сложное воспроизведение всего? Действительно ли это утечка нормального преобразования? Или мой метод расчета света неправильный? кодекса фрагменты:
ВС:
vec4 pos=vertex_position;//grid position (only x,z)
pos.y=((texture(heightmap_tex,uv_coords).x)*scale_height);
pos.w=1.0;//to be safe
vec4 P=viewMatrix*pos;
vec3 L=mat3(MVmatrix)*vec3(worldLightPos)-P.xyz;
Out.lightDir=L;
vec3 V=-P.xyz;
Out.eyeDir=V;
Out.texCOORD=uv_coords;
gl_Position = MVPmatrix * pos;
FS:
vec3 V=normalize(In.eyeDir);
vec3 L=normalize(In.lightDir);
vec2 norm_texture=texture(texturenormal,In.TexCoord).xy*2.0-vec2(1.0);
vec3 N=normalize(vec3(norm_texture,sqrt(1.0-dot(norm_texture.xy, norm_texture.xy))*2.0-vec3(1.0)));//unpacking from 2 channel
vec3 R=reflect(-L,N);//phong
vec3 specular=pow(max(dot(R,V),0.0),shininess)*specularColor;//phong
vec3 diffuse=max(dot(N,L),0.1)*vec3(texColor);//phong
Сейчас местность становится ярче/темнее на основе камеры влево/вправо вращение. Так что это далеко не правильно.
Прямо сейчас рельеф становится ярче/темнее, основываясь на вращении влево/вправо. Так что это далеко не правильно. – Skides
Вам не нужны тангенсы для нормальной карты местности, если вы не деформируете ее. Я думаю, что ваш расчет 'L' в вершинном шейдере выглядит немного подозрительным. Что такое 'MVmatrix' и что происходит, когда вы создаете из него' vec3'? – GuyRT