1

OpenGL の基本概念を理解しようとしています。それから1週間、私はまだそこから遠く離れています。glsl に入ると、何をすべきかはわかりますが、そこにたどり着くのは少し難しいと思います。

現在、操作して提示するビデオピクセルを渡すことができます。その後、静止画像をオーバーレイとして追加しようとしています。これは私が迷子になるところです。私の最終的な目標は、ビデオと静止画の両方からのピクセル データを使用して、同じフラグメント シェーダーになることです。これは、2 つのテクスチャが必要で、2 つのピクセル バッファを渡すことを意味していると思います。私は現在、次のようにビデオピクセルを渡しています:

glGenTextures(1, &textures[0]);

//target, texture
glBindTexture(GL_TEXTURE_2D, textures[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer);

次に、画像の 2 番目のバッファーを使用して、テクスチャ [1] でこのプロセスを繰り返しますか? その場合、GL_TEXTURE0 と GL_TEXTURE1 の両方をバインドしますか? ...そして、私のシェーダは次のようになりますか?

uniform sampler2D videoData;
uniform sampler2D imageData;

シェーダーに入ったら?どんな組み合わせを試しても、画像と動画はどちらも動画データだけになってしまうようです。

ここに統合された多くの質問について申し訳ありません。私の多くの仮定をクリアして先に進みたいだけです。質問を少し明確にするために、説明されているプロセスで静止画像からピクセルを追加するにはどうすればよいですか? (「わかりやすい」サンプル コードまたは任意の種類のヒントをいただければ幸いです)。

4

2 に答える 2

2

このコードを自分で書くことさえ気にしないのはどうですか? これらはすべてオープン ソースのGPUImageフレームワーク内にあり、ビデオ カメラ ソースの設定、画像の取り込み、およびその画像のビデオへのオーバーレイは、次のようなコードを使用して実行できます。

videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];
filter = [[GPUImageOverlayBlendFilter alloc] init];
[videoCamera addTarget:filter];
inputImage = [UIImage imageNamed:@"WID-small.jpg"];
sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES];
[sourcePicture processImage];            
[sourcePicture addTarget:filter];
[filter addTarget:filterView];
[videoCamera startCameraCapture];

これはすべて、舞台裏で OpenGL ES 2.0 を使用して、ビデオ フレームと静止画像にフラグメント シェーダーを適用します。これは、私が iOS で認識している他の何よりも高速です。それをサポートするデバイスの場合、これを調整して、いくつかの追加の最適化を使用して、画像とビデオ フレームのアップロード プロセスを高速化しました。

ここで特定の質問に答えるには、はい、そこに示すような 2 つのテクスチャ ユニフォームを作成します。それらを使用する前に、リンクされたシェーダー プログラムからそれぞれの識別子を取得する必要があります。コードでは、2 つのテクスチャを 2 つの異なるテクスチャ ユニットにバインドし、次のようなコードを使用してこれらのテクスチャ ユニットの値をユニフォームに割り当てる必要があります。

glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, sourceTexture);
glUniform1i(filterInputTextureUniform, 2);  

glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_2D, filterSourceTexture2);                
glUniform1i(filterInputTextureUniform2, 3);

glUniform1i()人々が犯すよくある間違いは、テクスチャがバインドされているテクスチャ ユニットの代わりに、ここでテクスチャ名を使用することです。

于 2012-08-31T19:52:47.400 に答える
0

glActiveTextureARB を使用したマルチテクスチャリングが必要です。このチュートリアルをご覧ください http://www.clockworkcoders.com/oglsl/tutorial8.htm

于 2012-08-31T19:51:53.287 に答える