gpt4 book ai didi

ios - iOS 上的多个顶点缓冲区 OpenGL ES

转载 作者:行者123 更新时间:2023-12-01 17:58:03 26 4
gpt4 key购买 nike

我最近解决了一个问题,该问题阻止了我的光照在 OpenGL ES iOS 应用程序中工作:

Solved Question

我通过更换解决了这个问题

glEnable(GL_DEPTH_TEST);
glGenVertexArraysOES(1, &_vertexArray);
glBindVertexArrayOES(_vertexArray);

glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, loader.currentCountOfVerticies * sizeof(GLfloat) * 3, arrayOfVerticies, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 12, BUFFER_OFFSET(0));

glGenVertexArraysOES(1, &_normalArray);
glBindVertexArrayOES(_normalArray);

glGenBuffers(1, &_normalBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _normalBuffer);
glBufferData(GLKVertexAttribNormal, loader.currentCountOfNormals * sizeof(GLfloat) * 3,loader.arrayOfNormals , GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 12, BUFFER_OFFSET(0));
glBindVertexArrayOES(0);


glEnable(GL_DEPTH_TEST);

glGenVertexArraysOES(1, &_vertexArray);
glBindVertexArrayOES(_vertexArray);

glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, total * sizeof(GLfloat), mergedArray, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));

glBindVertexArrayOES(0);

将顶点和法线数组组合成一个 GLfloat数组并将该数组传递给单个缓冲区。这解决了我的问题,但我不明白为什么。据我所知,我应该能够使用 2 个缓冲区?

最佳答案

问题不在于使用多个顶点缓冲区,而在于使用了多个顶点数组对象。顶点数组对象 (VAO) 是一个轻量级对象(意味着它不包含任何实际的顶点属性数据),它封装了使用单个绘图调用渲染一组顶点数组所需的所有状态,特别是

  • 使用 glVertexAttribPointer 进行的设置对于每个属性索引
  • 启用的属性数组
  • 绑定(bind)元素数组缓冲区

  • 因此,它比单个顶点属性数组高一级,包括单个(概念)场景对象的所有顶点属性数组设置,或者更准确地说,单个绘制调用。

    但是在您的原始代码中,您为每个单独的属性创建一个新的顶点数组对象。然后渲染时,您只需绑定(bind) _vertexArray反过来只设置和启用 GLKVertexAttribPosition属性,因此没有法线或其他任何东西。

    因此,您应该将原始代码替换为:
    glGenVertexArraysOES(1, &_vertexArray);
    glBindVertexArrayOES(_vertexArray);

    glGenBuffers(1, &_vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, loader.currentCountOfVerticies * sizeof(GLfloat) * 3, arrayOfVerticies, GL_STATIC_DRAW);

    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 12, BUFFER_OFFSET(0));

    //this is the error
    //glGenVertexArraysOES(1, &_normalArray);
    //glBindVertexArrayOES(_normalArray);

    glGenBuffers(1, &_normalBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, _normalBuffer);
    glBufferData(GLKVertexAttribNormal, loader.currentCountOfNormals * sizeof(GLfloat) * 3,loader.arrayOfNormals , GL_STATIC_DRAW);

    glEnableVertexAttribArray(GLKVertexAttribNormal);
    glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 12, BUFFER_OFFSET(0));

    glBindVertexArrayOES(0);

    关于ios - iOS 上的多个顶点缓冲区 OpenGL ES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14122344/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com