Zu blöd für gles 2 Texturen
-
Falsches Forum, bitte verschieben...
Hallo, ich versuche grade, mich in gles 2 auf android einzuarbeiten, und komme gerade beim Thema Texturen nicht weiter. Ich bekomme es nicht mal hin, eine einfache 2D Textur darzustellen. Statt der schwarzen Textur bekomme ich nur türkis mit braunem Streifen. Der code dazu:
gl_context::create_context( s ); glViewport( 0 , 0 , gl_context::width() , gl_context::height() ); glClearColor( 0.0f , 0.0f , 0.0f , 0.0f ); GLuint shader_program = 0; GLuint position = 0; GLuint texture_coord = 1; GLuint sampler = 0; const char* vertex_shader_source = "attribute vec4 position; \n" "attribute vec2 a_texture_coord; \n" "varying vec2 v_texture_coord; \n" "void main() \n" "{ \n" " gl_Position = position; \n" " v_texture_coord = a_texture_coord; \n" "} \n"; const char* fragment_shader_source = "precision mediump float; \n" "uniform sampler2D sampler; \n" "varying vec2 v_texture_coord; \n" "void main() \n" "{ \n" " gl_FragColor = texture2D( sampler , v_texture_coord );" //" gl_FragColor = vec4( 1.0 , 0.0 , 0.0 , 1.0 );" "} \n"; GLuint vertex_shader = glCreateShader( GL_VERTEX_SHADER ); glShaderSource( vertex_shader , 1 , &vertex_shader_source , 0 ); glCompileShader( vertex_shader ); GLuint fragment_shader = glCreateShader( GL_FRAGMENT_SHADER ); glShaderSource( fragment_shader , 1 , &fragment_shader_source , 0 ); glCompileShader( fragment_shader ); shader_program = glCreateProgram(); glAttachShader( shader_program , vertex_shader ); glAttachShader( shader_program , fragment_shader ); glBindAttribLocation( shader_program , position , "position" ); glBindAttribLocation( shader_program , texture_coord , "a_texture_coord" ); glLinkProgram( shader_program ); glUseProgram( shader_program ); sampler = glGetUniformLocation( shader_program , "sampler" ); glActiveTexture( GL_TEXTURE0 ); glBindTexture( GL_TEXTURE_2D , 0 ) ; std::vector< GLubyte > buffer( 64 * 64 * 3 , 0 ); glTexImage2D( GL_TEXTURE_2D , 0 , GL_RGB , 64 , 64 , 0 , GL_RGB , GL_UNSIGNED_BYTE , buffer.data() ); glUniform1i( sampler , 0 ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); const GLfloat vertex_positions[] = { -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, }; static const GLfloat texture_coords[] = { 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, }; glVertexAttribPointer( position , 2 , GL_FLOAT , GL_FALSE , 0 , vertex_positions ); glEnableVertexAttribArray( position ); glVertexAttribPointer( texture_coord , 2 , GL_FLOAT , GL_FALSE , 0 , texture_coords ); glEnableVertexAttribArray( texture_coord ); glDrawArrays( GL_TRIANGLE_STRIP , 0 , 4 ); glDisableVertexAttribArray( position ); glDisableVertexAttribArray( texture_coord ); gl_context::swap_buffers();
Weise ich gl_FragColor einfach nur rot zu (kommentierte Zeile), erhalte ich wie erwartet einen roten Bildschirm, es scheint also ein gles 2 context da zu sein.
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum Spiele-/Grafikprogrammierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Ich bin zwar kein OpenGL-Experte, aber mir faellt auf, dass du die Aufrufe von glEnableVertexAttribArray und glVertexAttribPointer vertauschst hast.
-
Kellerautomat schrieb:
Ich bin zwar kein OpenGL-Experte, aber mir faellt auf, dass du die Aufrufe von glEnableVertexAttribArray und glVertexAttribPointer vertauschst hast.
Das hat leider noch nichts verändert.
-
Falls jemand mit dem selben Problem auf diesen thread stößt: Das Problem war, dass ich keinen texture filter gesetzt hatte:
glTexParameteri( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_NEAREST ); glTexParameteri( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_NEAREST );