Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





OpenGL ES 1.1 - Renderizar varias texturas

Iniciado por Argail, 11 de Noviembre de 2010, 11:19:13 AM

« anterior - próximo »

Argail

Muy buenas a todos,
supongo que cuando aparezca me tiraré de los pelos, pero nose que puedo estar haciendo mal para que cuando intento pintar varios planos con distintas texturas, me los haga ambos con la misma textura, que resulta que es la última que he cargado. Me huele a que estoy machacando o no haciendo bien algo, pero no caigo en que puede ser...

Ya se que a veces jode el rollo de que te planten el código en plan "buscame el error", pero lo hago más para que tengais una idea de como cargo las cosas, los tipos, y tal, en realidad mi rallada es porque "glBindTexture" no me está haciendo lo que le pido. (Porsupuesto, he comprobado que los IDs de las texturas una vez los creo son distintos)

Os explico un poco (lo sé, los nombres de las variables son feísimos, llevo tanto atascado con esto que los habré cambiado bastantes veces)

En archivo de cabecera:

private:
static const GLfloat backgroundPlane[];
GLuint m_BackgroundTexture;

static const GLfloat ButtonPlane[];
GLuint m_ButtonTexture;
float m_fRotateAngle;

static const GLfloat fadePlane[];
float m_fAlpha;


y en la implementacion que nos acontece:
void MainMenuScreen::initialize()
{
glEnable(GL_TEXTURE_2D);

loadTexture("/Res/Background/background.png", m_BackgroundTexture);
loadTexture("/Res/GUI/logo.png", m_ButtonTexture);
}

void MainMenuScreen::loadTexture(const Osp::Base::String& sPath, GLuint& iTexture)
{
Osp::Media::Image* image = new Osp::Media::Image();
image->Construct();
Osp::Graphics::Bitmap* l_pBitmap = image->DecodeN(sPath,
Osp::Graphics::BITMAP_PIXEL_FORMAT_R8G8B8A8);
delete image;

int iWidth = l_pBitmap->GetWidth();
int iHeight = l_pBitmap->GetHeight();
updateTextureSize(iWidth, iHeight);
l_pBitmap->Scale(Osp::Graphics::Dimension(iWidth, iHeight));
Osp::Graphics::BufferInfo buffer;

l_pBitmap->Lock(buffer);
glGenTextures(1, &iTexture);
glBindTexture(GL_TEXTURE_2D, iTexture);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, l_pBitmap->GetWidth(),
l_pBitmap->GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE,
buffer.pPixels);

l_pBitmap->Unlock();

AppLog("Texture ID (%i) created", iTexture);
}

void MainMenuScreen::updateTextureSize(int& iWidth, int& iHeight)
{
    int i;
bool bSizeToFit = false;

if ((iWidth != 1) && (iWidth & (iWidth - 1))) {
i = 1;
while ((bSizeToFit ? 2 * i : i) < iWidth)
i *= 2;
iWidth = i;
}

if ((iHeight != 1) && (iHeight & (iHeight - 1))) {
i = 1;
while ((bSizeToFit ? 2 * i : i) < iHeight)
i *= 2;
iHeight = i;
}
}

void MainMenuScreen::update()
{
m_fRotateAngle += 5.0f;
if (m_fRotateAngle > 360.0f)
m_fRotateAngle -= 360.0f;

m_fAlpha += 0.01f;
if (m_fAlpha >= 1.0f)
{
m_fAlpha = 0.0f;
//m_pScreenManager->getInstance()->m_eCurrentScreen = ScreenManager::MAINMENU;
}
}

void MainMenuScreen::draw()
{
GLfloat angle = m_fRotateAngle; // change the rotation angle.
GLfloat alpha = m_fAlpha;

static const GLfloat textureCoord[] = { 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
                           1.0f, 0.0f };

glPushMatrix();
glBindTexture(GL_TEXTURE_2D, m_BackgroundTexture);
glEnableClientState( GL_VERTEX_ARRAY);
glEnableClientState( GL_TEXTURE_COORD_ARRAY );
glVertexPointer(3, GL_FLOAT, 0, backgroundPlane);
glTexCoordPointer(2, GL_FLOAT, 0, textureCoord);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState( GL_TEXTURE_COORD_ARRAY );
glPopMatrix();

glPushMatrix();
glRotatef(-angle, 0.0f, 0.0f, 1.0f);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, m_ButtonTexture);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, ButtonPlane);
glTexCoordPointer(2, GL_FLOAT, 0, textureCoord);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_BLEND);
glPopMatrix();

glPushMatrix();
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glEnableClientState( GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, fadePlane);
glColor4f(0.0f, 0.0f, 0.0f, alpha);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_BLEND);
glPopMatrix();
}


¿Alguien sabe que puedo estar haciendo mal para que los planos de background y button me los renderice con la misma textura?

Para los curiosos, el codigo no OpenGL es del SDK de Bada... (maldita la hora...)


tamat

rarisimo porque a simple vista parece que está todo perfecto, la unica explicación es algun problema con el cargador de texturas, mira a ver de poner una textura toda blanca y otra toda negra y ver si el primer pixel es 0 o 255.

no se me ocurre nada mas porque la parte de opengl parece perfecta, prueba de pintar sin blend y una textura al lado de la otra (no solapandose)  y desactivando el depth_test
Por un stratos menos tenso

Argail

Flipando estoy...
pintando sin blend, la textura al lado de la otra y desactivando el depth_test como me dijiste me las pilla bien. ¿Y que hago yo ahora? xDDDD

Argail

Vale, corroborado:
Citar
Warning:

When blending is enabled, sort your draw calls from furthest to nearest, and disable depth testing.

Es decir, si se quiere usar blending, a tomar viento el depth buffer. Lo que yo no me esperaba es el resultado  :-X

tamat

hombre, si sobrepones dos texturas, al tener la misma Z solo te pintará la primera, la segunda la descarta, por eso cuando haces blending tienes que desactivar el depth test (si estas en 2d) o el depth-write (si estas en 3D)
Por un stratos menos tenso

Argail

Vale, tomo nota de todo, muchas gracias por la ayuda!  :D






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.