0
votes

Consider the following:

virtual void Draw()
{
    _texture->Bind(0);

    _shader->Begin();
    _shader->SetUniform("WVPMatrix", _mvp);
    _shader->SetUniform("InColor", _color);
    _shader->SetUniformImm("InTexture", 0);
    _vbo.GetDeclaration().Activate();
    _vbo.Render(GL_QUADS, _ibo, 4);
    _shader->End();
}

void Texture2D::Bind(int index)
{
    if (index != -1)
    {
        glActiveTexture(GL_TEXTURE0 + index);
    }

    glBindTexture(GL_TEXTURE_2D, _textureID);
}

Where the calls for _shader->Begin(), _shader->SetUniform, _shader->SetUniformImm, _vbo.GetDeclaration().Activate and _vbo.Render works as if I set the fragment shader to render a static color(or even a color through the uniforms) it renders fine.

Now I'm trying to render a texture2d(it was loaded fine, I tested with immediate mode) and I get a black screen, why?

Vertex:

#version 330

layout(location = 0) in vec3 VertexPosition;
layout(location = 1) in vec2 VertexTexCoord;

uniform mat4 WVPMatrix;

out vec2 TexCoord0;

void main()
{
    TexCoord0 = VertexTexCoord;

    gl_Position = WVPMatrix * vec4(VertexPosition, 1);
}

Fragment:

#version 330

in vec2 TexCoord0;

uniform sampler2D InTexture;
uniform vec4 InColor;

out vec4 OutFragColor;

void main()
{
    OutFragColor = texture(InTexture, TexCoord0) * InColor;
}

PS: InColor is white, so it doesn't mess with texture color and TexCoord0 is valid as I already set R and B on OutFragColor as TexCoord0's S and T to debug it values.

1
Remembered to set minification filter for your texture? Do you do error checking for shader compiling and linking?Tim
God! I rewrote the texture loading in a more "beautiful" way and forgot to set them -_- Thank yougreenboxal
Careful, I almost deleted my comment after you said it works fine in immediate mode >_> Glad it helped.Tim

1 Answers

5
votes

(Posting answer for bookkeeping)

Question asker forgot to set minification filter for his texture, and as such the texture was not complete and does not display.

Need to call glTexParameteri(GL_TEXTURE_2D, GL_MIN_FILTER, GL_LINEAR); (or GL_NEAREST)