Я создал простую 2D-область с использованием OpenGL, состоящую из плиток. Эти плитки по умолчанию растянуты относительно соотношения сторон экрана. Чтобы исправить это, я попытался использовать матрицу ортогональной проекции. Вот как я его создал:
public void createProjectionMatrix() {
float left = 0;
float right = DisplayManager.getScreenWidth();
float top = 0;
float bottom = DisplayManager.getScreenHeight();
float near = 1;
float far = -1;
projectionMatrix.m00 = 2 / (r - l);
projectionMatrix.m11 = 2 / (t - b);
projectionMatrix.m22 = -2 / (f - n);
projectionMatrix.m30 = - (r + l) / (r - l);
projectionMatrix.m31 = - (t + b) / (t - b);
projectionMatrix.m32 = - (f + n) / (f - n);
projectionMatrix.m33 = 1;
}
Проблема, вероятно, в этом, но я просто не могу ее найти. Затем я вызываю этот метод с созданием моего средства визуализации, сохраняю его в универсальной переменной и использую в вершинном шейдере следующим образом:
vec4 worldPosition = transformationMatrix * vec4(position, 0, 1);
gl_Position = projectionMatrix * viewMatrix * worldPosition;
Где projectionMatrix - это mat4, который соответствует ранее созданной ортогональной матрице проекции.
Прямо сейчас абсолютно ничего, кроме четкой цветопередачи.
РЕДАКТИРОВАТЬ:
Матрица ортогональной проекции создается и загружается в шейдеры сразу после создания средства визуализации и после создания шейдера.
public Renderer() {
createOrthoMatrix();
terrainShader.start();
terrainShader.loadProjectionMatrix(projectionMatrix);
terrainShader.stop();
GL11.glEnable(GL13.GL_MULTISAMPLE);
GL11.glClearColor(0, 0, 0.5f, 1);
}
Остальные матрицы передаются при каждом рендеринге с помощью метода loadUniforms ().
for(Terrain t : batch) {
loadUniforms(t, terrainManager, camera, lights);
GL11.glDrawElements(GL11.GL_TRIANGLES, model.getModel().getVertexCount(), GL11.GL_UNSIGNED_INT, 0);
}
private void loadUniforms(Terrain t, TerrainManager tm, Camera camera, List<Light> lights) {
Matrix4f matrix = Maths.createTransformationMatrix(t.getPosition(), 0, 0, 0, 1);
terrainShader.loadTransformationMatrix(matrix);
terrainShader.loadViewMatrix(camera);
terrainShader.loadNumberOfRows(tm.getNumberOfRows());
terrainShader.loadOffset(t.getOffset());
terrainShader.loadLights(lights);
}
Наконец, вот как выглядит вершинный шейдер:
#version 400 core
in vec2 position;
uniform mat4 transformationMatrix;
uniform mat4 viewMatrix;
uniform mat4 projectionMatrix;
void main(void) {
vec4 worldPosition = transformationMatrix * vec4(position, 0, 1);
gl_Position = projectionMatrix * viewMatrix * worldPosition;
}
orthoMatrix.m00 = 2 / (r - 1)
? Разве это не должно быть(r - l)
?1
! = _ 4_. - person genpfault   schedule 23.06.2015m00
,m01
,m10
,m11
и т. Д.? - person Reto Koradi   schedule 24.06.2015m00
иm11
на что-нибудь большое (например,100
), чтобы увидеть, так ли это). И вы можете переставить матрицу (поменять местами столбцы и строки). Вот почему @RetoKoradi захотел увидеть объявление матрицы. - person Nico Schertler   schedule 24.06.2015org.lwjgl.util.vector.Matrix4f
- person Dylan Deshler   schedule 24.06.2015orthoMatrix.m00 = (2 / (right - left)) * 100
иorthoMatrix.m11 = (2 / (top - bottom)) * 100
, но ничего не изменилось. Возможно, мне нужно переключить столбцы и строки. Не совсем уверен, как бы я это сделал, хотя - person Dylan Deshler   schedule 24.06.2015.m30
на.m03
и т. Д. - person Nico Schertler   schedule 24.06.2015Vector2f(1 , 1)
, поэтому z равен 0. - person Dylan Deshler   schedule 24.06.2015