Macos 在OpenGL中循环所有像素并获取/设置单个像素的颜色?

Macos 在OpenGL中循环所有像素并获取/设置单个像素的颜色?,macos,opengl,screensaver,pixels,Macos,Opengl,Screensaver,Pixels,我写了一篇关于处理的小文章,现在我想制作一个MacOSX屏幕保护程序。然而,潜入OpenGL并不像我想象的那么容易 基本上,我想在屏幕上的所有像素之间循环,并根据像素颜色设置另一个像素颜色 处理代码如下所示: void setup(){ size(500,500, P2D); frameRate(30); background(255); } void draw(){ for(int x = 0; x<width; x++){ for(int y = 0; y<h

我写了一篇关于处理的小文章,现在我想制作一个MacOSX屏幕保护程序。然而,潜入OpenGL并不像我想象的那么容易

基本上,我想在屏幕上的所有像素之间循环,并根据像素颜色设置另一个像素颜色

处理代码如下所示:

void setup(){
  size(500,500, P2D);
  frameRate(30);
  background(255);
}

void draw(){
 for(int x = 0; x<width; x++){
  for(int y = 0; y<height; y++){
     float xRand2 = x+random(2);
     float yRand2 = y+random(2);

     int xRand = int(xRand2);
     int yRand = int(yRand2);

     if(get(x,y) == -16777216){
     set(x+xRand, y+yRand, #FFFFFF);
     }
     else if(get(x,y) == -1){
     set(x+xRand, y+yRand, #000000);
     }
   }
 }
}
void setup(){
尺寸(500500,P2D);
帧率(30);
背景(255);
}
作废提款(){

对于(int x=0;x而言,OpenGL的基本思想是,您从不手动设置单个像素的值,因为这通常太慢。相反,您可以渲染三角形并使用它们执行各种技巧,如纹理、混合等

为了在OpenGL中自由编程每个像素的功能,你需要使用一种称为着色器的技术。如果你以前没有做过类似的事情,那就不太容易了。着色器的概念是GPU执行它们而不是CPU,这会产生非常好的性能并减轻CPU的负载。但在你的例子中,它是p使用CPU而不是着色器和OpenGL可能是一个更好的主意,因为这种方法更容易开始

我建议你使用像SDL(或者可能是glfw)这样的库,它允许你在没有硬件加速的情况下处理像素。不过,你也可以使用OpenGL来处理。通过使用函数glDrawPixels。该函数可以将原始像素数据绘制到屏幕上。但速度可能不是很快

例如,从阅读一些关于SDL的教程开始

编辑:如果要使用着色器,它们的困难(除其他外)在于无法指定设置像素值的坐标。而且也无法直接从屏幕获取像素值。使用着色器的一种方法是:

  • 设置两个纹理:纹理A和纹理B
  • 将其中一个纹理绑定为渲染所有对象的目标
  • 将另一个纹理绑定为着色器的输入纹理
  • 使用着色器渲染全屏四边形,并在屏幕上显示结果
  • 交换纹理A和B,以便将上一个结果用作下一个输入
  • 重新渲染

如果您不想使用着色器,请尝试在2D内存阵列上的CPU中进行所有像素修改,然后在每帧使用glDrawPixels将像素推送到屏幕上。这不会是非常硬件加速的,但可能适合您的目的。另一种尝试是使用glTexImage2D每一帧绑定新的像素数据帧到一个纹理,然后在整个屏幕上渲染一个带纹理的四边形。我不确定哪一个会更快。我的建议是在跳入着色器的复杂性之前尝试这些方法。

您的代码中存在一些错误,使反向工程和移植变得更加困难,让我怀疑您是否真的发布了正确的代码。Assumi如果所产生的视觉效果是您想要的,那么这里有一个更有效、更正确的
draw()

void draw(){
loadPixels();

对于(int x=0;xI我不确定那是什么语言,但它似乎类似于C,我认为
#FFFFFF
在任何语言中都是无效的类型/值。并且没有理由在标题中添加
[opengl]
,标记就是为了这个目的。它正在处理,而且是有效的代码。正如我所说的,可能不漂亮,但有效;)很抱歉弄脏了标题,老习惯!嗯…用硬件来做似乎不是一个可行的选择。在我的屏幕上,每帧的操作数是1440x900。从我收集的数据来看,glReadPixel相当慢。但现在我至少知道我要找的是着色器。回答很好,谢谢。真不敢相信我没有想到拥有一个包含值的数组,而不是每次都读取它们。我的垃圾处理代码也得到了很好的优化。现在尝试制作一个屏幕保护程序。如果glDrawPixels几乎是我唯一需要的东西,我应该能够做到:)
void draw() {
  loadPixels();
  for(int x = 0; x<width/2; x++) {
    for(int y = 0; y<height/2; y++) {
      int x_new = 2*x+int(random(2));
      int y_new = 2*y+int(random(2));

      if (x_new < width && y_new < height) {
        int dest_pixel = (y_new*width + x_new);

        color c = pixels[y*width+x];

        if(c == #FFFFFF){
          pixels[dest_pixel] = #000000;
        }
        else {
          pixels[dest_pixel] = #FFFFFF;
        }
      }
    }
  }
  updatePixels();
}