1

gl_luminance を使用して FBO を定義する際に問題が発生しました。これが私が使用したコードです、

 generateRenderToTexture(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, _maskTexture, _imageWidth, _imageHeight, false);

関連するコードは次のとおりです。

TextureBuffer _maskTexture;

class TextureBuffer {
public:
GLuint texture;
GLuint frameBuffer;
GLenum internalformat;
GLenum format;
GLenum type;
int    w,h;

TextureBuffer() : texture(0), frameBuffer(0) {}
void release() 
{
    if(texture)
    {
        glDeleteTextures(1, &texture);
        texture = 0;
    }
    if(frameBuffer)
    {
        glDeleteFramebuffers(1, &frameBuffer);
        frameBuffer = 0;
    }

}
};

void generateRenderToTexture(GLint internalformat, GLenum format, GLenum type,
                                     TextureBuffer &tb, int w, int h, bool linearInterp)
{
    glGenTextures(1, &tb.texture);
    glBindTexture(GL_TEXTURE_2D, tb.texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, linearInterp ? GL_LINEAR : GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, linearInterp ? GL_LINEAR : GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, internalformat, w, h, 0, format, type, NULL);

    glGenFramebuffers(1, &tb.frameBuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, tb.frameBuffer);
    glClear(_glClearBits);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tb.texture, 0);

    GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    if(status != GL_FRAMEBUFFER_COMPLETE)
        printf("Framebuffer status: %x", (int)status);

    tb.internalformat = internalformat;
    tb.format = format;
    tb.type = type;
    tb.w = w;
    tb.h = h;
}

問題はいつ使うか、

generateRenderToTexture(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, _maskTexture, _imageWidth, _imageHeight, false);

コードはうまくいきました。ただし、代わりに gl_luminance を使用すると、

generateRenderToTexture(GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE,  _maskTexture,  _imageWidthOriginal, 

GL_LUMINANCE を使用して FBO を定義できなかった理由がわかりません。これを解決するための有用な提案はありますか?

4

3 に答える 3

4

仕様ドキュメントの表 4.5 によると、ES 2.0 でカラー FBO 添付ファイルとして機能することが保証されている唯一の形式は次のとおりです。

  • GL_RGBA4
  • GL_RGB5_A1
  • GL_RGB565

GL_RGBA へのレンダリングのサポートは、標準では必要ありません。ただし、多くの実装でサポートされています。OES_rgb8_rgba8 拡張機能GL_RGB8は、レンダー ターゲットとしておよびGL_RGBA8フォーマットのサポートを追加します。

GL_LUMINANCE標準ではカラーレンダリング可能な形式としてサポートされておらず、その拡張機能も見つかりません。一部の実装がそれをサポートする可能性はありますが、確実に当てにすることはできません。

ES 3.0 はGL_R8、カラー レンダリング可能な形式としてリストされています。ES 3.0 では、 ES 2.0 の/フォーマットがRED/Rフォーマットに置き換えられました。したがって、ES 3.0 に移行できれば、1 コンポーネント テクスチャ フォーマットへのレンダリングがサポートされます。LUMINANCEALPHA

于 2014-06-22T13:58:00.080 に答える
1

OpenGL-3 でのみ導入された非拡張 FBO 関数を使用しています。そのため、FBO 拡張関数 (で終わるARB) とは異なり、これらの関数は OpenGL-3 コンテキストでのみ使用できます。OpenGL-3 では、GL_LUMINANCE および GL_ALPHA テクスチャ内部フォーマットは廃止され、コア プロファイルでは使用できません。これらは GL_RED テクスチャ フォーマットに置き換えられました。適切に記述されたシェーダーまたはテクスチャ スウィズル パラメータを使用して、GL_RED テクスチャを GL_LUMINANCE (スウィズルdst.rgb = texture.r) または GL_ALPHA (スウィズル)のように機能させることができますdst.a = texture.r

于 2014-06-22T11:10:46.740 に答える
0

代わりに GL_RG_EXT または GL_RED_EXT を使用して解決しました。

于 2014-06-24T07:07:47.927 に答える