Войти
OpenGL communityФорумВопросы по программированию

не работает мультитекстурирование.

#0
22:44, 3 окт. 2015

Кажется подключаю все правильно,но вторая текстура почему-то игнорируеться.  Видюшка- 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, то  текстура нормалей тоже входит в это количество ?


#1
1:45, 4 окт. 2015

darcest
Код похож на правду, кажется проблема в другом месте.

> Дополнительный вопрос,я правильно понимаю,что у слабых видеокарт  предел
> мультитекстур -2 текстуры,и если делать Normal Maping, то  текстура нормалей
> тоже входит в это количество ?

Ты всегда можешь узнать сколько текстурных юнитов тебе доступно через glGetIntegerv с параметрами GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS и GL_MAX_TEXTURE_IMAGE_UNITS, и там будет точно больше 2х, и да, все текстуры, которые используются в вершинном и фрагментнмо шейдерах, должны занимать текстурные юниты, не важно что это за текстуры.

#2
2:32, 4 окт. 2015

Небольшое дополнение,  модель всегда заполняется текстурой  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"
покрыли  модель нулевой текстурой.
Может мультитекстурирование нужно включить какой-то дополнительной командой,или что-то такое,у кого-то есть идеи?
#3
10:13, 4 окт. 2015

В этой теме(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();
}
#4
10:22, 4 окт. 2015

>В общем подскажите что использовать вместо него

http://www.glfw.org/documentation.html

#5
12:12, 4 окт. 2015

Не помогло =(
Кстати ,при попытке передать хоть одну текстуру    glUniform1i(texture_send, 0); , вылазит ошибка  openGL с непонятными символами....

При этом

  glGetUniformLocation(Program, "u_Texture"); 
вернуло '1'.

http://www.gamedev.ru/files/images/?id=111232

#6
15:25, 4 окт. 2015

Может у кого-то есть не сложный  готовый шаблон мультитекснурирования, похоже  этот код я  оставлю, но найти нормального  СКАЧИВАЕМОГО примера не могу.  В статейках и уроках в основном то-же что и я делаю.....

#7
10:34, 6 окт. 2015

А где твой код отрисовки то? Вижу загрузку текстур.

у меня текстуры биндятся в слоты перед отрисовкой. Конечно если у тебя один объект на сцене то биндить можно один раз по идее.

    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());
#8
10:59, 6 окт. 2015

Сдампь ошибку в файл и посмотри в разных кодировках

OpenGL communityФорумВопросы по программированию

Тема в архиве.