Вы должны решить, что вы хотите сделать. Если вы хотите нарисовать координаты вершины 1: 1 в координатах окна (в пикселях), ваша проекция orthographi c верна.
Но если вы просто хотите позаботиться о соотношении сторон, то проекция должна быть :
public void setProjection(float width, float height)
{
final float ratio = width / height;
Matrix.orthoM(mProjection, 0, -1, 1, 1/ratio, -1/ratio, -1, 1);
}
В любом случае вам необходимо преобразовать координату вершины с помощью проекционной матрицы orthographi c в вершинном шейдере.
Добавить матричную униформу (mat4 uProjection
) в вершинный шейдер. Установите форму на mProjection
. Умножьте координату вершины на uProjection
в вершинном шейдере:
attribute vec4 vPosition;
uniform uProjection;
void main() {
gl_Position = uProjection* vPosition;
}
В качестве альтернативы вы можете вручную установить ортогональную c матрицу проекции в вершинном шейдере:
(Конечно, у вас есть установить униформу sWidth
соответственно sHeight
)
attribute vec4 vPosition;
uniform float sWidth;
uniform float sHeight;
void main() {
mat4 projection = mat4(1.0);
projection[1][1] = -sHeight/sWidth;
gl_Position = projection * vPosition;
};
Или, если вы хотите использовать координаты окна:
attribute vec4 vPosition;
uniform float sWidth;
uniform float sHeight;
void main() {
mat4 projection = mat4(
vec4( 2.0/sWidth, 0.0, 0.0, 0.0),
vec4( 0.0, -2.0/sHeight, 0.0, 0.0),
vec4( 0.0, 0.0, 1.0, 0.0),
vec4(-1.0, 1.0, 0.0, 1.0));
gl_Position = projection * vPosition;
};