我似乎无法修改帧缓冲区

Posted

技术标签:

【中文标题】我似乎无法修改帧缓冲区【英文标题】:I cannot seem to modify the framebuffer 【发布时间】:2020-06-17 08:48:28 【问题描述】:

我正在尝试修改 Linux 上的帧缓冲区。我正在通过虚拟终端(tty)运行程序。我似乎无法修改我想要的像素。这是我的代码:

#include <stdio.h>

    unsigned char buffer[4 * 1366 * 768];
    const int framewidth = 1366;
void placepixel(int x, int y, int r, int g, int b, int a)
    buffer[(framewidth * y) + x] = b;
    buffer[(framewidth * y) + x+1] = g;
    buffer[(framewidth * y) + x+2] = r;
    buffer[(framewidth * y) + x+3] = a;


void placepixelbynum(int i, int r, int g, int b, int a)
    buffer[i] = b;
    buffer[i+1] = g;
    buffer[i+2] = r;
    buffer[i+3] = a;

int main()
    for(int i = 0; i < 4 * 1366 * 768; i+=4)
        placepixelbynum(i, 50,50,50,0);
    
    FILE *write_ptr;

    write_ptr = fopen("/dev/fb0","wb");

    int x, y, z, xr, yr, zr;

    while(true)

    for(int i = 0; i < 128; i++)

    placepixel(128+i,128,255,0,0,0);
    
    fwrite(buffer,sizeof(buffer),1,write_ptr);

    
    return 0;





当我运行此程序时,屏幕变为灰色(如预期的那样),但该行不在我预期的位置。 (我希望它从 128x128 开始,到 256x128 结束),但它靠近屏幕的右端。

【问题讨论】:

【参考方案1】:

问题似乎是由于未能为每个像素考虑 4 个字节的缓冲区空间。考虑以下桌面检查

pixel(0,0)  
(framewidth*y) + x + 0  -> 0    
(framewidth*y) + x + 1  -> 1    
(framewidth*y) + x + 2  -> 2    
(framewidth*y) + x + 3  -> 3
pixel(1,0)  
(framewidth*y) + x + 0  -> 1    
(framewidth*y) + x + 1  -> 2    
(framewidth*y) + x + 2  -> 3    
(framewidth*y) + x + 3  -> 4

我怀疑你会通过这样的方式获得更多的成功:

void placePixel(int x, int y, int r, int g, int b, int a)

    int index = 4 * ((frameWidth*y) + x)
    buffer[index+0] = r;
    buffer[index+1] = g;
    buffer[index+2] = b;
    buffer[index+3] = a;

【讨论】:

以上是关于我似乎无法修改帧缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL +无法使用buffersubdata更新缓冲区数据

无法将简单的帧缓冲区渲染到四边形并显示

无法使用 glGenFramebuffers 生成帧缓冲区

需要在 Linux 帧缓冲区中绘制光标

LWJGL 无法在着色器中采样帧缓冲纹理

webGL - 如何在帧缓冲区旁边设置模板缓冲区并使用它?