Что я хочу сделать, так это получить доступ к пиксельным данным текстуры в шейдере OpenGL. После этого сравните их красный компонент, чтобы я мог получить координату пикселя с максимальным красным компонентом. Я могу сделать это с целью C, с вычислительной мощностью процессора. Код показан ниже.
- (void)processNewPixelBuffer:(CVPixelBufferRef)pixelBuffer
{
short maxR = 0;
NSInteger x = -1, y = -1;
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
height = CVPixelBufferGetHeight(pixelBuffer);
width = CVPixelBufferGetWidth(pixelBuffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer);
uint8_t *src_buff = CVPixelBufferGetBaseAddress(pixelBuffer);
short** rawData = malloc(sizeof(short*) * height);
for (int i = 0; i < height; i++){
rawData[i] = malloc((sizeof(short) * width));
for (int j = 0; j < width; j++)
rawData[i][j] = (short)src_buff[(i + width * j) * 4];
}
for (int j = 0; j < height; j++)
for (int i = 0; i < width; i++)
if (rawData[i][j] >= maxR) {
maxR = rawData[i][j];
x = i;
y = j;
}
free(rawData);
}
Итак, мой вопрос: как мне использовать GPU для выполнения этого процесса? Я могу сделать пиксельный буфер как текстуру в шейдере OpenGL.
Вершинный шейдер
attribute vec4 position;
attribute vec4 inputTextureCoordinate;
varying vec2 textureCoordinate;
void main()
{
gl_Position = position;
textureCoordinate = inputTextureCoordinate.xy;
}
Фрагментный шейдер
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture; //The input sample, in RGBA format
void main()
{
// Code here
}
Как изменить шейдер, чтобы определить пиксель с максимальным красным компонентом? Затем я хочу превратить этот пиксель в красный цвет, а другой пиксель в белый. Это возможно?