Текстуры OpenGL из SDLSurface слишком темные

У меня такая же проблема, как эта OpenGl слишком темный но ответ не работает для меня. Я пытаюсь отобразить изображение благодаря поверхности, преобразованной в текстуру, и результат слишком темный:

Оригинал:

введите описание изображения здесь

после openGL

введите описание изображения здесь

Слева оригинал, справа OpenGL img.

Вот мой код:

void TexturedRect::draw(int scroll){

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glBindTexture(GL_TEXTURE_2D, _texture);

glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);  //Begining the cube's drawing

int x = this->getX();
int y = this->getY();
int w = this->getWidth();
int h = this->getHeight();
int z = this->getZ();

/*
(0,0) ------ (1,0)
|            |
|            |
(0,1) ------ (1,1)
*/
glTexCoord3i(0, 0, 1);glVertex3i(x + scroll,         y,      z);
glTexCoord3i(_tv, 0, 1);glVertex3i(x + w * _tv + scroll,     y,      z);
glTexCoord3i(_tv, _tu, 1);glVertex3i(x + w * _tv + scroll,     y + h * _tu,  z);
glTexCoord3i(0, _tu, 1);glVertex3i(x + scroll,         y + h * _tu,  z);

glEnd();
glDisable(GL_TEXTURE_2D);
}

void TexturedRect::createTextureFromSurface()
{
SDL_Surface * surface = IMG_Load(filename.toStdString().c_str());
// get the number of channels in the SDL surface
GLint  nbOfColors = surface->format->BytesPerPixel;
GLenum textureFormat = 0;

switch (nbOfColors) {
case 1:
textureFormat = GL_ALPHA;
break;
case 3:     // no alpha channel
if (surface->format->Rmask == 0x000000ff)
textureFormat = GL_RGB;
else
textureFormat = GL_BGR;
break;
case 4:     // contains an alpha channel
if (surface->format->Rmask == 0x000000ff)
textureFormat = GL_RGBA;
else
textureFormat = GL_BGRA;
break;
default:
qDebug() << "Warning: the image is not truecolor...";
break;
}

glEnable( GL_TEXTURE_2D );
// Have OpenGL generate a texture object handle for us
glGenTextures( 1, &_texture );

// Bind the texture object
glBindTexture( GL_TEXTURE_2D, _texture );// Edit the texture object's image data using the information SDL_Surface gives us
glTexImage2D( GL_TEXTURE_2D, 0, nbOfColors, surface->w, surface->h, 0,
textureFormat, GL_UNSIGNED_BYTE, surface->pixels );

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

}

7

Решение

Возможно, в вашем коде установлено какое-то состояние, которое все еще включено, если вы хотите отключить его для рисования этого квадрата.

Попробуйте добавить следующее после glBindTexture (GL_TEXTURE_2D, _texture); в вашем коде рисования (важно, чтобы это было сделано в методе рисования, а не в методе createTextureFromSurface):

glDisable(GL_BLEND);
glDisable(GL_LIGHTING);
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE )
glColor3f(1.0f, 1.0f, 1.0f);

Если это работает, вы можете закомментировать их по одному, чтобы выяснить, в каком состоянии возникла ваша проблема. Любое состояние, которое вы отключите для рисования этого квадроцикла, нужно будет повторно включить при рисовании объекта, который в нем нуждался.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]