Привет хотел освоить методы компьютерной графики, начиная с теневого картирования.
Я пытался реализовать это, основываясь на некоторых статьях в Интернете, но все идет не так, как надо. Я действительно борюсь. Может кто-нибудь помочь мне с кодом? (или иначе, если у вас есть реализация 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);
}
Вот результат, который я получаю:
В случае, если вы хотите, чтобы мои параметры в 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);
Я использую перспективную камеру вместо орфографической, потому что планирую использовать точечный свет.
Спасибо.