Виждал съм този тип въпроси тук преди, но никой не ми даде пълен отговор, така че ще публикувам кода си и ще видя дали някой може да ми даде някаква представа. По принцип този код работи, но имам магическо z отместване от (височина * 1,205) [независимо от ширината] и нямам представа защо.
Задаване на размера и създаване на вектор за подравняване:
gl.viewportWidth = gl.canvas.width;
gl.viewportHeight = gl.canvas.height;
gl.viewportHalfWidth = gl.viewportWidth / 2;
gl.viewportHalfHeight = gl.viewportHeight / 2;
gl.viewportAspect = gl.viewportWidth / gl.viewportHeight;
gl.viewportZoom = -gl.viewportHeight * 1.205;
if (gl.alignmentTest) {
gl.alignmentVertices = (new Buffer( // TL, TM, BM, BR, TR, BL, TL
[ 1.0, -1.0, 0.0,
gl.viewportHalfWidth - 0.5, -1.0, 0.0,
gl.viewportHalfWidth - 0.5, -(gl.viewportHeight - 1.0), 0.0,
gl.viewportWidth - 1.0, -(gl.viewportHeight - 1.0), 0.0,
gl.viewportWidth - 1.0, -1.0, 0.0,
1.0, -(gl.viewportHeight - 1.0), 0.0,
1.0, -1.0, 0.0], 3)).post();
}
Чертане на вектора за подравняване:
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);
mat4.perspective(45, gl.viewportAspect, 0.1, 1000.0, gl.perspective.current);
gl.perspective.post(); // ^ writes directly to current perspective buffer
gl.modelView.resetToIdentity();
gl.enable(gl.BLEND);
gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
// Translate to pixel resolution
gl.modelView.push();
gl.modelView.translate([-gl.viewportHalfWidth, gl.viewportHalfHeight, gl.viewportZoom]);
gl.modelView.post();
// Alignment test?
if (gl.alignmentTest && gl.alignmentVertices) {
gl.red.useAsAttribute(gl.shaderProg.vertexColour);
gl.zero.vec2.useAsAttribute(gl.shaderProg.vertexTextureCoord);
gl.alignmentVertices.drawAsPrimitives(gl.shaderProg.vertexPosition, gl.LINE_STRIP);
}
gl.disable(gl.BLEND);
Въпросните линии са:
gl.viewportZoom = -gl.viewportHeight * 1.205;
и:
gl.modelView.translate([-gl.viewportHalfWidth, gl.viewportHalfHeight, gl.viewportZoom]);
Този код работи за всеки размер.
Ето екранна снимка с размери 700x300: http://oi49.tinypic.com/2my9ir7.jpg
И още едно на 400x600: http://oi46.tinypic.com/i2irh3.jpg
Така че въпросът е: Защо съществува този магически коефициент на мащабиране от 1,205? Или какво може да правя погрешно, за да се наложи?