Jump to content

  • Log In with Google      Sign In   
  • Create Account

FREE SOFTWARE GIVEAWAY

We have 4 x Pro Licences (valued at $59 each) for 2d modular animation software Spriter to give away in this Thursday's GDNet Direct email newsletter.


Read more in this forum topic or make sure you're signed up (from the right-hand sidebar on the homepage) and read Thursday's newsletter to get in the running!


SDL/OPENGL - White texture with alpha blend


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
1 reply to this topic

#1 VeryLazyProgrammer   Members   -  Reputation: 102

Like
0Likes
Like

Posted 12 June 2012 - 04:51 PM

This was just a test program to load my 32 bit transparent PNG file as a texture.

I tested the program without GL_BLEND and ALPHABLEND in the source code... The picture appeared with black borders as expected.
Though, when I try to use GL_BLEND my texture came out entirely white.


#include <string>
#include "SDL/SDL.h"
#include "SDL/SDL_opengl.h"
#include "SDL_image.h"
void Opengl_init()
{
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity ();
    glOrtho (0, 200, 200, 0, 0, 1);
    glDisable(GL_DEPTH_TEST);
    glMatrixMode (GL_MODELVIEW);
    glLoadIdentity();
    glClearColor(.3, .3, .3, 0);
    glClear(GL_COLOR_BUFFER_BIT);
}

#if SDL_BYTEORDER == SDL_LIL_ENDIAN
   static const Uint32 rmask = 0x000000FF;
   static const Uint32 bmask = 0x0000FF00;
   static const Uint32 gmask = 0x00FF0000;
   static const Uint32 amask = 0xFF000000;
#else
   static const Uint32 rmask = 0xFF000000;
   static const Uint32 bmask = 0x00FF0000;
   static const Uint32 gmask = 0x0000FF00;
   static const Uint32 amask = 0x000000FF;
#endif
void get_texture(std::string filename)
{
    SDL_Surface * surface = IMG_Load(filename.c_str());
    if(surface == NULL)
    {
	    // could not get filename
	    return;
    }
SDL_PixelFormat *format = surface->format;


// Create new empty surface.
SDL_Surface* newSurface = SDL_CreateRGBSurface( SDL_SRCALPHA, surface->w , surface->h, 32,rmask, bmask, gmask, amask );
// Fill sprite with alpha.
Uint32 alpha = SDL_MapRGBA( format, 0, 0, 0, amask );
SDL_Rect rect;
rect.x = 0;
rect.y = 0;
rect.h = surface->h;
rect.w = surface->w;
SDL_FillRect( newSurface, &rect, alpha);
surface->flags &= !SDL_SRCALPHA;
SDL_SetAlpha( newSurface, SDL_SRCALPHA, SDL_ALPHA_TRANSPARENT );
// Copy image data to our new surface.
SDL_BlitSurface( surface, 0, newSurface, 0 );
    GLuint texture;
// create the texture.
    glPixelStorei(GL_UNPACK_ALIGNMENT,4);
glGenTextures(1, &texture );
glBindTexture(GL_TEXTURE_2D, texture);
// Convert surface to Open GL format.
gluBuild2DMipmaps(GL_TEXTURE_2D, 4,surface->w, surface->h, GL_RGBA,GL_UNSIGNED_BYTE,newSurface->pixels);
// Free our temporary SDL buffers.
SDL_FreeSurface( surface );
SDL_FreeSurface( newSurface );
}
void DrawProcedure(void)
{
    glEnable(GL_TEXTURE_2D|GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glBegin( GL_QUADS );
    //Upper Left
    glTexCoord2f(0, 0);
    glVertex2f(0, 0);
    //Upper Right
    glTexCoord2d(1, 0);
    glVertex2f(32, 0);
    //Lower Right
    glTexCoord2d(1, 1);
    glVertex2f(32, 32);
    //Lower Left
    glTexCoord2d(0 , 1);
    glVertex2f(0, 32);
    glEnd();
    glDisable(GL_TEXTURE_2D| GL_BLEND );
}

int main(int argc, char **argv)
{
  if(SDL_Init(SDL_INIT_EVERYTHING) < 0 )
    return -1;
  SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
  SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 );
  SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8 );
  SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 );
  SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 8 );
  if( SDL_SetVideoMode(200,200, 32, SDL_OPENGL) == NULL)
	  return -1;
  Opengl_init();
  get_texture("Sign.png");
  DrawProcedure();
  SDL_GL_SwapBuffers();
  SDL_Event event;
  bool Process = true;
  while(Process)
  while ( SDL_PollEvent(&event) )
	    switch (event.type)
	    {
		    case SDL_QUIT:
			    Process = false;
	    }
  SDL_Quit();
  return 0;
}


Sponsor:

#2 szecs   Members   -  Reputation: 2185

Like
0Likes
Like

Posted 12 June 2012 - 11:50 PM

First of all, i think that's the bug, you can't do this:
glDisable(GL_TEXTURE_2D| GL_BLEND );


You have to have separate glDisable/Enable calls.
My English is too week in the morning to explain why you can't always use the | trick. Look into "bool operations" and "bit masking" if you are interested. GL_TEXTURE_2D and GL_BLEND are not bit masks, like DEPTH_BUFFER_BIT or COLOR_BUFFER_BIT for example.

GL_TEXTURE_2D, GL_BLEND, DEPTH_BUFFER_BIT, COLOR_BUFFER_BIT are just #defines for numbers. The first two can be any number, the last too can be only power-of-two numbers, because those numbers have only one bit set to 1.


The way you do this now will produce a totally different number, so probably neither texturing nor blending will be set the way you expected. Probably both will remain disabled (as they are disabled by default). And you enable some totally different thing.

Edited by szecs, 12 June 2012 - 11:57 PM.





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS