2015-10-13 4 views
1

Я пытаюсь текстурировать землю травой. Будет ли кто-то проглядеть мои шаги, чтобы получить 2D-текстуру, которая появится в 3D-пространстве? Мне не повезло с онлайн-учебниками.Шелдер текстуры OpenGL не отображается на экране

Вот мои шаги:

1) вызов инициализации класса спрайта установить координаты вершин и данные уф

void Sprite::init(vec3 bottomleft, vec3 topLeft, vec3 topRight, vec3 bottomRight, std::string texturePath) 
{ 

    _texture = ImageLoader::loadPNG(texturePath); 

    _points = { bottomleft.x, bottomleft.y, bottomleft.z, topLeft.x, topLeft.y, topLeft.z, topRight.x, topRight.y, topRight.z, topRight.x, topRight.y, topRight.z, bottomRight.x, bottomRight.y, bottomRight.z, bottomleft.x, bottomleft.y, bottomleft.z }; 
    _uv = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f }; 

} 

я использую единообразный пробник и активизирую текстуру

//draw ground texture 
    glUniform1i(samplerLocation, 0); 
    glActiveTexture(GL_TEXTURE0); 
    _grassTexture.draw(); 

Функция draw реализуется следующим образом, которая помещает данные в буфер и рисует треугольник:

void Sprite::draw() 
    { 
     if (_vboID == 0) 
     { 
      glGenBuffers(1, &_vboID); 
     } 

     glBindTexture(GL_TEXTURE_2D, _texture.id); 

     glBindBuffer(GL_ARRAY_BUFFER, _vboID); 
     glBufferData(GL_ARRAY_BUFFER, _points.size() * sizeof(float) + _uv.size() * sizeof(float), nullptr, GL_STATIC_DRAW); 
     glBufferSubData(GL_ARRAY_BUFFER, 0, _points.size() * sizeof(float), &_points.front()); 
     glBufferSubData(GL_ARRAY_BUFFER, _points.size() * sizeof(float), _uv.size() * sizeof(float), &_uv.front()); 

     glEnableVertexAttribArray(0); 
     glEnableVertexAttribArray(1); 

     //position attribute pointer 
     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, &_points.front()); 

     //uv attribute pointer 
     glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, &_uv.front()); 

     glDrawArrays(GL_TRIANGLES, 0, 6); 

     glDisableVertexAttribArray(0); 
     glDisableVertexAttribArray(1); 

     glBindBuffer(GL_ARRAY_BUFFER, 0); 
    } 

вершинный шейдер:

#version 400 

in vec4 vertexPosition; 
in vec2 vertexUV; 

out vec4 fragmentColor; 
out vec2 fragmentUV; 

uniform mat4 MVP; 
uniform vec4 COLOR; 

void main() 
{ 
    gl_Position = MVP * vertexPosition; 
    fragmentColor = COLOR; 
    fragmentUV = vec2(vertexUV.x, 1.0 - vertexUV.y); 
} 

и пиксельный шейдер:

#version 400 

in vec4 fragmentColor; 
in vec2 fragmentUV; 

out vec4 fragColor; 

uniform sampler2D SAMPLER; 

void main() 
{ 
    vec4 textureColor = texture(SAMPLER, fragmentUV); 
    fragColor = textureColor * fragmentColor; 
} 

На данный момент, ничего не отображается на экране. Я действительно знаю, что textureColor в шейдере фрагмента является зеленым, поэтому кажется, что равномерное задается правильно. Мое лучшее предположение заключается в том, что я либо пропускаю этап инициализации текстуры, либо неправильно заполняю буфер.

ответ

1

Я думаю, что есть проблема с параметром указателя в ваших вызовах glVertexAttribPointer. Вы передаете адрес своих _points и _uv массивов, но вы должны передавать смещение относительно базы вашего vbo.

Try:

//position attribute pointer 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr); 

    //uv attribute pointer 
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)(_points.size() * sizeof(float))); 
+0

Ах, вот оно. Спасибо за вашу помощь! – Luke

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