私がやりたいことは、OpenGL Shader のテクスチャのピクセル データにアクセスすることです。その後、最大の赤成分を持つピクセルの座標を取得できるように、それらの赤成分を比較します。CPU の処理能力を備えた Objective 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 Shader で pixelBuffer をテクスチャとして作成できます。
頂点シェーダー
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
}
最大の赤成分を持つピクセルを見つけることができるようにシェーダーを変更するにはどうすればよいですか? 次に、そのピクセルを赤に、他のピクセルを白に変えたいと思います。それは可能ですか?