フラグメント シェーダーを使用して単純なテクスチャを 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 クラスの外に出ると、正しい画像サイズが返されましたが、解像度が間違っています。解像度の画像には雪だけが含まれていますが、側面に黒いバーはありません。
誰かがこのエラーの解決策を知っていましたか?
よろしく、クリキット