Неправильная реализация Shadow Mapping в Libgdx - PullRequest
0 голосов
/ 30 июня 2019

Привет хотел освоить методы компьютерной графики, начиная с теневого картирования. Я пытался реализовать это, основываясь на некоторых статьях в Интернете, но все идет не так, как надо. Я действительно борюсь. Может кто-нибудь помочь мне с кодом? (или иначе, если у вас есть реализация Shadow Maps в Libgdx, я бы хотел это увидеть).

Вот два шейдера для карты глубины:

attribute vec3 a_position;
attribute vec3 a_normal;
attribute vec2 a_texCoord0;

uniform mat4 u_worldTrans;
uniform mat4 u_projViewTrans; //Light Camera

varying vec4 v_positionLightFrame;

void main() {
    v_positionLightFrame = u_projViewTrans * u_worldTrans * vec4(a_position, 1.0);
    gl_Position = v_positionLightFrame;
}
#ifdef GL_ES
precision mediump float;
#endif

varying vec4 v_positionLightFrame;
uniform float cameraFar;

void main()
{
    gl_FragColor = vec4(v_positionLightFrame.z/cameraFar, v_positionLightFrame.z/cameraFar, v_positionLightFrame.z/cameraFar, 1.0);
}

В настоящее время я храню все в текстуре RGBA. Я знаю, что я должен использовать простую текстуру только с одним каналом. Вот два шейдера, используемых для рендеринга:

attribute vec3 a_position;
attribute vec3 a_normal;
attribute vec2 a_texCoord0;

uniform mat4 u_worldTrans;
uniform mat4 u_projViewTrans; 
uniform mat4 dLightCamProjView; //"The Light Camera"

varying vec4 v_positionLS;
varying vec2 v_texCoords;

void main() {
    v_texCoords = a_texCoord0;
    v_positionLS =  dLightCamProjView*u_worldTrans * vec4(a_position, 1.0);
    gl_Position = u_projViewTrans* u_worldTrans * vec4(a_position, 1.0);
}
#ifdef GL_ES
precision mediump float;
#endif

varying vec4 v_positionLS;
varying vec2 v_texCoords;


uniform sampler2D depthMap;
uniform sampler2D diffuseTexture;
uniform float cameraFar;

void main()
{
    vec3 color = vec3(0.0f,0.0f,0.0f);
    vec4 pos_aux = v_positionLS;
    vec3 pos = pos_aux.xyz;
    pos.xy = pos.xy/pos_aux.w;
    pos.xy = pos.xy * 0.5 + 0.5;
    pos.z = pos.z/cameraFar;
    float diff = pos.z - texture(depthMap, pos.xy).z;
    if(diff< 0.002)
    {
        color = texture(diffuseTexture, v_texCoords).rgb;
    }
    gl_FragColor = vec4(color, 1.0f);
}

Вот результат, который я получаю: image


В случае, если вы хотите, чтобы мои параметры в libgdx:

cam = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
cam.position.set(255.f,255.f,-2.54f);
cam.lookAt(0,0,0);
cam.near = 1f;
cam.far = 1000f;
cam.update();

dLight = new DirectionalLight(new Vector3(-0.7f, -0.7f, 0.0f), new Vector3(0.8f, 0.8f, 0.8f));
dLightCam = new PerspectiveCamera(67, DEPTH_SIZE, DEPTH_SIZE);
dLightCam.position.set(255f,255f,-2.54f);
dLightCam.lookAt(new Vector3(0.0f, 0.0f, 0.0f));
dLightCam.far = 1000f;
dLightCam.update();
fboDLight = new FrameBuffer(Pixmap.Format.RGBA8888, DEPTH_SIZE, DEPTH_SIZE, true);
depthMap = new Texture(DEPTH_SIZE, DEPTH_SIZE, Pixmap.Format.RGBA8888);

Я использую перспективную камеру вместо орфографической, потому что планирую использовать точечный свет.

Спасибо.

...