当前位置: 首页 > 知识库问答 >
问题:

处理:高效创建均匀网格

唐裕
2023-03-14

我试图创建一个图像网格(以一种将平铺背景的方式)。以下是我一直在使用的:

PImage bgtile;
PGraphics bg;
int tilesize = 50;

void setup() {
  
  int t = millis();
  
  fullScreen(P2D);
  background(0);
  
  bgtile = loadImage("bgtile.png");
  int bgw = ceil( ((float) width) / tilesize) + 1;
  int bgh = ceil( ((float) height) / tilesize) + 1;
  
  
  
  bg = createGraphics(bgw*tilesize,bgh*tilesize);
  bg.beginDraw();
  for(int i = 0; i < bgw; i++){
    for(int j = 0; j < bgh; j++){
      bg.image(bgtile, i*tilesize, j*tilesize, tilesize, tilesize);
    }
  }
  bg.endDraw();
  
  print(millis() - t);
 
}

计时代码说这需要大约四分之一秒,但根据我的计算,一旦窗口打开,屏幕上就会出现任何东西(这应该在第一次运行draw时发生)。有没有更快的方法可以得到同样的效果?(我想避免在绘制循环中呈现bgtile数百次,原因显而易见)

共有1个答案

洪子晋
2023-03-14

一种方法是利用GPU,让OpenGL为您重复一个纹理。处理使得通过texturewrap(repeat)重复纹理变得相当容易

不绘制图像,您可以创建自己的四方形状,例如,不调用顶点(x,y),而是调用顶点(x,y,u,v);传递纹理坐标(上面OpenGL链接中的更多低级信息)。简单的想法是x,y将控制屏幕上的几何图形,u,v将控制纹理如何应用于几何图形。

您可以控制的另一件事是texturemode(),它允许您控制如何指定纹理坐标(U,V):

    null
PImage img;

void setup() {
  fullScreen(P2D);
  noStroke();
  img = loadImage("https://processing.org/examples/moonwalk.jpg");
  // texture mode can be IMAGE (pixel dimensions) or NORMAL (0.0 to 1.0)
  // normal means 1.0 is full width (for U) or height (for V) without having to know the image resolution 
  textureMode(NORMAL);
  // this is what will make handle tiling for you
  textureWrap(REPEAT);
}
void draw() {
  // drag mouse on X axis to change tiling
  int tileRepeats = (int)map(constrain(mouseX,0,width), 0, width, 1, 100);
  // draw a textured quad
  beginShape(QUAD);
  // set the texture 
  texture(img);
  //     x    , y     , U          , V
  vertex(0    , 0     , 0          , 0);
  vertex(width, 0     , tileRepeats, 0);
  vertex(width, height, tileRepeats, tileRepeats);
  vertex(0    , height, 0          , tileRepeats);
  endShape();
  text((int)frameRate+"fps",15,15);
}
 类似资料:
  • 0.1-0.2:********** 0.2-0.3:******** 0.3-0.4:********* 0.5-0.6:********* 0.6-0.7:********* 0.7-0.8:********* 0.4-0.5:********* 0.5-0.6:********* 0.6-0.7:********* 0.1-0.2:********* 0.2-0.3:********* 0.

  • 问题内容: 我知道如果我使用Java的Random生成器,并使用nextInt生成数字,则数字将均匀分布。但是,如果我使用2个Random实例,并使用两个Random类生成数字,会发生什么。数字是否会均匀分布? 问题答案: 每个实例生成的数字将均匀分布,因此,如果将两个实例生成的随机数序列组合在一起,则它们也应均匀分布。 请注意,即使结果分布是均匀的,您也可能要注意种子,以避免两个生成器的输出之间

  • 我们在AWS上运行16个节点kafka集群,每个节点是m4. xLargeEC2实例,具有2TB EBS(ST1)磁盘。Kafka版本0.10.1.0,目前我们有大约100个主题。一些繁忙的话题每天会有大约20亿个事件,一些低量的话题每天只有数千个。 我们的大多数主题在生成消息时使用UUID作为分区键,因此分区分布相当均匀。 我们有相当多的消费者使用消费群体从这个集群消费。每个使用者都有一个唯一的

  • 所以我有两个项目,彼此分离,使用单独的terraform状态文件来管理自己。 项目A:专有网络、网络、子网、eip、gw层。此项目是我工作组中所有项目的共享专有网络。我们在同一专有网络内启动所有项目 项目B:应用程序、负载均衡器、安全组、ecs容器、api网关。这个项目就是应用程序本身,您可以相应地配置负载均衡器,使用允许任何端口的安全组,并在ecs上运行软件。 问题是:当我想更改VPC配置中的一

  • 在对OpenStack网络进行操作前,请先设置如下环境变量: export OS_USERNAME=admin export OS_PASSWORD=password export OS_TENANT_NAME=admin export OS_AUTH_URL=http://localhost:5000/v2.0 创建网络 列出neutron工具的扩展功能: $ neutron ext-

  • OpenStack网络服务是一个在OpenStack云内即可使用的、可扩展的管理网络的工具。这个工具能够帮助用户快速响应网络变更的需求(例如创建和分配新的IP地址等)。 OpenStack中的网络很复杂。本章仅简单介绍了如何创建网络和路由。欲了解详细的OpenStack网络管理内容,请参阅OpenStack Cloud Administrator Guide。 创建网络 登录控制台。 在Proje