【问题标题】:glTexEnv returns inexplainable INVALID_OPERATION ERRORglTexEnv 返回无法解释的 INVALID_OPERATION ERROR
【发布时间】:2010-11-26 21:21:14
【问题描述】:

问题:

就在“glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);”之后我收到了 GL 错误 #1282(INVALID_OPERATION)。

然后在查阅OpenGL 2.1 Reference的时候,在glTexEnv下说:glTexEnv在glBegin执行到对应的glEnd执行之间执行,就会产生GL_INVALID_OPERATION。 但是这不是我的情况,因为我使用的是顶点数组。

这是我的部分代码:

void RBFS::render_pass1_point_sprites(Shader &shader1, int width, int height, float t)
{
 shader1.bind();

 glActiveTexture(GL_TEXTURE0);{
  glBindTexture(GL_TEXTURE_1D, m_texRBFData[0]);
  MyCheckErrorGL();
 }
 glActiveTexture(GL_TEXTURE1);{
  glBindTexture(GL_TEXTURE_1D, m_texRBFData[1]);
  MyCheckErrorGL();
 }
 glActiveTexture(GL_TEXTURE2);{
  glBindTexture(GL_TEXTURE_3D, m_texSDF);
  MyCheckErrorGL();
 }
 glActiveTexture(GL_TEXTURE3);{
  glBindTexture(GL_TEXTURE_3D, m_texLabels[0]);
  MyCheckErrorGL();
 }
 glActiveTexture(GL_TEXTURE4);{
  glBindTexture(GL_TEXTURE_3D, m_texLabels[1]);
  MyCheckErrorGL();
 } 
 glActiveTexture(GL_TEXTURE5);{
  glBindTexture(GL_TEXTURE_1D, m_texHG);
  MyCheckErrorGL();
 }
 glActiveTexture(GL_TEXTURE9);{
  glBindTexture(GL_TEXTURE_2D, m_texCircle);
  MyCheckErrorGL();
 }

 // upload t
 GLuint loc_t = my_glGetUniformLocation(shader1.id(), "tSlice");
 glUniform1f(loc_t, t);
 MyCheckErrorGL();

 // SET POINT_SPRITE
 glEnable(GL_POINT_SPRITE);
        glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);// so we can set different point size in VShader
 float sizes[2];
 glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, sizes);
 glPointParameterf(GL_POINT_SIZE_MIN, sizes[0]);
 glPointParameterf(GL_POINT_SIZE_MAX, sizes[1]);
 MyCheckErrorGL();
 glTexEnvi( GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);// means tex-coord iteration
 MyCheckErrorGL();
 glPointParameterfARB(GL_POINT_SPRITE_COORD_ORIGIN, GL_LOWER_LEFT);// set origin-y
 MyCheckErrorGL();
 glHint(GL_POINT_SMOOTH_HINT, GL_FASTEST);
 MyCheckErrorGL();

 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo_density);{

  glPushAttrib(GL_VIEWPORT_BIT);
  glViewport(0, 0, width, height);

  glMatrixMode(GL_MODELVIEW);
  glPushMatrix();
  glLoadIdentity();

  glClearColor(0.0,0.0,0.0,1.0);
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  MyCheckErrorGL();

  glDrawArrays(GL_POINTS, 0, numRBFs);//3rd parameter: number of points
  MyCheckErrorGL();

  glDisable(GL_BLEND);
  glPopMatrix();
  glPopAttrib();
 }
 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

 // turn off switches for PSprite
 glDisable(GL_POINT_SPRITE);
 glDisable(GL_VERTEX_PROGRAM_POINT_SIZE);

 MyCheckErrorGL();

 glActiveTexture(GL_TEXTURE9);
 glBindTexture(GL_TEXTURE_2D, 0);
 glActiveTexture(GL_TEXTURE5);
 glBindTexture(GL_TEXTURE_1D, 0);
 glActiveTexture(GL_TEXTURE4);
 glBindTexture(GL_TEXTURE_3D, 0);
 glActiveTexture(GL_TEXTURE3);
 glBindTexture(GL_TEXTURE_3D, 0);
 glActiveTexture(GL_TEXTURE2);
 glBindTexture(GL_TEXTURE_3D, 0);
 glActiveTexture(GL_TEXTURE1);
 glBindTexture(GL_TEXTURE_1D, 0);
 glActiveTexture(GL_TEXTURE0);
 glBindTexture(GL_TEXTURE_1D, 0);

 shader1.unbind();
 MyCheckErrorGL();
}

因为我是 OpenGL 的新手。如果您对我的代码有其他建议,请随时告诉我。:-)

【问题讨论】:

    标签: opengl glsl shader


    【解决方案1】:

    听起来你的 OpenGL 设备根本不支持 POINT_SPRITE。

    GL 2.0 规范将点精灵集成为核心功能。您的设备支持什么 GL 版本?

    【讨论】:

    • 好问题。请发布glGetString(GL_VERSION)的结果。
    • 这只是数字; glGetString(GL_VERSION) 应该包含更多信息(特别是关于您的上下文类型)。由于不推荐使用点功能的子集,因此无论您具有 3.3 兼容性配置文件还是核心配置文件上下文,都非常重要。
    【解决方案2】:

    阅读glTexEnv reference page,它说:

    如果在glBegin的执行和glEnd的相应执行之间执行了glTexEnv,则生成GL_INVALID_OPERATION。

    它也这样说:

    GL_POINT_SPRITE 和 GL_COORD_REPLACE 仅在 GL 版本为 2.0 或更高版本时可用。

    你确定你的卡或者驱动支持opengl 2.0?

    【讨论】:

      猜你喜欢
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 2014-07-27
      • 2020-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多