如何访问每个像素?

时间:2015-10-12 01:47:12

标签: opengl

如果我有一个大小为(200 * 200 * 3)的PixelBuffer对象,其中每个像素有三个连续的RGB颜色点。我如何索引它们,以便我尝试实现DDA线条绘制算法。我在网上看到很多使用PutPixel(x,y)但我不知道如何访问此方法中的像素。

1 个答案:

答案 0 :(得分:1)

像素将逐行排列,每个像素使用3个字节。要解决点(x, y),您基本上只需要将y值乘以行的大小(宽度乘以3),将x值乘以大小像素(3)。

有一些可读性常量,函数的代码可能如下所示:

const int IMG_WIDTH = 200;
const int IMG_HEIGHT = 200;

const int BYTES_PER_PIXEL = 3;
const int BYTES_PER_ROW = IMG_WIDTH * BYTES_PER_PIXEL;

void PutPixel(uint8_t* pImgData, int x, int y, const uint8_t color[3])
{
    uint8_t pPixel = pImgData + y * BYTES_PER_ROW + x * BYTES_PER_PIXEL;
    for (int iByte = 0; iByte < BYTES_PER_PIXEL; ++iByte)
    {
        pPixel[iByte] = color[iByte];
    }
}

示例如何使用此功能:

// Allocate image data.
uint8_t* pImgData = new uint8_t[IMG_WIDTH * IMG_HEIGHT];

// Initialize image data, unless you are planning to set all pixels.
...

// Set pixel (50, 30) to yellow.
uint8_t yellow[3] = {255, 255, 0};
PutPixel(pImgData, 50, 30, yellow);

在内存中构建图像后,可以使用glBufferData()将内容存储在像素缓冲区对象中:

GLuint bufId = 0;
glGenBuffers(1, &bufId);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, bufId);
glBufferData(GL_PIXEL_UNPACK_BUFFER, IMG_HEIGHT * BYTES_PER_ROW,
             pImgData, GL_STATIC_DRAW);