首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >分别绘制每个像素WebGL

分别绘制每个像素WebGL
EN

Stack Overflow用户
提问于 2015-08-08 03:02:38
回答 2查看 3K关注 0票数 3

首先,让我谈谈我的目标。我正在创建另一个像素艺术在线编辑器,并决定只使用WebGL (根本没有Canvas2D )。我太蠢了,因为我对这项技术一无所知,但我正在努力!所以..。问题是:如何改变唯一一个像素的颜色?我与我的另一个“误解”作了斗争,用粒子系统找到了这个答案:

https://stackoverflow.com/a/16465343/4458277

我重写了它,使它看起来更接近我的情况:

https://jsfiddle.net/kurz/rt2n7hmb/1/

正如你所看到的,当你在画布上画画时,有10个像素颜色相同。这里主要的绘制方法是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function mouseMoveEvent(e) {
    /*... detect x and y...*/
    gl.bindBuffer(gl.ARRAY_BUFFER, particleBuffer);
    var data = new Float32Array(2);
    data[0] = x;
    data[1] = y;
    gl.uniform4f(
        gl.getUniformLocation(shaderProgram, "color"),
        Math.random(),
        Math.random(),
        Math.random(),
        1.0
    );
    gl.bufferSubData(gl.ARRAY_BUFFER, particleId * particleSize * sizeOfFloat, data);
    particleId = (particleId + 1) % vertexBufferSize;
    gl.clear(gl.COLOR_BUFFER_BIT);
    gl.drawArrays(gl.POINTS, 0, vertexBufferSize);
}

那么,如何将此示例更改为每个像素都具有独特的颜色?

有些人可能会说:“使用canvas2d!”。-不!我认为未来不是canvas2d。“那就去图书馆吧!”-不,又来了!对于“简单”的东西,如画方块,我不想包括大型图书馆。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-09 02:58:31

您需要了解的是,您所发布的代码是将一个变量传递给片段着色器,它没有进行任何绘图。碎片着色器正在绘制。

OpenGL是一种在现代显卡上操纵渲染过程不同阶段的工具。它不试图涵盖闪存像素到屏幕缓冲区的用例。(glDrawPixels被废弃,在ES2.0或WebGL中不可用)

但是,有一些方法可以在应用程序中使用它。

我推荐这些 2 文章来理解先决条件,尽管您应该知道它是针对openGL 3.2和C++的,而不是WebGL和Javascript。因此,您可以忽略诸如上下文创建、纹理加载的方式以及不需要创建VertexArrays等内容。

WebGL解决方案1:

  • 创建一个空的纹理。
  • 每一帧,画一个四边形到屏幕,显示这种纹理。
  • 在鼠标单击时,调用glTexSubImage2D修改纹理中的1个像素。

WebGL解决方案2:

  • 更改gl_PointSize (顶点着色器第8行)
  • 只抽1分
  • 不要清除屏幕(javascript第45行)
  • 保留webGL屏幕缓冲区(javascript第86或89行)

见修改后的源

这个解决方案没有修改精确的像素,我认为解决方案1是一个更好的方法。

为什么要使用Canvas2D:

认为Canvas2D不如WebGL是一个错误,一个是螺丝刀,另一个是锤子。一种很适合用螺丝附着东西,另一种很适合用钉子附着东西。

当您想要操作3d渲染管道时使用WebGL,当您想要操作光栅图像时使用Canvas2D。

TL;DR:

如果您使用Canvas2D,您可以以良好的性能开始制作您今天想要的应用程序。如果您想要使用WebGL,您应该努力理解呈现管道的各个阶段。

票数 3
EN

Stack Overflow用户

发布于 2015-08-08 05:54:35

您的问题的直接答案是,gl.uniform4f是一个全局变量。所以你实际上是这样做的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var color = randomColor(); // uniform4f call
for each point:
    drawPoint(p.x, p.y,color);

您需要将其转换为以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for each point:
    var color = gl.uniform4f(...);
    drawPoint(p.x, p.y, color);

