Toyo
Toyo

Reputation: 751

OpenGL - Texture not displayed on whole defined area

I am trying the texture mapping feature of OpenGL and the texture is displayed on the screen but not on the area that I set. The area is a quad with 100.0 length and the texture is displayed only on the bottom.
When using GL_RGB in glTexImage2D, only one third of the quad is filled and when I change it to GL_RGBA, it becomes one quarter of the quad.

Main parameters declaration:

BYTE* m_pBMPBuffer;
int m_iWidth;
int m_iHeight;
GLuint m_uiTexture;

Code for setting up the texture mapping:

void CTextureMappingView::InitializeTexture()
{
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glGenTextures(1, &m_uiTexture);
    glBindTexture(GL_TEXTURE_2D, m_uiTexture);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_iWidth, m_iHeight, 0, GL_BGR, GL_UNSIGNED_BYTE, m_pBMPBuffer);
}

Buffer Initialization:

m_iWidth = 64;
m_iHeight = 64;
m_pBMPBuffer = new BYTE[m_iWidth * m_iHeight * 3];

for (int i = 0 ; i < m_iWidth * m_iHeight ; i += 3)
{
    m_pBMPBuffer[i] = 255;
    m_pBMPBuffer[i + 1] = 0;
    m_pBMPBuffer[i + 2] = 0;
}

Rendering:

void CTextureMappingView::RenderScene()
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glRotatef(XAngle, 1.0f, 0.0f, 0.0f);
    glRotatef(YAngle, 0.0f, 1.0f, 0.0f);

    glPushMatrix();
        glEnable(GL_TEXTURE_2D);
        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
        glBindTexture(GL_TEXTURE_2D, m_uiTexture);

        glBegin(GL_POLYGON);
            glTexCoord2d(0.0, 0.0);
            glVertex3d(0.0, 0.0, 0.0);

            glTexCoord2d(0.0, 1.0);
            glVertex3d(0.0, 100.0, 0.0);

            glTexCoord2d(1.0, 1.0);
            glVertex3d(100.0, 100.0, 0.0);

            glTexCoord2d(1.0, 0.0);
            glVertex3d(100.0, 0.0, 0.0);
        glEnd();

        glDisable(GL_TEXTURE_2D);
    glPopMatrix();
}

Current result:

OpenGL - Simple Texture Mapping Result / Only one third of area filled

Upvotes: 0

Views: 65

Answers (1)

Sami Kuhmonen
Sami Kuhmonen

Reputation: 31143

You only initialize a third of your texture:

for (int i = 0 ; i < m_iWidth * m_iHeight ; i += 3)

You should go up to m_iWidth * m_iHeight * 3 since that's what you allocated.

Upvotes: 1

Related Questions