이전에이 유형의 질문을 보았지만 그 대답은 완전한 대답이 아니므로 코드를 게시하고 누구나 제공 할 수 있는지 확인합니다. 통찰력. 기본적으로이 코드는 작동하지만 마법의 z 오프셋 (높이 * 1.205) [너비에 관계없이] 이유는 모르겠다.원근감을 유지하면서 픽셀 해상도에서 WebGL 캔버스 사용하기
크기를 설정하고 정렬 벡터 생성 : 정렬 벡터 그리기
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]);
이 코드는 의 경우 크기에서 작동합니다. http://oi49.tinypic.com/2my9ir7.jpg
그리고 다른 400x600에서 : http://oi46.tinypic.com/i2irh3.jpg이
그래서 질문입니다 : 왜 1.205의 마법 배율이 존재
여기에 700x300의 스크린 샷이다? 또는 내가 필요로하게하기 위해 무엇을 잘못 할 수 있습니까?
귀하의 질문을 이해할 수 있는지 잘 모르겠습니다. 3x 수학을 사용하여 1x1 픽셀로 그려주는 쿼드를 그립니다. 첫 번째 확실한 대답은 "왜 3d 수학을 사용하여 2D를 그립니까?"입니다. "2D 수학으로 2D 그리기"(http://goo.gl/xQvx1).하지만 어떤 이유로 3D로 그려야하는 경우 두 번째 대답은 "이 이력서 행렬 사용"입니다. – gman
드로잉하는 기본 요소는 이 특별한 인터페이스는 고전적인 2D 오브젝트를 3D 공간에 통합 할 필요가 있고 3D 오브젝트를 2D 인터페이스 내에서 조작 할 수 있도록 허용해야하므로 WebGL 공간을 캔버스 경계선에 비례하여 정렬해야합니다. 두 개를 따로 따로 취급하는 것이 이상적이 아니며 문제가되지 않아야합니다. 잘 작동하고 실제로 해킹되지 않는 경우도 있습니다. 왜 마법 번호가 필요한지 알고 싶습니다. 올바른 번호로 교체 할 수 있습니다. 계산. – jimmetry
"WebGL 공간"이 없습니다 .WebGL은 픽셀의 사각형이며 사용자가 제공하는 일부 GLSL 함수입니다 .WebGL은 공백을 정의하지 않습니다. 귀하의 질문 제목 그래서 그것은 이해가 되니? "캔버스에서 1x1 픽셀로 표시되도록 3D 공간에서 질감이있는 유닛 쿼드를 정렬하려면 어떻게해야합니까?" – gman