Нормальное отображение в непосредственном режиме OpenGL - PullRequest
0 голосов
/ 25 марта 2020

Я пытался загрузить различные типы текстур в мою модель, пока я только что загрузил диффузную текстуру, которая работает отлично. Тем не менее, я застрял при использовании карты нормалей, карта считывается из файла правильно, однако я не могу заставить ее работать как карта нормалей, а не как диффузная карта. (Изображение для пояснения).

Normal map being used as a diffuse map

Ниже приведен код загрузки текстуры: (BMP - это структура для чтения растровых файлов)

BMP tempTexturedData(path);

mWidth = tempTexturedData.bmp_info_header.width;
mHeight = tempTexturedData.bmp_info_header.height;

tempTexturedData.ConvertToRGB();
std::cout << path << " is loaded\n";

glGenTextures(1, &mID);
glBindTexture(GL_TEXTURE_2D, mID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, mWidth, mHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, tempTexturedData.rgbData.data());

return true;

Вот код рендеринга:

glPushMatrix();

        glTranslatef(mPosition.x, mPosition.y, mPosition.z);

        glScalef(mScale.x, mScale.y, mScale.z);

        glRotatef(mRotation.x, 1.0f, 0.0f, 0.0f);
        glRotatef(mRotation.y, 0.0f, 1.0f, 0.0f);
        glRotatef(mRotation.z, 0.0f, 0.0f, 1.0f);

        if (mTexture != nullptr) {
            glBindTexture(GL_TEXTURE_2D, mTexture->GetID());
            glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
            glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
        }

        glEnableClientState(GL_TEXTURE_COORD_ARRAY);

        glBegin(GL_TRIANGLES);
        for (int i = 0; i < mesh.indices.size(); i++) {
            glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, &(mesh.meshMaterial.Ka.x));
            glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, &(mesh.meshMaterial.Kd.x));
            glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, &(mesh.meshMaterial.Ks.x));
            glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, mesh.meshMaterial.illum);

            glTexCoord2fv(&mesh.verticies[mesh.indices[i]].textureCoordinate.x);
            glNormal3fv(&mesh.verticies[mesh.indices[i]].normal.x);
            glVertex3fv(&mesh.verticies[mesh.indices[i]].position.x);
        }
        glEnd();

        glDisableClientState(GL_TEXTURE_COORD_ARRAY);

        glPopMatrix();
...