Рендеринг текстур и VBO [OpenGL / SDL / C ++] - PullRequest
2 голосов
/ 09 декабря 2011

Итак, я немного поработал над небольшим игровым проектом и наткнулся на препятствие, которое меня беспокоят бесконечно. Я загружаю файл obj, который затем визуализируется после помещения в VBO. Эта часть работает нормально, никаких проблем. Тем не менее, я пытался заставить его визуализировать сопровождающую текстуру с помощью прилагаемого UV, но безуспешно. В настоящее время я просто получаю матовую зеленую окраску на моей модели. Изучив его в GDE, я увидел, что текстура загружается нормально и занимает модуль GL_TEXTURE0, так что это не проблема. Я верю, что это может быть моим обязательным, но я понятия не имею, почему это не получится ...

void Model_Man::render_models()
{
    for(int x=0; x<models.size(); x++)
    {
        if(models.at(x).visible==true)
        {
            glBindBuffer(GL_ARRAY_BUFFER,models.at(x).t_buff);
            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,models.at(x).i_buff);

            glEnableClientState(GL_VERTEX_ARRAY);
            glVertexPointer(3, GL_FLOAT,0,0);

            glClientActiveTexture(GL_TEXTURE0);

            glTexCoordPointer(2,GL_FLOAT,0,&models.at(x).uvs[0]);
            glEnableClientState(GL_TEXTURE_COORD_ARRAY);

            glActiveTexture(GL_TEXTURE0);
            int tex_loc = glGetUniformLocation(models.at(x).shaderid,"color_texture");
            glUniform1i(tex_loc,GL_TEXTURE0);
            glEnable(GL_TEXTURE_2D);
            glBindTexture(GL_TEXTURE_2D, models.at(x).mats.at(0).texid);

            c_render.use_program(models.at(x).shaderid);
            glDrawElements(GL_TRIANGLES,models.at(x).f_index.size()*3,GL_UNSIGNED_INT,0);
            c_render.use_program();
            glBindBuffer(GL_ARRAY_BUFFER, 0);
            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

            glDisableClientState(GL_VERTEX_ARRAY);
            glDisableClientState(GL_TEXTURE_COORD_ARRAY);
            glDisable(GL_TEXTURE_2D);
        }
    }
}

И мои файлы шейдеров ...

Shader.frag

uniform sampler2D color_texture;
void main() {
    // Set the output color of our current pixel
    gl_FragColor = texture2D(color_texture, gl_TexCoord[0].st);
}

Shader.vert

void main() {           
    gl_TexCoord[0] = gl_MultiTexCoord0;

    // Set the position of the current vertex 
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

И да, я знаю, что в настоящее время я ужасно неэффективен с моим циклом рендеринга: P, но я уже планирую рефакторинг, я просто пытаюсь заставить эту единственную модель правильно рисовать со всем, к чему я стремлюсь делать. Я понятия не имею, почему он не будет рендериться с правильно примененной текстурой - если только это не потому, что мне нужно чередовать свои массивы, но я все еще снабжаю его ультрафиолетовыми данными, поэтому я не понимаю, почему это не удается.

Ответы [ 2 ]

5 голосов
/ 09 декабря 2011

Вызов, который устанавливает униформу сэмплера, должен устанавливать не GL_TEXTUE0, а фактически 0.

Действительно:

glUniform1i(location, 0)

Для настройки униформы сэмплера выполните:

glUseProgram(progId);
// ...
glActiveTexture(GL_TEXTURE0 + texUnit);
glBindTexture(texId);
glUniform1i(texUnit);

Основная концепция заключается в том, что универсальная переменная является состоянием программы шейдера (она поддерживается до тех пор, пока вы не перепрограммируете программу или не сбросите унифицированное значение).Без привязки программы glUniform1i завершится сбоем, поскольку не существует шейдерной программы, в которой он может установить единообразное значение!


В качестве общего совета, вызывайте glGetError после каждого вызова OpenGL для обнаруженияэти условия.Большинство из этих вызовов могут быть удалены препроцессором в версии выпуска.

1 голос
/ 11 декабря 2012

Что ж, выяснилось, что большая проблема заключалась в том, что, когда я связывал текстуру, я на самом деле не настраивал ее так, чтобы ее понимали как используемую.Установка glClientActiveTexture (GL_TEXTURE0 + texUnit);в сочетании с glActiveTexture ();в конечном итоге окончательное решение.

...