0

エンジンに複数のテクスチャがあると問題が発生しました。

私のレンダリングコードは現在次のようになっています:

void Renderer::render() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    checkGlError("glClear");

    for (vector<Node*>::const_iterator it = renderArray_.begin(); it != renderArray_.end();
            it++) {
        Node* node = *it;
        EntityModel* entity =
                static_cast<EntityModel*>(resourceManager_->getResource(
                        (*it)->getEntity()));
        if (entity == 0 || entity->getVertices() == 0 || entity->getVertices()->size() == 0) {
            LOGI("Empty entity %s.", node->getName().c_str());
            continue;
        }
        Resource* resource = resourceManager_->getResource(node->getShader());
        Shader* shader = static_cast<Shader*>(resource);
        Resource* resource2 = resourceManager_->getResource(entity->getTexture());
        Image* image = static_cast<Image*>(resource2);
        mat4 proj;
        Matrix::projection3D(proj, 45.0f,
                (float) nScreenWidth_ / nScreenHeight_, 0.1f, 100.0f);
        mat4 res;
        Matrix::multiply(proj, node->getMatrix(), res);

        // Select shader program to use.
        glUseProgram(shader->getId());
        checkGlError("glUseProgram");

        int matrix = glGetUniformLocation(shader->getId(), "uWVP");
        int texture = glGetUniformLocation(shader->getId(), "texture_0");
        checkGlError("glGetUniformLocation");
        int textureCoords = glGetAttribLocation(shader->getId(), "attrTexCoords");
        int vertices = glGetAttribLocation(shader->getId(), "attrPos");
        checkGlError("glGetAttribLocation");

        // Load vertex positions.
        glUniformMatrix4fv(matrix, 1, false, res);
        glVertexAttribPointer(vertices, 3, GL_FLOAT, GL_FALSE, 0,
                &(*entity->getVertices())[0]);
        glEnableVertexAttribArray(vertices);
        checkGlError("Loading vertex positions");

        glVertexAttribPointer(textureCoords, 2, GL_FLOAT, GL_FALSE, 0,
                &(*entity->getTextureCoords())[0]);
        checkGlError("glVertexAttribPointer");
        glEnableVertexAttribArray(textureCoords);
        checkGlError("glEnableVertexAttribArray");

        // Bind the texture.
        glActiveTexture(GL_TEXTURE0);
        checkGlError("glActiveTexture");
        glBindTexture(GL_TEXTURE_2D, image->getId());
        checkGlError("glBindTexture");
        glUniform1i(image->getId(), 0); <====================ERROR HERE!!!
        checkGlError("glUniform1i");

        glDrawArrays(GL_TRIANGLES, 0, entity->getVertices()->size() / 3);
        checkGlError("glDrawArrays");
    }
}

私のテクスチャ読み込みコード:

void Image::compile() {
    glGenTextures(1, &id_);
    glBindTexture(GL_TEXTURE_2D, id_);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width_, height_, 0, GL_RGBA,
            GL_UNSIGNED_BYTE, (GLvoid*) image_);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}

テクスチャを1つだけロードしている場合は、すべて正常に機能します。5つのオブジェクトが同じテクスチャを使用して各オブジェクトのrenderメソッドの内容を繰り返していますが、すべてが正常に実行されているようです。ただし、テクスチャが異なる6番目のオブジェクトを追加したのと同じように、オブジェクトはレンダリングされず、glUniform1i関数でGL_INVALID_OPERATIONを取得し続けます。また、 http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xmlを確認したところ、機能しない理由がわかりましたが、見つからなかったようです。

何が間違っているのでしょうか?

4

1 に答える 1

7

このコード

glUniform1i(image->getId(), 0);

とにかく間違っています。テクスチャIDをサンプラーではなく、テクスチャユニットにバインドします。また、ユニフォームの最初のパラメータはロケーションIDであり、テクスチャIDでもありません。正しいコードは次のようになります

glActiveTexture(GL_TEXTURE0 + active_textue);

/* ... */

glUniform1i(glGetUniformLocation(program, "samplername"), active_texture);

または、シェーダーで事前定義された場所を使用している場合

glUniform1i(texture_sample_location, active_texture);

編集: D'oh、私の側の悪い間違い。もちろん、ユニフォームはGL_TEXTURE0トークンへのオフセットを取ります。

于 2012-07-04T14:56:33.640 に答える