然而,我想指出的是,使用粒子系统来进行像素编辑器可能不是一条路。想象一下,如果用户在同一区域重复移动,将会有大量的冗余数据。第二,如何(有效)支持擦除操作?还是填上?

最后,我认为你想使用纹理。纹理基本上是数据数组的一个很好的名称,但是它的格式和可以包含的内容都有限制。但是,GPU可以非常快地访问它们。所以你要做的是画一个屏幕大小相同的四边形,并通过纹理给它一个单独的像素数据,告诉它要画什么。然后,当用户进行操作和重绘时,直接操作纹理数据。

要在webgl中实现这一点实在太长了,所以我建议在web上学习一些教程。webgl最好的自动取款机是webgl基础系列。我建议从那里开始。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31892414

复制
相关文章
python处理图片像素_python绘制像素图
利用Imgae.open()打开图像,再利用PIL对象进行操作。这样只是简单的处理,一旦操作复杂就比较困难。而像素级的处理与许多复杂操作相关。所以,通常我们在加载完图片后,都是把图片转换成矩阵来进行复杂操作。
全栈程序员站长
2022/11/07
1.9K0
python处理图片像素_python绘制像素图
GDI+ 读取jpg图片每个像素的值
// 读取jpg图像像素rgb值.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <fstream> #include <string> #include <windows.h> #include <gdiplus.h> #pragma comment(lib, "gdiplus.lib") using namespace std; using namespace Gdiplus; int main()
流川疯
2022/11/29
1.2K0
GDI+ 读取jpg图片每个像素的值
WebGL绘制三角形
本文程序实现绘制一个三角形的任务,如下图。 整个程序包含两个文件,分别是: 1. HelloTriangle.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML
步行者08
2018/10/09
9030
强大的分组:给每个类别分别添加索引编号
在前面讲《怎么在每个科目(分类)内容的后面加3个空行?还涉及分组依据的核心原理……》的时候,提到“分组依据”功能的核心原理,在此重复一下:分组的过程就是对同一类内容先分好,或者说挑出了每一组所包含的所有内容,然后再针对各类内容分别进行后续的聚合(计算)。
大海Power
2021/08/30
8930
WebGL简易教程(九):综合实例:地形的绘制
在上一篇教程《WebGL简易教程(八):三维场景交互》中,给三维场景加入了简单的交互,通过鼠标实现场景的旋转和缩放。那么在这一篇教程中,综合前面的知识,可以做出一个稍微复杂的实例:绘制一张基于现实的地形图。
charlee44
2019/10/09
1.6K0
WebGL简易教程(九):综合实例:地形的绘制
WebGL简易教程(七):绘制一个矩形体
在上一篇教程《WebGL简易教程(六):第一个三维示例(使用模型视图投影变换)》中,通过使用模型视图投影变换,绘制了一组由远及近的三角形。但是这个示例还是太简单了,这几个三角形的坐标仍然是-1到1之间的坐标,无论如何都是很容易设置参数的,可能并不能很深入的理解模型视图投影变换。
charlee44
2019/10/08
1.8K0
WebGL简易教程(七):绘制一个矩形体
前端 4 种渲染技术的计算机理论基础
前端可用的渲染技术有 html + css、canvas、svg、webgl,我们会综合运用这些技术来绘制页面。有没有想过这些技术有什么区别和联系,它们和图形学有什么关系呢?
神说要有光zxg
2021/12/17
8590
前端 4 种渲染技术的计算机理论基础
虚拟仿真程序部署方案:像素流技术和Webgl对比分析
经过近几年的发展,虚拟仿真教学在教育行业已经有一定的规模,目前的虚拟仿真程序部署方案多采用了单机版或者结合webgl技术,可以实现电脑安装运行,或者通过WebGL实现网页打开。虽然这些部署方案实现了虚拟仿真教学,但和理想的效果,还存在一定的差距。
点量小芹DolitQin520
2021/08/05
1.1K0
虚拟仿真程序部署方案:像素流技术和Webgl对比分析
webgl 基础
WebGL仅仅是一个光栅化引擎,它可以根据你的代码绘制出点,线和三角形。 WebGL在电脑的GPU中运行,每对方法中一个叫顶点着色器, 另一个叫片断着色器,并且使用一种和C或C++类似的强类型的语言 GLSL。 每一对组合起来称作一个 program(着色程序)
ronixiao
2022/08/08
1.4K0
WPF 绘制对齐像素的清晰显示的线条
发布于 2017-12-12 13:49 更新于 2018-08-13 12:47
walterlv
2018/09/18
1.5K0
WPF 绘制对齐像素的清晰显示的线条
几个简单的小例子手把手带你入门webgl
各位同学们大家好,又到了周末写文章的时间,之前群里有粉丝提问, 就是shader不是很理解。然后今天他就来了, 废话不多说,读完今天的这篇文章你可以学到以下几点:
coder_koala
2021/09/18
1.4K0
几个简单的小例子手把手带你入门webgl
WebGL基础 - 笔记
光栅(Raster):几乎所有的现代图形系统都是基于光栅来绘制图形的,光栅就是指构成图像的像素阵列。
TagBug
2023/03/17
7490
WebGL基础 - 笔记
实用 WebGL 图像处理入门
技术社区里有种很有意思的现象,那就是不少人们口耳相传中的强大技术,往往因为上手难度高而显得曲高和寡。从这个角度看来,WebGL 和函数式编程有些类似,都属于优势已被论证了多年,却一直较为不温不火的技术。但是,一旦这些技术的易用性跨越了某个临界点,它们其实并没有那么遥不可及。这次我们就将以 WebGL 为例,尝试降低它的入门门槛,讲解它在前端图像处理领域的应用入门。
ConardLi
2020/02/23
3.2K0
可视化导学-图形基础
关于 HTML/CSS、SVG、Canvas2D 和 WebGL 这四种图形系统。
Cellinlab
2023/05/17
1.1K0
可视化导学-图形基础
WebGL 纹理颜色原理
腾讯IVWEB团队
2017/11/09
2.7K0
WebGL 纹理颜色原理
基于 WebGL实现自定义栅格图层踩坑实录
自定义栅格图层 是指用户可以通过特定软件,将自定义的图像按照上文所述的方式切割为瓦片,并生成图片,然后按照瓦片坐标拼接形成地图的图层。常用于手绘地图、卫星图、地形图等。
腾讯位置服务
2020/07/03
1.2K0
双坐标分别绘制条形图和折线图
生信技能树jimmy
2023/09/26
3090
双坐标分别绘制条形图和折线图
WebGL简易教程(四):颜色
在上一篇教程《WebGL简易教程(三):绘制一个三角形(缓冲区对象)》中,通过使用缓冲区对象(buffer object)来向顶点着色器传送数据。那么,如果这些数据(与顶点相关的数据,如法向量、颜色等)需要继续传送到片元着色器该怎么办呢?
charlee44
2019/09/29
9440
WebGL简易教程(四):颜色
一起来玩玩WebGL
上一篇文章说到我从客户端转前端的历程,短短一年的时间就打开了前端世界的大门,简直就是有无穷多的东西可玩,以前酷爱Java的我终于见识到什么都可以写的JavaScript的厉害了,不仅仅可以写Web,客户端,后端,系统应用,还可以在神经网络、物联网,甚至嵌入式都可以,简直就是一个万能的语言,可以说能编程的地方理论上都可以用JS来写!
ConardLi
2020/06/29
1.1K0
一起来玩玩WebGL
QT软件开发: 访问QImage每个像素点填充指定颜色
需求: 需要将QImage加载的图片里指定的颜色值替换成另一种指定的颜色。 示例代码: QImage image; QString filename=QFileDialog::getOpenFileName(this,"选择打开的文件","C:/",tr("*.bmp *.jpg *.png")); //filename==选择文件的绝对路径 //加载图片 image.load(filename); int w,h; //得到图片的宽高 w
DS小龙哥
2022/01/12
1.4K0

相似问题

WEBGL绘制顶点位置内的像素

20

如何更改WebGL中的每个像素

11

为每个id分别绘制子图

14

在UIView中绘制每个像素

11

在画布中绘制每个像素

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文