2010-11-25 2 views
4

Problem:glTexEnv kehrt inexplainable INVALID_OPERATION ERROR

Gleich nach dem "glTexEnvi (GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);" Ich habe den GL ERROR # 1282 (INVALID_OPERATION).

Dann, wenn ich die OpenGL 2.1 Referenz konsultierte, heißt es unter glTexEnv, dass: GL_INVALID_OPERATION generiert wird, wenn glTexEnv zwischen der Ausführung von glBegin und der entsprechenden Ausführung von glEnd ausgeführt wird. Aber das ist nicht mein Umstand, da ich Vertex-Array verwende.

Hier ist ein Teil meines Code:

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

Da ich eine grüne Hand auf OpenGL bin. Wenn Sie andere Ratschläge zu meinem Code haben, zögern Sie nicht, mir zu sagen. :-)

Antwort

1

Es klingt wie Ihr OpenGL-Gerät überhaupt POINT_SPRITE nicht unterstützt.

Die GL 2.0-Spezifikation hat Point Sprite als Kernmerkmal integriert. Welche GL-Version unterstützt Ihr Gerät?

+1

Gute Frage. Bitte posten Sie das Ergebnis von 'glGetString (GL_VERSION)'. – Kos

+0

Meine GL_VERSION ist 3.3.0. – user519835

+0

Das sind nur die Ziffern; glGetString (GL_VERSION) sollte weitere Informationen enthalten (speziell zu Ihrem Kontexttyp). Da die Teilmenge der Punkte-Features veraltet ist, ist es hier sehr relevant, ob Sie ein 3.3-Kompatibilitätsprofil oder einen Kernprofil-Kontext haben. – Kos

1

die glTexEnv reference page Lesen, heißt es:

GL_INVALID_OPERATION wird generiert, wenn glTexEnv zwischen einem glBegin und der entsprechenden Ausführung von glEnd ausgeführt wird.

Er sagt auch dies:

GL_POINT_SPRITE und GL_COORD_REPLACE nur verfügbar sind, wenn die GL-Version 2.0 oder höher ist.

Sind Sie sicher, dass Ihre Karte oder Treiber OpenGL 2.0 unterstützt?

+0

Meine GL_VERSION ist 3.3.0. – user519835