1

フラグメント シェーダーを使用して単純なテクスチャを 4 つの頂点にレンダリングし、glReadPixels を使用して画像の解像度を読み取るのが好きです。(readPixel) サイズを (source)picture サイズのように設定しましたが、完全な画像は返されませんでした。右側には常に黒いバーがあります。そして、画像は圧縮されているようです。

画像の返された部分は正しいです。これは、私のソーベル シェーダの解像度を示しています。そのため、ReadPixel 部分または SetImage 部分にエラーがあるとは思いませんでした。しかし、私は知りません...

画像ソースを設定する私の方法は次のとおりです。

-(void)setImageSource : (unsigned char*) image
{
static const GLfloat textureVertices[] = 
{
    0.0f, 1.0f,
    0.0f, 0.0f,
    1.0f, 1.0f,
    1.0f, 0.0f,
};

static const GLfloat squareVertices[] = 
{
    -1.0f, -1.0f,
    1.0f, -1.0f,
    -1.0f, 1.0f,
    1.0f, 1.0f
};

glGenTextures(1, &pictureTexture);
glActiveTexture(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, pictureTexture);

glUniform1i(uniforms[UNIFORM_VIDEOFRAME], 0);

glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_TEXTUREPOSITON, 2, GL_FLOAT, 0, 0, textureVertices);
glEnableVertexAttribArray(ATTRIB_TEXTUREPOSITON);

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, imageHeight, imageWidth, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
}

テクスチャをレンダリングする部分は次のとおりです。

-(void)render
{
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    glViewport(0, 0, imageHeight, imageWidth);

    [self presentFramebuffer];
}

そして、ここに解決策を読み返す部分があります:

-(void)readPixels : (unsigned char*) dest
{            
    glReadPixels(0, 0, imageHeight, imageWidth, GL_RGBA, GL_UNSIGNED_BYTE, dest);

    glDeleteTextures(1, &pictureTexture);
}

どこでエラーを起こしているのかわかりません。このフォーラムと khronos グループ フォーラムを検索しましたが、解決策が見つかりませんでした (また、同じエラーの説明を持つケースも見つかりませんでした)。

別の重要な、または紛らわしい情報かもしれません-コードをc ++クラスに入れようとしました。しかし、EAGLContext を使用して Objective C クラスの外に出ると、正しい画像サイズが返されましたが、解像度が間違っています。解像度の画像には雪だけが含まれていますが、側面に黒いバーはありません。

誰かがこのエラーの解決策を知っていましたか?

よろしく、クリキット

4

1 に答える 1

1

私は問題を解決しました。エラーは、OpenGL ES ビューの初期化にありました。initWithFrame の四角形を作成する部分。

CGRectMake(0.0f, 0.0f, applicationFrame.size.width, applicationFrame.size.height)

サイズを自分で設定すると、サイズが間違っています。目的地で全体像が得られます。

レンダリングされた画像の雪の他の部分は、間違ったデータ型から来ています。変数をGLuintにキャストすると、同じではなく、新しいGLuint変数を初期化して値を設定します...しかし、理由がわかりません。

unsigned int j = 20
GLuint i = 20;

glReadPixels(0, 0, j, (GLuint)j, GL_RGBA, GL_UNSIGNED_BYTE, pictureDest); キャストされた要素の代わりにGLuint変数を使用すると、すべて正常に動作します。

クリキット

于 2012-09-13T11:32:28.097 に答える