3

プログラムでn個のテクスチャをレンダリングし、後で使用できるように保存したいと思います。したがって、OpenGLFramebufferObjectを使用します。

最初に、このような128のテクスチャで配列を作成します

self.textures = glGenTexture(128)

2番目のステップは、128回の反復を伴うループで、位置iでテクスチャをバインドし、そこにレンダリングします。

    glBindTexture(GL_TEXTURE_2D, self.texture[i])
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST)
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,  width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, None);
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,  GL_TEXTURE_2D, self.texture[i], 0);
    renderScene()

最後のステップは、別のループであるMainGameLoopです。このループでは、テクスチャ配列から1つのテクスチャを使用して平面をレンダリングします。

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    gluLookAt(0,0,1,0,0,0,0,1,0)
    glEnable(GL_TEXTURE_2D)

    glBindTexture(GL_TEXTURE_2D, self.texture[i])

    glBegin(GL_QUADS)

    glNormal3f(0.0, 1.0, 0.0)
    glTexCoord2f(0.0, 0.0)
    glVertex3f(-1, 1, -1)
    glTexCoord2f(1.0, 0.0)
    glVertex3f(1, 1, -1)
    glTexCoord2f(1.0, 1.0)
    glVertex3f(1, -1, -1)
    glTexCoord2f(0.0, 1.0)
    glVertex3f(-1, -1, -1)

    glEnd();

    glDisable(GL_TEXTURE_2D)

しかし、問題が発生したため、画面が真っ暗になりました。

4

1 に答える 1

5

フレームバッファ オブジェクトへのカラー アタッチメントとして使用する場合、テクスチャをバインドしてはなりません。ただし、接続する前にそれをバインドしているため、もちろん全体が壊れます。

正しいコードは、すべてのマルチテクスチャリング ユニットを繰り返し処理し、テクスチャがそれらのいずれにもバインドされていないことを確認します。

コメントによる更新:

コードでテクスチャ名をバインドし、そのパラメータを設定します

glBindTexture(GL_TEXTURE_2D, self.texture[i])
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST)

次に、ヌル データでテクスチャ オブジェクトを初期化します。

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,  width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, None);

最後に、フレームバッファアタッチメントとしてアタッチします。

glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,  GL_TEXTURE_2D, self.texture[i], 0);

問題は、バインドされているため、テクスチャがまだデータ ソースとして選択されていることです。テクスチャは、フレームバッファ カラー アタッチメントとして機能するために、テクスチャリング ユニットにバインドしてはなりません。また、FBO はレンダー ターゲットとしてどこかにバインドする必要があります。

renderScene()

以下は、特定のテクスチャ オブジェクトがどのテクスチャリング ユニットにもバインドされていないことを確認する小さなヘルパー関数です。

def glhelperUnbindTexture(target, name):
    max_units = max(glGetInteger(GL_MAX_TEXTURE_UNITS),
                    glGetInteger(GL_MAX_TEXTURE_IMAGE_UNITS),
                    glGetInteger(GL_MAX_TEXTURE_COORDS))
    current_unit = glGetInteger(GL_ACTIVE_TEXTURE)

    for i in range(max_units):
        glActiveTexture(GL_TEXTURE0 + i)
        binding = glGetInteger( {GL_TEXTURE_1D: GL_TEXTURE_BINDING_1D,
                                 GL_TEXTURE_2D: GL_TEXTURE_BINDING_2D,
                                 GL_TEXTURE_3D: GL_TEXTURE_BINDING_3D,
                                 GL_TEXTURE_CUBE_MAP: GL_TEXTURE_BINDING_CUBE_MAP}[target])
        if binding == name:
             glBindTexture(target, 0) # this unbinds the texture from the texturing unit

    glActiveTexture(current_unit)
于 2012-07-28T14:38:53.073 に答える