2010-11-25 2 views
4

問題を返します。glTexEnvがinexplainable INVALID_OPERATIONのERRORに

右後 "glTexEnvi(GL_POINT_SPRITE、GL_COORD_REPLACE、GL_TRUE);" GL ERROR#1282(INVALID_OPERATION)を取得しました。

OpenGL 2.1 Referenceを参考にして、glTexEnvの下で、glBexinの実行とglEndの対応する実行の間にglTexEnvが実行されると、GL_INVALID_OPERATIONが生成されると言われています。 しかし、私は頂点配列を使用していますので、これは、私のような状況ではありません。私は、OpenGL上の緑の手だので

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(); 
} 

は、ここに私のコードの一部です。あなたは私のコード上の他のアドバイスがある場合は、plzは私に言うことを躊躇しないでください。:-)

答えて

1

あなたのOpenGLデバイスが全くPOINT_SPRITEをサポートしていないようですね。

GL 2.0仕様では、コア機能として、ポイントスプライトを統合しました。お使いのデバイスはどのGLバージョンをサポートしていますか?

+1

良い質問。 'glGetString(GL_VERSION)'の結果を投稿してください。 – Kos

+0

私のGL_VERSIONは3.3.0です。 – user519835

+0

これは数字だけです。 glGetString(GL_VERSION)には、より詳細な情報(具体的にはあなたのコンテキストタイプに関する情報)が含まれているはずです。ポイント機能のサブセットは廃止されると、それはあなたが3.3互換性のプロファイルまたはコアプロファイルコンテキストを持っているかどうかを、ここでは非常に関連するのです。 – Kos

1

glTexEnv reference pageを読み取り、それは言う:glTexEnvはglBeginの実行とglEndの対応する実行の間に実行された場合

GL_INVALID_OPERATIONが生成されます。

また、これは言う:

GLのバージョンが2.0以上であればGL_POINT_SPRITEとGL_COORD_REPLACEのみ使用可能です。

あなたは必ずあなたのカードです、またはドライバーは、OpenGL 2.0をサポートしていますか?

+0

私のGL_VERSIONは3.3.0です。 – user519835

関連する問題