文本呈现WebGL
Text Rendering WebGL
我正在尝试为2D图像中的不同元素提供文本标签。二维元素是通过从三维投影得到的。我有一些元素id,我想把它们作为文本标签包括进来。我已经试了两天了,但运气不好。我不知道出了什么问题。以下是进行渲染的函数:
function drawOverlayTriangles()
{
if (overlay.numElements <= 0)
return;
gl.enableVertexAttribArray(shaderProgram.aVertexPosition);
gl.enableVertexAttribArray(shaderProgram.aVertexColor);
// Turn off textures
//gl.vertexAttrib1f(shaderProgram.aHasTexture, 0.0);
// Upload Projection, ModelView matrices
gl.uniformMatrix4fv(shaderProgram.uMVMatrix, false, pMVMatrix);
gl.uniformMatrix4fv(shaderProgram.uPMatrix, false, perspM);
for (var i = 0; i < overlay.numElements; i++) {
// Upload overlay vertices
gl.bindBuffer(gl.ARRAY_BUFFER, overlayVertices[i]);
gl.vertexAttribPointer(shaderProgram.aVertexPosition, 3, gl.FLOAT, false, 0, 0);
// Upload overlay colors
gl.bindBuffer(gl.ARRAY_BUFFER, overlayTriangleColors[i]);
gl.vertexAttribPointer(shaderProgram.aVertexColor, 4, gl.FLOAT, false, 0, 0);
var canvas = document.createElement("canvas");
canvas.setAttribute("id","canvas");
canvas.width="512";
canvas.height="512";
document.body.appendChild(canvas);
var ctx = canvas.getContext('2d');
var text = "element";//overlay.elementIDs[i];
ctx.beginPath();
ctx.clearRect(0,0,300,300);
ctx.fillStyle = 'white';
ctx.fillRect(0,0,300,300);
ctx.fillStyle = 'rgba(255,0,0,255)';
ctx.lineWidth = 2.5;
ctx.strokeStyle = 'black';
ctx.save();
ctx.font = 'bold 80px Verdana';
var leftOffset = ctx.canvas.width/2;
var rightOffset = ctx.canvas.height/2;
ctx.strokeText(text,leftOffset,rightOffset);
ctx.fillText(text,leftOffset,rightOffset);
ctx.restore();
var texttexture=gl.createTexture();
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
gl.bindTexture(gl.TEXTURE_2D,texttexture);
gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,canvas);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.bindTexture(gl.TEXTURE_2D, null);
// Draw overlay
gl.drawArrays(gl.TRIANGLES, 0, overlay.elementNumVertices[i]);
}
gl.disableVertexAttribArray(shaderProgram.aVertexPosition);
gl.disableVertexAttribArray(shaderProgram.aVertexColor);
}
我是Webgl的初学者,因为我只需要2d投影元素的2d文本标签,请告诉我是否有更简单的方法。
这是调用渲染函数的函数:
function saveModelImage(separateElementImages)
{
var glCanvas = document.getElementById("glCanvas");
glCanvas.width = 2144;
glCanvas.height = 1424;
var fov = deg2rad(60);
if(cameraIndex > -1)
{
var f = model.cameras[cameraIndex].f;
glCanvas.width = camImageWidths[cameraIndex];
glCanvas.height = camImageHeights[cameraIndex];
console.info("w: " + glCanvas.width + " h: " + glCanvas.height);
fov = 2 * Math.atan(0.5 * glCanvas.height / f);
}
gl.viewportWidth = glCanvas.width;
gl.viewportHeight = glCanvas.height;
gl.aspectRatio = gl.viewportWidth / gl.viewportHeight;
gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);
gl.viewportCenter = vec3.fromValues(gl.viewportWidth / 2.0, gl.viewportHeight / 2.0);
updateBoundingRect();
mat4.ortho(orthoM, -gl.aspectRatio, gl.aspectRatio, -1.0, 1.0, 1.0, 100.0);
mat4.perspective(perspM, fov, gl.aspectRatio, 0.5, 10000);
// we need to pass in the cameraID to this function
// using camera.ID, we will find the accurate width and height to use for glCanvas.
// then the gl.aspectRatio could be set as above
// and FOV (in rad) = 2 atan(0.5 glCanvas.height / camera.f)
if(separateElementImages == true)
{
//something
}
else
{
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
drawOverlayTriangles();
var imageUrl = glCanvas.toDataURL('image/jpeg', 1.0);
var pom = document.createElement('a');
pom.setAttribute('href', imageUrl);
pom.setAttribute('download', 'image_C' + cameraIndex + '.jpg');
document.body.appendChild(pom);
pom.click();
document.body.removeChild(pom);
}
}
任何帮助都将不胜感激
最简单的方法是在webgl画布上的2d画布上绘制,或者在webgls画布上移动HTML元素。
在WebGL canvas 上的2d画布上绘制
var underCanvas = document.getElementById("under");
var overCanvas = document.getElementById("over");
// get a webgl context for the under canvas.
var gl = underCanvas.getContext("webgl");
// get a webgl context for the over canvas.
var ctx = overCanvas.getContext("2d");
var radius = 70;
var clock;
var x;
var y;
function render() {
clock = Date.now() * 0.001;
x = Math.floor(Math.cos(clock) * radius + gl.canvas.width * 0.5);
y = Math.floor(Math.sin(clock) * radius + gl.canvas.height * 0.5);
drawWebGLStuff(gl);
drawCanvas2DStuff(ctx);
requestAnimationFrame(render);
}
render();
function drawWebGLStuff(gl) {
// I'm using the SCISSOR because it's the simplest thing
gl.disable(gl.SCISSOR_TEST);
gl.clearColor(0, 0, 0, 0);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.scissor(
Math.max(0, x - 10),
Math.max(0, y - 10),
20,
20);
gl.enable(gl.SCISSOR_TEST);
gl.clearColor(0, 1, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
}
function drawCanvas2DStuff() {
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
ctx.textAlign = "center";
ctx.fillText("Hello World", x, ctx.canvas.height - y);
}
canvas {
border: 1px solid black;
}
#under {
position: absolute;
left: 0px;
top: 0px;
}
/* put "over" on top of "under" */
#over {
position: absolute;
left: 0px;
top: 0px;
z-index: 2;
}
<canvas id="under"></canvas>
<canvas id="over"></canvas>
通过在画布上移动HTML元素进行绘制
var underCanvas = document.getElementById("under");
var overCanvas = document.getElementById("over");
// get a webgl context for the under canvas.
var gl = underCanvas.getContext("webgl");
// make a div for text
var textDiv = document.createElement("div");
textNode = document.createTextNode("");
textDiv.className = "over";
textDiv.appendChild(textNode);
document.body.appendChild(textDiv);
var radius = 70;
var clock;
var x;
var y;
function render() {
clock = Date.now() * 0.001;
x = Math.floor(Math.cos(clock) * radius + gl.canvas.width * 0.5);
y = Math.floor(Math.sin(clock) * radius + gl.canvas.height * 0.5);
drawWebGLStuff(gl);
moveTextDiv();
requestAnimationFrame(render);
}
render();
function drawWebGLStuff(gl) {
// I'm using the SCISSOR because it's the simplest thing
gl.disable(gl.SCISSOR_TEST);
gl.clearColor(0, 0, 0, 0);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.scissor(
Math.max(0, x - 10),
Math.max(0, y - 10),
20,
20);
gl.enable(gl.SCISSOR_TEST);
gl.clearColor(0, 1, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
}
function moveTextDiv() {
textDiv.style.left = x + "px";
textDiv.style.top = (gl.canvas.height - y) + "px";
textNode.nodeValue = clock.toFixed(2);
}
html, body {
overflow: none;
position: absolute;
}
canvas {
border: 1px solid black;
}
#under {
position: absolute;
left: 0px;
top: 0px;
}
.over {
position: absolute;
left: 0px;
top: 0px;
z-index: 2;
}
<body>
<canvas id="under"></canvas>
</body>
相关文章:
- 如何使用jquery在填充自动完成的值后使文本框只读
- 使用Clipboard.js复制span文本
- 使用JS如何动态更改显示的html文件中的文本背景颜色
- 用程序搜索JQuery数据表中的文本
- jQuery匹配JSON对象的部分文本
- onkeyup无法动态创建多个文本区域
- 如何在下面的ES6循环中获得前面的文本
- 将输入字段中的文本提交到我的数据库,同时将其添加到我的列表中
- 让文本输入幻灯片显示输入时的新文本输入?然后向后滑动
- 借助asp.net验证或java脚本对多个文本进行验证
- 无法在ajaxStart中更改跨度文本
- 高亮显示时编辑文本大小和颜色
- jquery中的文本框验证
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- 如何检测用于WebGL的专用或集成显卡
- Sails.js:同时发布文本输入和一个文件
- 当鼠标悬停在文本中的单词上时显示警报
- 文本呈现WebGL
- 如何对齐画布旁边的文本和按钮(WebGL+JavaScript+CSS)
- 崇高的文本webgl自动完成