Отображение параллакса - GLSL- OpenGL

0

В последние несколько дней я пытался реализовать сопоставление параллакса в своем движке, но он, похоже, не работает, я видел как минимум 15 примеров, и я все еще не могу заставить его работать

Вот изображение: Изображение 174551

Как вы можете видеть, все, что вы можете видеть, это базовый цвет, на карте высоты нет

Вот мои шейдеры:

Fragment Shader

#version 330 core
uniform sampler2D DiffuseTextureSampler;
uniform sampler2D HeightTextureSampler;
vec2 scaleBias = vec2(0.5,0.5); 
in vec3 EyeDirection_tangentspace;
in vec2 UV;
void main() 
{ 
 float height = texture2D(HeightTextureSampler, vec2 (UV.x, -UV.y)).r; 
 //Our heightmap only has one color channel.
 float v = height * scaleBias.r - scaleBias.g; 
 vec3 eye = EyeDirection_tangentspace; 
 vec2 newCoords = UV + (eye.xy * v); 

 vec3 rgb = texture2D(DiffuseTextureSampler,  vec2 (newCoords.x, -newCoords.y)).rgb; 
 gl_FragColor = vec4(rgb, 1.0); 
}






Vertex Shader

#version 330 core

// Input vertex data, different for all executions of this shader.
layout(location = 0) in vec3 vertexPosition_modelspace;
layout(location = 1) in vec2 vertexUV;
layout(location = 2) in vec3 vertexNormal_modelspace;
layout(location = 3) in vec3 vertexTangent_modelspace;
layout(location = 4) in vec3 vertexBitangent_modelspace;

// Output data ; will be interpolated for each fragment.
out vec2 UV;
out vec3 Position_worldspace;
out vec3 EyeDirection_cameraspace;
out vec3 LightDirection_cameraspace;

out vec3 LightDirection_tangentspace;
out vec3 EyeDirection_tangentspace;

// Values that stay constant for the whole mesh.
uniform mat4 MVP;
uniform mat4 V;
uniform mat4 M;
uniform mat3 MV3x3;
uniform vec3 LightPosition_worldspace;

void main() 
{ 
 gl_Position = MVP * vec4(vertexPosition_modelspace,1);

Position_worldspace = (M * vec4(vertexPosition_modelspace,1)).xyz;

    // Vector that goes from the vertex to the camera, in camera space.
    // In camera space, the camera is at the origin (0,0,0).
    vec3 vertexPosition_cameraspace = ( V * M * vec4(vertexPosition_modelspace,1)).xyz;
    EyeDirection_cameraspace = vec3(0,0,0) - vertexPosition_cameraspace;


 UV = vertexUV;
 vec3 vertexTangent_cameraspace = MV3x3 * vertexTangent_modelspace;
    vec3 vertexBitangent_cameraspace = MV3x3 * vertexBitangent_modelspace;
    vec3 vertexNormal_cameraspace = MV3x3 * vertexNormal_modelspace;

 mat3 TBNMatrix = transpose(mat3(vertexTangent_cameraspace, vertexBitangent_cameraspace, vertexNormal_cameraspace)); 
 EyeDirection_tangentspace = Position_worldspace - vertexPosition_modelspace.xyz; 
 EyeDirection_tangentspace *= TBNMatrix; 
}
  • 1
    Укажите свою height как gl_FragColor.rgb чтобы увидеть, правильно ли вы получили карту высот. Затем сделайте то же самое с newCoords чтобы увидеть, есть ли у вас какие-либо колебания в линейных newCoords по экрану. Таким образом, вы сможете найти проблему.
  • 0
    Привет и спасибо за ваш ответ. Я попробовал это, и текстура карты высот выглядит белой и черной. Я также сделал то же самое с newCoords , но все так же.
Теги:
opengl
glsl
3d
parallax

1 ответ

1

пара вещей

  1. установите свой масштаб на 1. Нет смысла сокращать вдвое свою высоту, если вы не видите ее вообще.

  2. (ВАША ТЕКУЩАЯ ПРОБЛЕМА) вы получаете координаты текстуры с помощью -UV. У Opengl нет отрицательных текстурных координат. получение негатива ничего не вытащит из текстуры, или, что еще хуже, будет текстурировано зеркало, если у вас есть плитка.

  3. (ВАША СЛЕДУЮЩАЯ ПРОБЛЕМА) нормализуйте вектор глаз перед вычислением новых координат в фрагменте. если вы не нормализуетесь, координаты XY вектора будут ОГРОМНЫМИ, поэтому ваши новые координаты текстуры будут MASSIVE смещениями.

попробуйте эти шейдеры. они очень просты и работают. вам нужно будет добавить освещение после того, как вы получите параллакс

Вершинный шейдер

attribute vec3 tangent;
attribute vec3 binormal;
uniform vec3 CAMERA_POSITION;
varying vec3 eyeVec;
void main()
{
    gl_Position = ftransform();
    gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;

    mat3 TBNMatrix = mat3(tangent, binormal, gl_Normal);
    eyeVec = CAMERA_POSITION - gl_Vertex.xyz;
    eyeVec *= TBNMatrix;
}

фрагментарный шейдер

uniform sampler2D basetex;
uniform sampler2D heightMap;
uniform vec2 scaleBias;
varying vec3 eyeVec;
void main()
{
    float height = texture2D(heightMap, gl_TexCoord[0].st).r;

    float v = height * scaleBias.r - scaleBias.g;
    vec3 eye = normalize(eyeVec);
    vec2 newCoords = texCoord + (eye.xy * v);

    vec3 rgb = texture2D(basetex, newCoords).rgb;
    gl_FragColor = vec4(rgb, 1.0);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню