Кажется подключаю все правильно,но вторая текстура почему-то игнорируеться. Видюшка- geforce 720, так что мультитекст. точно поддерживается.
Сам шейдер.
const char* fsSource = "uniform vec4 color;\n" "uniform sampler2D u_Texture; " "uniform sampler2D u_Texture2; " "varying vec4 v_Color; " "void main() {\n" "gl_FragColor = texture2D(u_Texture, vec2(v_Color.x,v_Color.y))*0.5+texture2D(u_Texture2, vec2(v_Color.x,v_Color.y))*0.5;\n" "}\n";
И подключение текстур (использую FreeImage).
{ glActiveTexture(GL_TEXTURE0); FIBITMAP* bitmap = FreeImage_Load( FreeImage_GetFileType( "my_direct/p1.png", 0), "my_direct/p1.png"); glGenTextures( 1, &texture); glBindTexture( GL_TEXTURE_2D, texture); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); FIBITMAP *pImage = FreeImage_ConvertTo32Bits( bitmap); int nWidth = FreeImage_GetWidth( pImage); int nHeight = FreeImage_GetHeight( pImage); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, nWidth, nHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, ( void*)FreeImage_GetBits( pImage)); texture_send =glGetUniformLocation( Program, "u_Texture"); glUniform1i( texture_send, 0); FreeImage_Unload( bitmap); FreeImage_Unload( pImage); } /////////////////////////////////////////////// { glActiveTexture( GL_TEXTURE1); FIBITMAP* bitmap = FreeImage_Load( FreeImage_GetFileType( "my_direct/p2.png", 0), "my_direct/p2.png"); glGenTextures( 1, &texture2); glBindTexture( GL_TEXTURE_2D, texture2); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); FIBITMAP *pImage = FreeImage_ConvertTo32Bits( bitmap); int nWidth = FreeImage_GetWidth( pImage); int nHeight = FreeImage_GetHeight( pImage); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, nWidth, nHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, ( void*)FreeImage_GetBits( pImage)); texture_send2 =glGetUniformLocation( Program, "u_Texture2"); glUniform1i( texture_send2, 1); FreeImage_Unload( bitmap); FreeImage_Unload( pImage); }
Дополнительный вопрос,я правильно понимаю,что у слабых видеокарт предел мультитекстур -2 текстуры,и если делать Normal Maping, то текстура нормалей тоже входит в это количество ?
darcest
Код похож на правду, кажется проблема в другом месте.
> Дополнительный вопрос,я правильно понимаю,что у слабых видеокарт предел
> мультитекстур -2 текстуры,и если делать Normal Maping, то текстура нормалей
> тоже входит в это количество ?
Ты всегда можешь узнать сколько текстурных юнитов тебе доступно через glGetIntegerv с параметрами GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS и GL_MAX_TEXTURE_IMAGE_UNITS, и там будет точно больше 2х, и да, все текстуры, которые используются в вершинном и фрагментнмо шейдерах, должны занимать текстурные юниты, не важно что это за текстуры.
Небольшое дополнение, модель всегда заполняется текстурой GL_TEXTURE0,при єтом совершенно не важно какую из sampler2D я укажу в шейдере.
оба варианта :
"gl_FragColor =texture2D(u_Texture, vec2(v_Color.x,v_Color.y));\n"
"gl_FragColor =texture2D(u_Texture2, vec2(v_Color.x,v_Color.y));\n"
В этой теме(http://www.gamedev.ru/code/forum/?id=143731) в конце вычитал,что виной всему freeGLUT, чесно говоря,очень странно ,веть он занимается только настройкой окошка. В общем подскажите что использовать вместо него, и если можно подскажите ,как его заменить,не переписывая весь код с нуля. Вот все места где иcпользуется "GL/glut.h" , отмечено "//!!!!".
void render() { glClear( GL_COLOR_BUFFER_BIT); glUseProgram( Program); static float red[4] = {1.0f, 0.0f, 0.0f, 1.0f}; glUniform4fv( Unif_color, 1, red); glBindBuffer( GL_ARRAY_BUFFER, VBO1); glEnableVertexAttribArray( Attrib_vertex); glEnableVertexAttribArray( Attrib_vertex_2); glVertexAttribPointer( Attrib_vertex, 3, GL_FLOAT, GL_FALSE, 4*6, 0); glVertexAttribPointer( Attrib_vertex_2, 3, GL_FLOAT, GL_FALSE, 4*6, BUFFER_OFFSET( 4*3)); glBindBuffer( GL_ARRAY_BUFFER, 0); glDrawArrays( GL_TRIANGLES, 0, sizeof ( vertex)); glDisableVertexAttribArray( Attrib_vertex); glDisableVertexAttribArray( Attrib_vertex_2); glUseProgram( 0); checkOpenGLerror( ); glutSwapBuffers( ); ///// !!!! } int main( int argc, char **argv ) { glutInit( &argc, argv); ///// !!!! glutInitDisplayMode( GLUT_RGBA | GLUT_ALPHA | GLUT_DOUBLE); ///// !!!! glutInitWindowSize( 800, 600); ///// !!!! glutCreateWindow( "Simple shaders"); ///// !!!! // ! Обязательно перед инициализации шейдеров GLenum glew_status = glewInit( ); if( GLEW_OK != glew_status) { // ! GLEW не проинициализировалась std::cout << "Error: " << glewGetErrorString( glew_status) << "\n"; return 1; } // ! Проверяем доступность OpenGL 2.0 if( !GLEW_VERSION_3_0) { // ! OpenGl 3.0 оказалась не доступна std::cout << "No support for OpenGL 3.0 found\n"; return 1; } // ! Инициализация initGL( ); initVBO( ); initShader( ); glutReshapeFunc( resizeWindow); ///// !!!! glutDisplayFunc( render); ///// !!!! glutMainLoop( ); ///// !!!! // ! Освобождение ресурсов freeShader( ); freeVBO( ); }
>В общем подскажите что использовать вместо него
Не помогло =(
Кстати ,при попытке передать хоть одну текстуру glUniform1i(texture_send, 0); , вылазит ошибка openGL с непонятными символами....
При этом
glGetUniformLocation(Program, "u_Texture");
Может у кого-то есть не сложный готовый шаблон мультитекснурирования, похоже этот код я оставлю, но найти нормального СКАЧИВАЕМОГО примера не могу. В статейках и уроках в основном то-же что и я делаю.....
А где твой код отрисовки то? Вижу загрузку текстур.
у меня текстуры биндятся в слоты перед отрисовкой. Конечно если у тебя один объект на сцене то биндить можно один раз по идее.
glEnable(GL_TEXTURE_2D); Shaders::terrain->Bind( ); glActiveTexture( GL_TEXTURE0); glBindTexture( GL_TEXTURE_2D, layer1.tx->GetId( )); glActiveTexture( GL_TEXTURE1); glBindTexture( GL_TEXTURE_2D, layer2.tx->GetId( )); glActiveTexture( GL_TEXTURE2); glBindTexture( GL_TEXTURE_2D, layer3.tx->GetId( )); glActiveTexture( GL_TEXTURE3); glBindTexture( GL_TEXTURE_2D, layer4.tx->GetId( )); glActiveTexture( GL_TEXTURE4); glBindTexture( GL_TEXTURE_2D, blendMap->GetId( ));
Сдампь ошибку в файл и посмотри в разных кодировках
Тема в архиве.