Textures with SDL2 + OpenGL

Started by
1 comment, last by cHimura 8 years ago

Hi everybody,

I'm migrating my engine to SDL2 + OpenGL. Originally, my engine worked with SDL 1.2 + OpenGL.

Now, I have problems with the textures, the engine doesn't render the textures.

Only see a black square.

This is the code to load the image and convert to OpenGL texture:


bool LoadTexture(GLuint* texture, string fileName, GLuint& width, GLuint& height)
{
	SDL_Surface *surface = IMG_Load(fileName.c_str()); // this surface will tell us the details of the image

	GLint nColors;
	GLenum textureFormat;

    if(surface){
        // Check that the image’s width is a power of 2
        if ( (surface->w & (surface->w - 1)) != 0 ) {
            cout << "Warning: image.bmp’s width is not a power of 2\n" << endl;
        }

        // Also check if the height is a power of 2
        if ( (surface->h & (surface->h - 1)) != 0 ) {
            cout << "Warning: image.bmp’s height is not a power of 2\n" << endl;
        }

        //get number of channels in the SDL surface
        nColors = surface->format->BytesPerPixel;

        //contains an alpha channel
        if(nColors == 4)
        {
            if(surface->format->Rmask==0x000000ff)
                textureFormat = GL_RGBA;
            else
                textureFormat = GL_BGRA;
        }
        else if(nColors == 3) //no alpha channel
        {
            if(surface->format->Rmask==0x000000ff)
                textureFormat = GL_RGB;
            else
                textureFormat = GL_BGR;
        }
        else
        {
            cout << "warning: the image is not truecolor…this will break " << endl;
        }

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

        // Bind the texture object
        glBindTexture(GL_TEXTURE_2D, *texture);

        // Set the texture’s stretching properties
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);


        glTexImage2D( GL_TEXTURE_2D, 0, nColors, surface->w, surface->h, 0, textureFormat, GL_UNSIGNED_BYTE, surface->pixels);

		width = surface->w;
		height = surface->h;
    }
    else {
		cout << "LoadTexture:: Could not load " << fileName.c_str() << ": " << SDL_GetError() << endl;

		return false;
		//SDL_Quit();
    }

    // Free the SDL_Surface only if it was successfully created
    if(surface) {
        SDL_FreeSurface(surface);
    }

	return true;
}

This is the Vertex Shader


attribute vec4 a_position;
attribute vec2 a_texCoord;
varying vec2 v_texCoord;

void main()
{
    gl_Position = a_position;
    v_texCoord = a_texCoord;
}

This is the Fragment Shader


precision mediump float;                            
varying vec2 v_texCoord;                            
uniform sampler2D s_texture;                        
void main()                                         
{                                                   
  gl_FragColor = texture2D( s_texture, v_texCoord );
}

And the function to render


void SquareTextureDemo::Render(){
	glClear(GL_COLOR_BUFFER_BIT);
	glClearColor(1.0f, 0.0f, 0.0f, 1.0f);

	glBindVertexArray(vao);

    glUseProgram(shaderProgram);
    
    glBindBuffer(GL_ARRAY_BUFFER, m_geometryBuffer);
    
    glVertexAttribPointer(att_position, 3, GL_FLOAT, GL_FALSE, sizeof(PositionTextured), (void*)0);
    glEnableVertexAttribArray(att_position);
    
    glVertexAttribPointer(att_texCoord, 2, GL_FLOAT, GL_FALSE, sizeof(PositionTextured), (void*)12);
    glEnableVertexAttribArray(att_texCoord);
    
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, tex);
    glUniform1i(uni_samplerTex, 0);
    
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndices);
    glDrawElements(GL_TRIANGLES, (6 * sizeof(GLubyte))/sizeof(GLubyte), GL_UNSIGNED_BYTE, (void*)0);

	glBindVertexArray(0);

	OPENGLRENDERER->SwapGLBuffers();
}

I don't know what is wrong, with SDL 1.2 + OpenGL works well but now.

Someone can help me??

Regards

Advertisement

Have you read the SDL migration guide? https://wiki.libsdl.org/MigrationGuide

I think you'll find it useful.

Site: Hexmind.com Twitter: @HexmindGames Facebook: /hexmind Working on upcoming game, Reapertom.

Hi,

Thank you for your response.

Yes, I read the guide of migration but it says anything about the textures.

I found the error. I sent the nColor variable instead textureFormat i tne glTexImage2D function and now works well.

Regards

This topic is closed to new replies.

Advertisement