当前位置: 首页 > 知识库问答 >
问题:

VBO不使用UV坐标

宫俊才
2023-03-14

我的渲染方法目前看起来像这样:

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

    EntityCamera* camera = (EntityCamera*) resourceManager_->getResource(GHOST_CAMERA);

    mat4 proj;
    Matrix::projection3D(proj, 45.0f,
            (float) nScreenWidth_ / nScreenHeight_, GHOST_NEAR_DISTANCE, GHOST_FAR_DISTANCE);

    mat4 view;
    Matrix::multiply(proj, camera_->getMatrix(), view);
    camera->extractPlanes(view);

    for (vector<Node*>::const_iterator it = renderArray_.begin(); it != renderArray_.end();
            it++) {
        Node* node = *it;
        if (!node->isRenderable()) {
            continue;
        }
        if (node->hasBV() && node->getBV()->isInFrustum(camera, node) == BoundingVolume::OUTSIDE) {
            LOGI("Node %s is outside :O", node->getName().c_str());
            continue;
        }
        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 res;
        Matrix::multiply(view, 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");

        // Specify WVP matrix.
        glUniformMatrix4fv(matrix, 1, false, res);
        checkGlError("glUniformMatrix4fv");

        // Load vertex positions.
        if (!entity->isCompiled()) {
            //LOGI("Entity %s, not compiled.", entity->getName().c_str());
            continue;
        }
        glEnableVertexAttribArray(vertices);
        checkGlError("glEnableVertexAttribArray");
        //glVertexAttribPointer(vertices, 3, GL_FLOAT, GL_FALSE, 0,
        //      &(*entity->getVertices())[0]);
        //LOGI("%s vbo id: %d", node->getName().c_str(), entity->getVBO());
        glBindBuffer(GL_ARRAY_BUFFER, entity->getVBO());
        checkGlError("glBindBuffer");
        glVertexAttribPointer(vertices, 3, GL_FLOAT, GL_FALSE, 0, 0);
        checkGlError("glVertexAttribPointer");
        // Load UV coordinates.
        glEnableVertexAttribArray(textureCoords);
        checkGlError("glEnableVertexAttribArray");
        glVertexAttribPointer(textureCoords, 2, GL_FLOAT, GL_FALSE, 0,
                &(*entity->getTextureCoords())[0]);
        checkGlError("glVertexAttribPointer");

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

        if (entity->hasIndices()) {
            vector<vector<GLushort>*>* indices = entity->getIndices();
            for (unsigned int i = 0; i < indices->size(); i++) {
                if (entity->hasBoundingVolumes()) {
                    BoundingVolume* volume = (*entity->getBoundingVolumes())[i];
                    if (volume->isInFrustum(camera, node) == BoundingVolume::OUTSIDE) {
                        continue;
                    }
                }
                vector<GLushort>* ind = (*indices)[i];
                glDrawElements(GL_TRIANGLES, ind->size(), GL_UNSIGNED_SHORT, &(*ind)[0]);
                checkGlError("glDrawElements");
            }
        }
        else {
            glDrawArrays(GL_TRIANGLES, 0, entity->getVertices()->size() / 3);
            checkGlError("glDrawArrays");
        }
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        checkGlError("glBindBuffer");
    }
}

我最近刚刚尝试使用VBO,在我直接发送顶点数据之前,一切工作正常,纹理映射正确。现在我用VBO改变了顶点数组,即使它有效,也没有应用纹理,我只能看到黑色的物体。

  1. 我的纹理可能有什么问题
  2. 为什么当我更改GLVertexAttribute指针(顶点,3,GL_FLOAT,GL_ FALSE,0,0)时;带glBindBuffer的行顺序(GL_ARRAY_BUFFER,实体-

共有1个答案

邢高爽
2023-03-14

您从普通内存发送UV坐标,而您似乎从VBO发送顶点坐标。这可能效率不高,您应该在VBO中同时使用这两个数据集,以利用VBO的优势。

话虽如此,我认为您的问题是在发送UV坐标之前没有取消绑定您的VBO。您的代码应该是:

glBindBuffer(GL_ARRAY_BUFFER, 0);
glVertexAttribPointer(textureCoords, 2, GL_FLOAT, GL_FALSE, 0,
            &(*entity->getTextureCoords())[0]);

因为我假设您的< code > gettexturerecords()不会在您的VBO中返回偏移量。

 类似资料:
  • 问题内容: 我正在使用THREE.js OBJ加载器将模型导入场景。 我知道我可以很好地导入几何图形,因为当我给它分配MeshNormalMaterial时,它显示的很好。但是,如果我使用任何需要UV坐标的东西,则会出现以下错误: 我知道这是因为加载的OBJ没有UV坐标,但是我想知道是否有任何方法可以生成所需的纹理坐标。我努力了 …但无济于事。 有什么方法可以使用three.js自动生成UV纹理,

  • 在课程的第二章对Threejs几何体Geometry和BufferGeometry的顶点概念做过比较多的介绍,讲解过顶点位置坐标数据、顶点颜色数据、顶点法线方向向量数据,不过顶点的UV数据没有去讲解,主要是几何体顶点的纹理坐标数据和纹理贴图的映射有关系,所以放在了本章节去讲解。 纹理UV坐标 纹理坐标含义就是一面意思,一张纹理贴图图像的坐标,选择一张图片,比如以图片左下角为坐标原点,右上角为坐标(

  • 我正在尝试制作一个类似于minecraft的opengl体素引擎。 我创建了一个块类,我想把整个块的所有顶点放在一个VBO中。我以前只把每个块放入vbo,并调用渲染每个块。 当我将所有顶点放入一个vbo中时,我对如何转换块中每个块的坐标感到有点困惑。 这是我目前所拥有的: 有什么简单的方法可以将每个块的顶点转换到正确的位置?我以前在每次调用渲染块时都使用glTranslatef,但现在不行了。我现

  • uv-web是一个轻量级的支持高并发的WSGI Web服务器,基于libuv构建,部分代码源于开源项目bjoern,本质是python的C扩展,所以适用于部署绝大部分 python web应用(如 Django) 特性 兼容 HTTP 1.0/1.1 支持 keep-alive 基于libuv事件循环库,跨平台性良好,并发表现不错 部署方便,相当于python扩展模块 使用 一般运行方式: imp

  • 每次我尝试运行我的 LWJGL 应用程序时,JVM 都会崩溃。这似乎与向我的 VBO 添加多个三角形有关。 这是我的初始化代码 这是我的渲染代码 当我删除顶点数组中的最后9个值时,它工作得很好,但是如果我保留这些值,或者添加更多的值,JVM就会崩溃。

  • 我正在使用区块系统(如Minecraft)制作一个小体素引擎。我决定每个区块制作一个VBO,这样VBO就包含了多个使用不同纹理的立方体。 实际上,我有一个立方体的UV,我想在VBO中的所有立方体上使用它,因此如果立方体在分离的VBO中,纹理将以相同的方式包裹所有立方体。 以下是我实际得到的信息: 如何告诉OpenGL在所有多维数据集上执行与第一个多维数据集相同的操作? 编辑:这里是我的着色器:顶点