3

私はiOSでOpenGL ES 2.0に取り組んでおり、これを持っています...

  1. 画像 (サイズ 1024x768) を含むテクスチャ (T1)。
  2. オフスクリーン FBO (FBO1) がテクスチャ T1 に関連付けられているため、何かを T1 にレンダリングできます。
  3. 同じサイズの別のテクスチャ (T2)。
  4. T2 に関連付けられた別の FBO (FBO2)。(これを使ってテクスチャ T2 にレンダリングします)。

ここで、ループ内で、T1 のコンテンツを FBO2 にレンダリングし (T1 が T2 に転送される)、T2 を FBO1 にレンダリングします (T2 は T1 に転送されます)。

数回の反復 (わずか 7 ~ 8 回) の後、T1 にロードされた元の画像は、(水平方向のぼかしを行ったかのように) ひどく歪んだりぼやけたりします。

しかし、正方形の画像 (2 の累乗である必要はありません) で同じことを行うと、画像は鮮明なままです。

テクスチャを作成するために使用するコードは次のとおりです。

GLuint texture = 0;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_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_RGBA, GL_UNSIGNED_BYTE, buffer);

そして、これが私がFBOを作成するために使用するコードです...

 glGenFramebuffers(1, &targetFBO);
 glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

私のシェーダーは最も基本的なもので、テクスチャを gl_FragColor にレンダリングするだけです。

これが私のレンダーObjective-Cコードです...

- (void) draw {
    GLfloat textureCoordinates[] = {
        0.0f, 0.0f,
        1.0f, 0.0f,
        0.0f,  1.0f,
        1.0f,  1.0f,
    };

    GLfloat imageVertices[] = {
        -1.0f, -1.0f,
        1.0f, -1.0f,
        -1.0f,  1.0f,
        1.0f,  1.0f,
    };

    glViewport(0, 0, targetWidth, targetHeight);
    glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
    glUseProgram(program);
    glActiveTexture(GL_TEXTURE2);
    glBindTexture(GL_TEXTURE_2D, textureID);
    glUniform1i(inputTextureLocation, 2);
    glDisable(GL_BLEND);

    glVertexAttribPointer(positionLocation, 2, GL_FLOAT, 0, 0, imageVertices);
    glVertexAttribPointer(inputTextureCoordinateLocation, 2, GL_FLOAT, 0, 0, textureCoordinates);
    // Clear the screen
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);   
}

そして私の頂点シェーダー...

 attribute vec4 position;
 attribute vec4 inputTextureCoordinate;

 varying vec2 textureCoordinate;

 void main()
 {
     gl_Position = position;
     textureCoordinate = inputTextureCoordinate.xy;
 }

フラグメント シェーダ...

 varying highp vec2 textureCoordinate;

 uniform sampler2D inputTexture;

 void main()
 {
     gl_FragColor = texture2D(inputTexture, textureCoordinate);
 }

元の画像...元の画像

歪んだ画像...歪んだ画像

正方形でないテクスチャでぼやけを避けるにはどうすればよいですか?

編集:問題は、実際には 2 のべき乗でないテクスチャにあります。非正方形だけではありません。解決策が見つからないので、POT テクスチャを使用します。

4

0 に答える 0