2015-01-31 3 views
0

Итак, я написал вспомогательную функцию, которая просто загружает диск png-файла и загружает его в шейдер OpenGL.Функция загрузки текстур не работает правильно

Все это работает нормально и хорошо, пока я не попытаюсь загрузить несколько текстур. Проблема, с которой я сталкиваюсь, заключается в том, что она, кажется, каждый раз переписывает все предыдущие текстуры. Я понятия не имею, почему это происходит. Если код я обеспечиваю не хватает, полный источник размещена here

Вот функция LoadTexture (находится в Helper.cpp)

GLuint loadTexture(const GLchar* filepath, GLuint& width, GLuint& height) 
{ 
    // image vector. 
    vector<GLubyte> img; 

    // decodes the image to img 
    decode(img, filepath, width, height); 

    // if the image is empty return 
    if (img.size() == 0) 
    { 
     std::cout << "Bad Image" << std::endl; 
     system("pause"); 
     return 0; 
    } 
    // return value 
    GLuint ret; 

    // gen textures 
    glGenTextures(1, &ret); 

    // bind the ret to GL_TEXTURE_2D so everyting using GL_TEXTURE_2D referrs to ret 
    glBindTexture(GL_TEXTURE_2D, ret); 

    // set parameters. Current filtering techunique is GL_LINEAR http://www.arcsynthesis.org/gltut/Texturing/Tut15%20Magnification.html 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    // copy the data to the texture associated with ret. 
    // format is RGBA internally and externally, and the size is unsigned char, which is unsigned byte 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &img[0]); 

    return ret; 

} 

Способ декодирования сохраняет изображение в фотошопе и магазины ширина и высота по ширине и высоте соответственно.

Если есть что-то, что я пропущу, скажите, пожалуйста.

Спасибо за любую помощь, которую я могу получить!

+0

Почему бы не использовать динамическое распределение памяти для этого случая? –

+0

Никогда не делал этого раньше. Как я могу это сделать? –

+1

Сначала вы выделяете память для своей переменной gluint, а затем, когда закончите с памятью, которую вы ее удаляете. –

ответ

2

Когда что-то не работает с OpenGL, всегда смотрите в код чертежа. В функции Draw (Я ненавижу Dropbox, кстати, сначала нужно загрузить это дерьмо, так что я могу его посмотреть) есть это:

 GLuint uniID = glGetUniformLocation(program, "tex"); 

     glActiveTexture(GL_TEXTURE0); 
     glUniform1i(textures[idx], 0); 

Это ваша проблема прямо там. textures[idx] содержит идентификаторы текстуры. Но идентификатор текстуры вообще не входит в форму шейдера. Первым параметром glUniform ... является так называемый «индекс местоположения» шейдерной переменной. Прямо над равномерным расположением переменной шейдера под названием tex. Это - это то, что входит в единый звонок. Значение - это номер активной текстуры . единица.

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

Используйте этот код:

glUseProgram(program) 
GLuint uniID = glGetUniformLocation(program, "tex"); 
for(…) { 
    /* ... */ 
    int const unit = 0; // just for illustration 
    glUniform1i(uniID, unit); 
    glActiveTexture(GL_TEXTURE0 + unit); 
    glBindTexture(GL_TEXTURE_2D, textures[idx]); 
    /* draw stuff ...*/ 
} 

КСТАТИ: текстуры не загружаются в шейдерах.

+0

Спасибо, проверит когда я включу на моем компьютере. Делает достаточно смысла, хотя :) –

+0

Эй, какой провайдер должен использовать для предоставления всего моего исходного кода, когда я не хочу копировать его? –

+1

@ RussellGreene: Ну, на StackOverflow идиоматический, рекомендуется использовать для копирования и вставки исходного кода. Если вы действительно хотите установить ссылку на него, используйте GitHub; заставляет людей легко отвечать на запросы, так как репозиторий GitHub быстро клонируется, чтобы вы могли компилировать и тестировать на своем локальном компьютере. – datenwolf

Смежные вопросы