Opengl shadow -карта не визуализируется при перемещении объектаJAVA

Программисты JAVA общаются здесь
Anonymous
Opengl shadow -карта не визуализируется при перемещении объекта

Сообщение Anonymous »

Right now I'm attempting to implement point shadows in a LWJGL 3 engine, however I'm noticing that the shadowmap starts having issues once the position or rotation vectors are non-zero.
Test room when the room is rotated 9° on the Z axis
Test room when the room is moved -1 on the Y axis
Here's the code that Обновляет карту Shadow и отдает сцену. < /p>
public void renderShadow(List objs, Camera camera) {
GL11.glCullFace(GL11.GL_FRONT);
GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, depthMapFBO);
GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);

Matrix4f shadowProj = new Matrix4f().identity().perspective((float)Math.toRadians(90.0f), 1, 0.1f, 100.0f);
Matrix4f[] shadowTransforms = new Matrix4f[6];
Vector3f lightPos = new Vector3f(pointLights.get(0).position);
shadowTransforms[0] = new Matrix4f(shadowProj).mul(new Matrix4f().lookAt(lightPos,new Vector3f(lightPos).add(1,0,0), new Vector3f(0,-1,0)));
shadowTransforms[1] = new Matrix4f(shadowProj).mul(new Matrix4f().lookAt(lightPos,new Vector3f(lightPos).add(-1,0,0), new Vector3f(0,-1,0)));
shadowTransforms[2] = new Matrix4f(shadowProj).mul(new Matrix4f().lookAt(lightPos,new Vector3f(lightPos).add(0.0f,1f,0), new Vector3f(0,0,1)));
shadowTransforms[3] = new Matrix4f(shadowProj).mul(new Matrix4f().lookAt(lightPos,new Vector3f(lightPos).add(0,-1,0), new Vector3f(0,0,-1)));
shadowTransforms[4] = new Matrix4f(shadowProj).mul(new Matrix4f().lookAt(lightPos,new Vector3f(lightPos).add(0f,0,1), new Vector3f(0,-1,0)));
shadowTransforms[5] = new Matrix4f(shadowProj).mul(new Matrix4f().lookAt(lightPos,new Vector3f(lightPos).add(0,0,-1), new Vector3f(0,-1,0)));
GL11.glViewport(0, 0, size, size);
pointShadowShader.start();
pointShadowShader.setShadowMats(shadowTransforms);
pointShadowShader.setLight(pointLights.get(0).position);
for(RenderableObject obj : objs) {
pointShadowShader.setModel(MathUtil.getWorldMatrix(obj.pos, obj.rot, 1.0f));
obj.render();
}
pointShadowShader.stop();
GL11.glCullFace(GL11.GL_BACK);
GL11.glViewport(0, 0, window.getWidth(), window.getHeight());
}

public void renderWorld(List objs, Matrix4f projection, Camera camera) {
GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER,0);
worldShader.start();
GL30.glActiveTexture(GL30.GL_TEXTURE1);
GL30.glBindTexture(GL30.GL_TEXTURE_CUBE_MAP, depthCubemap);
worldShader.loadProjectionMatrix(projection);
worldShader.loadViewMatrix(camera);
worldShader.loadTime(time);
worldShader.loadLight(pointLights.get(0).position);
for(RenderableObject obj : objs) {
worldShader.loadTransformationMatrix(MathUtil.getWorldMatrix(obj.pos, obj.rot, 1.0f));
obj.render();
}
worldShader.stop();
}
< /code>
А вот код, который я использую для создания матрицы преобразования: < /p>
public static Matrix4f getWorldMatrix(Vector3f offset, Vector3f rotation, float scale) {
Matrix4f m = new Matrix4f();
m.translate(offset);
m.rotate((float)Math.toRadians(rotation.x),new Vector3f(1,0,0));
m.rotate((float)Math.toRadians(rotation.y),new Vector3f(0,1,0));
m.rotate((float)Math.toRadians(rotation.z),new Vector3f(0,0,1));
m.scale(scale);

return m;
}
< /code>
На стороне GLSL я использую шейдеры из учебного пособия LearnoPengl как для создания карты Shadow, так и для создания геометрии Lit. Поскольку эти шейдеры были скопированы с веб -сайта, я не верю, что должны быть какие -либо проблемы. Если свет перемещается, когда комната не перемещается, то, как вы ожидаете, прогнозируется карма Shadow. Поэтому моя непосредственная мысль состояла в том, чтобы рендерер Shadow Map отрицал вращение, когда он делает матрицу преобразования. И результаты здесь казались гораздо более точными. < /P>
К сожалению, это решение, казалось, не работало с вектором положения, и тени просто превратились в абсолютный беспорядок. Основная функция рендеринга, или если есть другие изменения, которые необходимо внести до того, как она будет отправлена ​​в шейдер.

Подробнее здесь: https://stackoverflow.com/questions/796 ... ject-moves

Вернуться в «JAVA»