我已经在我的设备上渲染了一个纯白色的圆圈,但是它根据屏幕尺寸成比例地在我的设备上延伸。翻阅2d的例子和可能的答案,我没有能够正确的缩放它。
我的渲染器类:
@Override
public void onSurfaceChanged(GL10 gl, int width, int height)
{
float scaleX = (float) width / Screen.getScreenWidthPx();
float scaleY = (float) height / Screen.getScreenHeightPx();
final int vpWidth = (int)(Screen.getScreenWidthPx() * scaleX);
final int vpHeight = (int)(Screen.getScreenHeightPx() * scaleY);
GLES20.glViewport(0, 0, vpWidth, vpHeight);
mCam.setProjection(Screen.getScreenWidthPx(), Screen.getScreenHeightPx());
}
我的相机课:
public void setProjection(float width, float height)
{
final float ratio = width / height;
Matrix.orthoM(mProjection, 0, 0, width, height, 0, -1, 1);
}
顶点着色器:
private String mVSCode =
"attribute vec4 vPosition;" +
"uniform float sWidth;" +
"uniform float sHeight;" +
"void main() {" +
"gl_Position = vPosition;" +
"}";
结果:
1条答案
按热度按时间4nkexdtk1#
你必须决定你想做什么。如果要将顶点坐标1:1绘制为窗口坐标(像素),则正交投影是正确的。
但是如果你只想考虑纵横比,那么投影必须是:
无论如何,必须通过顶点着色器中的正交投影矩阵变换顶点坐标。
添加矩阵均匀(
mat4 uProjection
)到顶点着色器。把制服穿上mProjection
. 将顶点坐标乘以uProjection
在顶点着色器中:或者,可以在顶点着色器中手动设置正交投影矩阵:
(当然你得把制服穿好
sWidth
分别sHeight
)或者如果要使用窗口坐标: