В первую очередь,
float ratio = windowWidth / windowHeight;
Скорее всего, не делает то, что вы имели в виду при написании этого кода. windowWidth
и windowHeight
имеют тип int
, поэтому /
выполнит целочисленное деление до преобразования результата в float
. В результате ratio
будет проводить большую часть своего времени ровно в 1. А иногда может быть 0 (если высота> ширина). И иногда может быть 2 (на некоторых широкоэкранных установках). Скорее всего, что вы хотите, это что-то вроде этого:
float ratio = (float)windowWidth / (float)windowHeight;
Однако даже тогда, когда вы вычисляете свою матрицу
Matrix4 projection = Matrix4.CreateOrthographic(ratio * 10, ratio * 10, -1, 1);
вы масштабируете ширину и высоту с помощью ratio
, что означает, что независимо от того, какое соотношение получится в итоге, вы снова получите матрицу для квадратного видового экрана (поскольку ширина и высота одинаковы). Скорее всего, вы хотите, например, масштабировать только ширину с соотношением сторон
Matrix4 projection = Matrix4.CreateOrthographic(ratio * 10, 10, -1, 1);
Помимо всего этого, обратите внимание, как большая часть реальной функциональности дублируется в обеих ветвях вашего оператора if
. Также обратите внимание, что вы просто пропускаете случай, когда ширина и высота равны. Вы можете переписать всю эту группу, например, так:
float ratio = (float)ClientRectangle.Width / (float)Math.Max(ClientRectangle.Height, 1);
Matrix4 projection = Matrix4.CreateOrthographic(ratio * 10, 10, -1, 1);
GL.UniformMatrix4(uProjectionLocation, true, ref projection);