c++ - glDrawElements() 在无效情况下返回 GL_INVALID_ENUM

标签 c++ opengl

draw_data 下的所有方法都是绘制一个带有两个三角形的正方形。因此硬编码值。广场呈现得很好,但是,我收到垃圾邮件

vertex_renderer::draw_vertex_data()GL ERROR: Invalid enum.

来 self 的代码。我做错了什么吗?

我的渲染方法如下:

bool draw_data(const GLsizei start_index = 0, GLsizei index_count = 0) {
  if (!vbo_id_ || start_index + index_count > index_count_) {
    return false;
  }

  if (index_count == 0) {
    index_count = index_count_;
  }

  glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);

  return !gl_errors::what_errors("vertex_renderer::draw_vertex_data()");
}

gl_errors::what_errors 定义如下:

class gl_errors
{
public:
  static bool what_errors(const char * const prefix) {
    GLenum errorCode;
    bool is_error = false;

    while ((errorCode = glGetError()) != GL_NO_ERROR) {
      switch (errorCode) {
      case(GL_INVALID_ENUM): {
        std::cout << prefix << "GL ERROR: Invalid enum." << std::endl;
        is_error = true;
      }
        break;
      case(GL_INVALID_VALUE): {
        std::cout << prefix << "GL ERROR: Invalid value." << std::endl;
        is_error = true;
      }
        break;
      case(GL_INVALID_OPERATION): {
        std::cout << prefix << "GL ERROR: Invalid operation." << std::endl;
        is_error = true;
      }
        break;
      case(GL_STACK_OVERFLOW): {
        std::cout << prefix << "GL ERROR: Stack overflow." << std::endl;
        is_error = true;
      }
        break;
      case(GL_STACK_UNDERFLOW): {
        std::cout << prefix << "GL ERROR: Stack underflow." << std::endl;
        is_error = true;
      }
        break;
      case(GL_OUT_OF_MEMORY): {
        std::cout << prefix << "GL ERROR: Out of memory." << std::endl;
        is_error = true;
      }
        break;
      }
    }
    return is_error;
  }
};

更新

GLsizei stride = sizeof(verticies_t);
pos_id_ = basic_shader_.get_attribute("position");
glEnableVertexAttribArray(pos_id_);
glVertexAttribPointer(pos_id_, 2, GL_FLOAT, GL_FALSE, stride, 0);
gl_extensions::gl_errors::what_errors("1");

这是罪魁祸首,但我不明白为什么这是导致问题的原因。 GL_FLOAT 是一个有效的枚举。

最佳答案

glDrawElements()只有一种情况会返回 GL_INVALID_ENUM:

GL_INVALID_ENUM is generated if mode is not an accepted value.

这应该会让您怀疑对 API 的其他调用,因为您的 glDrawElements() 调用具有有效模式。对之前调用的电话添加更多检查,看看您是否找到了问题。

关于c++ - glDrawElements() 在无效情况下返回 GL_INVALID_ENUM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16681646/

相关文章:

c++ - 内核同步

c++ - 创建纹理后,OpenGL 抗锯齿形状

opengl - 如何计算法线矩阵?

c++ - 了解用于在 OpenGL 3.3+ 核心中使用三角形绘制四边形的代码

c - SDL+OpenGL 在 linux 下工作但在 windows 下不工作,不是编译器/链接器问题

c++ - GLSL - 给定顶点法线计算表面法线

c++ - 为模板类重载友元运算符 <<

c++ - "get() const"与 "getAsConst() const"

C++继承: Base attributes over various derived objects

c++ - C 编程中 printf() 的返回类型