【问题标题】:Opengl only draw the first object createOpengl 只绘制第一个对象创建
【发布时间】:2021-12-30 10:47:12
【问题描述】:

我无法使用 openGl 渲染多个三角形,只能显示 1 个对象。

我只查看第一个对象,我已经创建了。

对我来说,问题在于索引或 glBufferData() 或 glVertexAttribPointer()。 对于演示,仅使用顶点和索引。

顶点是 Float 类型,索引是 unsigned int 类型。

void Objets::createShader() {
    
        GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER);
        GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
    
        const GLchar* adapter[1];
        string temp = readShaderCode("VertexShaderCode.glsl");
        adapter[0] = temp.c_str();
        glShaderSource(vertexShaderID, 1, adapter, 0);
        temp = readShaderCode("FragmentShaderCode.glsl");
        adapter[0] = temp.c_str();
        glShaderSource(fragmentShaderID, 1, adapter, 0);
    
        glCompileShader(vertexShaderID);
        glCompileShader(fragmentShaderID);
    
        //checkShaders(vertexShaderID, fragmentShaderID); no error
    
        programID = glCreateProgram();
        glAttachShader(programID, vertexShaderID);
        glAttachShader(programID, fragmentShaderID);
        glLinkProgram(programID);
    
        //checkProgram(programID); no error
    
        glDeleteShader(vertexShaderID);
        glDeleteShader(fragmentShaderID);
    
        glGenVertexArrays(1, &VAO);
    
        glGenBuffers(1, &vertexBufferID);
        glGenBuffers(1, &colorBufferID);
        glGenBuffers(1, &indexBufferID);
    }

在使用 sfml 创建窗口后,我使用 createShader()。

我创建了 2 个形状并加载了我的 2 个形状:

graphiques3d.createShapeAndBufferit(Shapes::loadFromFileObj("objs/Cube.004.obj"));
graphiques3d.createShapeAndBufferit(Shapes::loadFromFileObj("objs/Cube.007.obj"));
Shapes Shapes::loadFromFileObj(string nameFile) {

    Shapes shape;

    string newString;
    string buf;
    string line;

    ifstream myfile(nameFile);
    if (myfile.is_open())
    {
        while (getline(myfile, line))
        {
            std::stringstream ss;

            if (line.rfind(shape.verticesS, 0) == 0) {

                newString = line.substr(2, line.length());
                ss.str(newString);
                while (ss >> buf) {
                    shape.vertices.push_back((GLfloat)stof(buf));
                }

            }
            else if (line.rfind(shape.indicesS, 0) == 0) {

                newString = line.substr(2, line.length());
                ss.str(newString);
                while (ss >> buf) {
                    GLuint valBuffer = (GLuint)atoi(buf.c_str());
                    shape.indices.push_back((GLuint)(valBuffer - 1));
                }

            }

        }
        myfile.close();
    }
    else cout << "Unable to open file";

    return shape;

}

然后它使用 createShapeAndBufferit(Shapes shape);

void Objets::createShapeAndBufferit(Shapes shape) {

    for (int a = 0; a < shape.getVertices().size(); a++)
        vertices.push_back(shape.getVertices().at(a));
    for (int b = 0; b < shape.getIndices().size(); b++)
        indices.push_back(shape.getIndices().at(b));

    glBindVertexArray(VAO);

    glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID);
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(GLfloat), &vertices[0], GL_STATIC_DRAW);

    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferID);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(GLuint), &indices[0], GL_STATIC_DRAW);

}

当我打印我的形状时,我有这个:

/1/1/-3/1/-1/-3/1/1/-1/1/-1/-1/-1/1/-3/-1/-1/-3 /-1/1/-1/-1/-1/-1 sizeVertices: 24 :4:2:0:2:7:3:6:5:7:1:7:5:0:3:1:4:1:5:4:6:2:2:6:7:6 :4:5:1:3:7:0:2:3:4:0:1 sizeIndices: 36

/3/1/1/3/-1/1/3/1/3/3/-1/3/1/1/1/1/-1/1/1/1/3/1 /-1/3 sizeVertices: 24 :4:2:0:2:7:3:6:5:7:1:7:5:0:3:1:4:1:5:4:6:2:2:6:7:6 :4:5:1:3:7:0:2:3:4:0:1 sizeIndices: 36

然后我画了:

void Objets::dessiner(float x, float y, float z) {

    glClearColor(0.f, 0.f, 0.f, 1.f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glViewport(0, 0, width, height);

    glUseProgram(programID);

    mat4 projectionMatrix = glm::perspective(90.f, width / height, 0.1f, 100.f);
    mat4 modelTransformMatrix = glm::translate(vec3(x, y, z));

    mat4 modelFullTransformMatrix = projectionMatrix * modelTransformMatrix;

    GLint modelTransformMatrixUniformLocation =
        glGetUniformLocation(programID, "modelFullTransformMatrix");

    glUniformMatrix4fv(modelTransformMatrixUniformLocation,
        1, GL_FALSE, &modelFullTransformMatrix[0][0]);

    glBindVertexArray(VAO);
    glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, (GLvoid*)0);
    glBindVertexArray(0);
}

我不知道你是否需要fragmentShader和vertexShader,所以我说:

片段着色器:

#version 330 core

out vec4 FragColor;
in vec3 color;

void main()
{
    FragColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);
}

顶点着色器:

#version 330 core

layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;

uniform mat4 modelFullTransformMatrix;
out vec3 color;

void main()
{
    vec4 v = vec4(aPos, 1.0);
    gl_Position = modelFullTransformMatrix*v;
    color = aColor;
}

【问题讨论】:

  • 我已经知道我的问题是:/1/1/-3/1/-1/-3/1/1/-1/1/-1/-1/-1/1 /-3/-1/-1/-3/-1/1/-1/-1/-1/-1 :4:2:0:2:7:3:6:5:7:1: 7:5:0:3:1:4:1:5:4:6:2:2:6:7:6:4:5:1:3:7:0:2:3:4:0: 1 /3/1/1/3/-1/1/3/1/3/3/-1/3/1/1/1/1/-1/1/1/1/3/1/- 1/3 :4:2:0:2:7:3:6:5:7:1:7:5:0:3:1:4:1:5:4:6:2:2:6: 7:6:4:5:1:3:7:0:2:3:4:0:1 我的代码这样做:/1/1/-3/1/-1/-3/1/1/ -1/1/-1/-1/-1/1/-3/-1/-1/-3/-1/1/-1/-1/-1/-1 /1/1/- 3/1/-1/-3/1/1/-1/1/-1/-1/-1/1/-3/-1/-1/-3/-1/1/-1/ -1/-1/-1,因为它们是相同的索引,我可以为 opengl 做一些事情以使用我的索引,或者我只能更改我的索引值?

标签: c++ opengl sfml


【解决方案1】:

因此,如果我正确理解您的解释,您的问题是您加载了两个单独的网格(“形状”),并且每个网格的索引都从零开始,但是您想在一次绘制调用中绘制它们吗?

也许glMultiDrawElementsBaseVertex 是你所追求的?

除了基本的 DrawArrays / DrawElements 之外,另请参阅 https://www.khronos.org/opengl/wiki/Vertex_Rendering

【讨论】:

  • 感谢您的回复,我会检查一下,当我找到这样做的好方法时,我会回来发布它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多