- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将图像(作为纹理)绘制到帧缓冲区,应用锐度过滤器(通过拖动 UI 上的 slider ),然后从帧缓冲区读取结果,并通过调用将数据复制到简单的 2d Canvas (不是 webgl) readPixels 与绑定(bind)的帧缓冲区,获取像素数组并将它们复制到 ImageData.data,但该函数返回原始纹理。
也许有人可以向我解释一下,因为据我了解,屏幕上的东西实际上是帧缓冲区的内容。
抱歉,代码太多,但我希望它可以帮助您理解我在做什么。
(function () {
var anotherContext = null;
var canvas = $("#canvas");
main();
setupCanvas();
function setupCanvas () {
anotherContext = document.getElementById("anothercanvas").getContext("2d");
}
function main () {
var image = new Image();
image.src = "http://localhost:9292/img/ava.jpg";
image.onload = function () {
render(image);
}
}
function render (image) {
//-----get contexts----
var canvas = document.getElementById('canvas');
var gl = canvas.getContext('experimental-webgl');
//----define shaders-----
var vs = document.getElementById('vshader').textContent;
var fs = document.getElementById('fshader').textContent;
//----create program-----
var program = createProgram(vs, fs);
gl.useProgram(program);
//----setup vertex data-----
var positionLocation = gl.getAttribLocation(program, "a_position");
var texCoordLocation = gl.getAttribLocation(program, "a_texCoord");
//----setup texture-----
var texCoordBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
0.0, 0.0,
1.0, 0.0,
0.0, 1.0,
0.0, 1.0,
1.0, 0.0,
1.0, 1.0]), gl.STATIC_DRAW);
gl.enableVertexAttribArray(texCoordLocation);
gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);
// Create a texture.
var texture = createAndSetupTexture();
// Upload the image into the texture.
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
//---framebuffer----
var framebuffer = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
var canRead = (gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE);
console.log("Can read: ", canRead);
//----lookup uniforms and set the resolution-----
var resolutionLocation = gl.getUniformLocation(program, "u_resolution");
var textureSizeLocation = gl.getUniformLocation(program, "u_textureSize");
var kernelLocation = gl.getUniformLocation(program, "u_kernel[0]");
gl.uniform2f(textureSizeLocation, image.width, image.height);
//----kernels-----
var kernel = [
0, 0, 0,
0, 1, 0,
0, 0, 0
];
var sharpnessKernel = [
0,-1, 0,
-1, 5, -1,
0,-1, 0
];
//-----bind buffer------
var vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.enableVertexAttribArray(positionLocation);
gl.vertexAttribPointer(program.vertexPosAttrib, 2, gl.FLOAT, false, 0, 0);
setRectangle(gl, 0, 0, image.width, image.height);
draw(kernel);
function draw (krn) {
// gl.bindTexture(gl.TEXTURE_2D, texture);
setFramebuffer(framebuffer);
drawWithKernel(krn);
copyImage();
// gl.bindTexture(gl.TEXTURE_2D, texture);
setFramebuffer(null);
gl.drawArrays(gl.TRIANGLES, 0, 6);
}
function setFramebuffer (fbuf) {
gl.bindFramebuffer(gl.FRAMEBUFFER, fbuf);
gl.uniform2f(resolutionLocation, canvas.width, canvas.height);
gl.viewport(0, 0, canvas.width, canvas.height);
}
function drawWithKernel (kernel) {
gl.uniform1fv(kernelLocation, kernel);
//---draw
gl.drawArrays(gl.TRIANGLES, 0, 6);
}
function createAndSetupTexture () {
var texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
// Set the parameters so we can render any size image.
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.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
return texture;
}
function setRectangle (gl, x, y, width, height) {
var x1 = x;
var x2 = x + width;
var y1 = y;
var y2 = y + height;
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
x1, y1,
x2, y1,
x1, y2,
x1, y2,
x2, y1,
x2, y2]), gl.STATIC_DRAW);
}
function createShader(str, type) {
var shader = gl.createShader(type);
gl.shaderSource(shader, str);
gl.compileShader(shader);
return shader;
}
function createProgram (vstr, fstr) {
var program = gl.createProgram();
var vshader = createShader(vstr, gl.VERTEX_SHADER);
var fshader = createShader(fstr, gl.FRAGMENT_SHADER);
gl.attachShader(program, vshader);
gl.attachShader(program, fshader);
gl.linkProgram(program);
return program;
}
function copyImage () {
var pixels = new Uint8Array(image.width * image.height * 4);
gl.readPixels(0, 0, image.width, image.height, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
var imageData = anotherContext.createImageData(image.width, image.height);
for (var i = pixels.length - 1; i >= 0; i--) {
imageData.data[i] = pixels[i];
};
// console.log(imageData.data);
anotherContext.putImageData(imageData, 0, 0);
}
$("#slider").slider({
min: 0,
max: 99,
slide: function (event, ui) {
var currentKernel = null;
//do not use any filtering if slider is on 0 position
if(ui.value == 0) {
currentKernel = kernel;
}
else {
currentKernel = sharpnessKernel.slice(0);
currentKernel[4] -= (ui.value / 100);
}
draw(currentKernel);
}
});
}
})()
最佳答案
您当前的函数和括号设置完全损坏,这也表明您没有使用 firebug或任何其他 web-console调试您的 JavaScript。
首先,您应该将一些函数移到主函数之外并获得 modern editor因为它们中的大多数都有显示属于一起的括号的方法。
编辑:看起来类似于 WebGL fundamentals 中的代码。回答您的问题:仅当绑定(bind)的帧缓冲区为空时(正如您可以在该网站上阅读的那样),您才会绘制到屏幕。
无论如何,您可能会在这方面得到帮助:Creating texture from getImageData (Javascript)或者可能fabric.js image filters
关于javascript - readPixels 函数返回未修改的纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17625671/
我正在尝试使用 unity 创建一个小的测试应用程序。我正在构建应用程序的一个实例并将其设置为充当主机,然后在统一编辑器中作为客户端运行另一个实例。在当前的迭代中,我有一个按钮,按下时应该截取屏幕截图
我正在尝试将图像(作为纹理)绘制到帧缓冲区,应用锐度过滤器(通过拖动 UI 上的 slider ),然后从帧缓冲区读取结果,并通过调用将数据复制到简单的 2d Canvas (不是 webgl) re
为什么我从WebGLRenderingContext.readPixels()获得的imageData颠倒了? 我尝试做以下事情: var gl = renderer.domElement.getCo
我不明白为什么我在 requestanimationframe 循环内丢失了 readpixel 值? var pixels = new Uint8Array(12*12*4); gl.clearCo
我使用 webgl_draw_buffers 扩展创建了一个帧缓冲区对象,以提供三个颜色缓冲区: colorBuffer0 = gl.createRenderbuffer(); gl.bind
当尝试使用大量数据(但屏幕上几乎没有数据)进行 HitTest 时,即使帧时间远低于 16.7 毫秒(总共 10 毫秒),读取像素也非常慢 我正在开发一个在 webgl 中运行的 datavis 平台
谁能告诉我如何在 JOGL 中从缓冲区中读取像素。请用代码说明。 最佳答案 渲染完成后,调用这个方法: public BufferedImage toImage(GL gl, int w, int h
我一直在尝试使用 WebGL 来实现裁剪和封顶。为此,我必须使用模板缓冲区来限制剪切平面的绘制,以便仅绘制对象内部的部分。 首先,我一直在尝试使用模板缓冲区。我的目标是检查 gl.clearStenc
我正在尝试使用 WebGL 来加速小型量子电路模拟中的计算,就像 Quantum Computing Playground does 那样。 。我遇到的问题是 readPixels 需要大约 10ms
我想从我的相机 View 中检索深度缓冲区以用于 3D 过滤应用程序。目前,我正在使用 glReadPixels 来获取深度组件。而不是 [0,1] 值,我需要深度缓冲区的真实值,或者在世界坐标中到相
基本上我有 200 X 200 像素的 Canvas ,一个 20 X 20 X 20 像素的体素。所以我有 100 个体素。当我在 Canvas 上绘图时,我想查看绘制了哪个像素,如果该像素位于其中
我将 id(这是一个包含在 24 位范围内的值)存储到 Float32Array(3) 中,以便稍后在 WebGL 中检索: var r = 0, g = 0, b = id; if
我正在尝试访问像素数据并将图像从游戏中的相机保存到磁盘。最初,简单的方法是使用渲染目标,然后使用RenderTarget-> ReadPixels(),但是由于ReadPixels()的 native
我已更新到 FireFox35,但以下代码不再起作用: var ctx = renderer2.getContext("experimental-webgl",{preserveDrawing
我正在使用headless-gl与 Node 一起在服务器端渲染生成的高分辨率 WebGL 图像。根据所选的分辨率,这可以正常工作。 'use strict'; const Gl = require(
我正在使用 headless-gl 在 Node.js 上运行 webGL,在服务器上动态创建图像。创建后,图像将存储在数据库 (MongoDB) 中,然后用户可以通过 API 再次访问图像。 下面是
图像采用 Base64 格式,我想比较像素关系。 在了解 GPU 的工作原理后,我认为这种类型的分析在 Canvas webgl 上下文中表现最佳,而不是像我之前使用的 2d 。我以前没有使用过 We
我试图将 RenderTexture 绘制到 Texture2D 中,目的是将其保存到磁盘。这种方法在 OSX 编辑器和 Android 上一直有效。 我在 XCode 控制台中没有看到任何错误,当我
我创建了两个 html 客户端,它们使用 websocket 服务器相互通信。一个客户端使用 Three.js 在其 Canvas 上绘制 3D 模型,并将 Canvas 上下文(即 webGl)作为
是否可以在具有多个附件的帧缓冲区上以浮点形式检索像素值? (WebGL 2) 我试过这个: var framebuffer = _gl.createFramebuffer(); _gl.bindFra
我是一名优秀的程序员,十分优秀!