Macos 在OpenGL中循环所有像素并获取/设置单个像素的颜色?
我写了一篇关于处理的小文章,现在我想制作一个MacOSX屏幕保护程序。然而,潜入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
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();
}