Autor Wątek: Problem z macierzą 2D  (Przeczytany 304 razy)

Offline Dragomirus

  • Użytkownik

# Lipiec 29, 2017, 23:19:29
Witam,
ostatnio próbuje zakodzić sobie prosty sposób na renderowanie sceny 2d (dla GUI) i natknąłem się na problem związany z macierzami. Mam jedno VAO z wierzchołkami: (-1f, 1f), (-1f, -1f), (1f, 1f), (1f, -1f) i renderuje je triangle_strip'em. Ponad to mój kod wygląda tak:

Kod tworzący macierze:
public static Matrix4f createOrthoProjectionMatrix(float left, float right,
float bottom, float top, float far, float near)
{
Matrix4f result = new Matrix4f();

result.m00 = 2.0f / (right - left);
result.m01 = 0.0f;
result.m02 = 0.0f;
result.m03 = 0.0f;

result.m10 = 0.0f;
result.m11 = 2.0f / (top - bottom);
result.m12 = 0.0f;
result.m13 = 0.0f;

result.m20 = 0.0f;
result.m21 = 0.0f;
result.m22 = -2.0f / (far - near);
result.m23 = 0.0f;

result.m30 = -(right + left) / (right - left);
result.m31 = -(top + bottom) / (top - bottom);
result.m32 = -(far + near) / (far - near);
result.m33 = 1.0f;
return result;
}

public static Matrix4f createTransformationMatrix(Vector2f position, Vector2f scale)
{
Matrix4f matrix = new Matrix4f();
matrix.setIdentity();
Matrix4f.translate(position, matrix, matrix);
Matrix4f.scale(new Vector3f(scale.x, scale.y, 1.0f), matrix, matrix);
return matrix;
}

Kod renderujący:
Matrix4f projMatrix = MagicMaths.createOrthoProjectionMatrix(0f,
screenWidth,
screenHeight,
0f, -1f, 1f);
Matrix4f modelMatrix = MagicMaths.createTransformationMatrix(
pos,
size);
program.setUniformMatrix("u_projMatrix", projMatrix);
program.setUniformMatrix("u_modelMatrix", modelMatrix);
quadVAO.render();

Kod shadera:
#version 330

in vec2 a_position;

uniform mat4 u_modelMatrix;
uniform mat4 u_projMatrix;

void main(void)
{
gl_Position = u_projMatrix * u_modelMatrix * vec4(a_position, 0.0, 1.0);
}

Niestety rendering dla zmiennych: pos = (0, 0) i size = (100, 100) nie działa ponieważ nic się nie wyświetla (po prostu chcę wyświetlić prostokąt, gdzie pos (0, 0) jest w lewym górnym rogu ekranu, a size to są jego wymiary w pikselach). Jednak gdy usunę z shadera uniform u_projMatrix i dam dane: pos = (0.5, 0.5) i size = (0.25, 0.25) to kod działa, ale dla współrzędnych openGL, gdzie punkt (0, 0) to środek ekranu. a (1, 1) to prawy górny róg. Macie jakieś pomysły może co jest nie tak. Będą wdzięczny za każdą pomoc :)

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Dragomirus

  • Użytkownik

# Lipiec 30, 2017, 17:11:18
Temat do zamknięcia okazuje się, że problem był z macierzą, która powinna wyglądać tak:
public static Matrix4f createOrthographicMatrix(float left, float right,
float bottom, float top, float far, float near)
{
Matrix4f result = new Matrix4f();
result.setIdentity();

//First row
result.m00 = 2.0f / (right - left);
result.m10 = 0.0f;
result.m20 = 0.0f;
result.m30 = -((right + left) / (right - left));

//Second row
result.m01 = 0.0f;
result.m11 = 2.0f / (top - bottom);
result.m21 = 0.0f;
result.m31 = -((top + bottom) / (top - bottom));

//Third row
result.m02 = 0.0f;
result.m12 = 0.0f;
result.m22 = 2.0f / (far - near);
result.m32 = -((far + near) / (far - near));

//Fourth row
result.m03 = 0.0f;
result.m13 = 0.0f;
result.m23 = 0.0f;
result.m33 = 1.0f;
return result;
}
Gdzie Matrix4f jest to standardowa macierz z lwjgl 2.9.3 i używam jej tak:
Matrix4f projMatrix = MagicMaths.createOrthographicMatrix(0f,
width,
height,
0f, 0f, 1f);
Temat można zamknąć, ale komuś się to może przydać bo w necie mało informacji o tym jest :).