2010-08-25 173 views
5

我只是想知道如何转换一个SDL_Surface(从PNG通过IMG_Load加载)并将其粘贴在四边形上。这是我所拥有的(大部分只是复制粘贴从我找到的教程中)。SDL/OpenGL纹理透明

#include "SDL.h" 
#include "SDL_opengl.h" 
#include "SDL_image.h" 

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    SDL_Surface *screen; 

    // Slightly different SDL initialization 
    if (SDL_Init(SDL_INIT_VIDEO) != 0) { 
     printf("Unable to initialize SDL: %s\n", SDL_GetError()); 
     return 1; 
    } 

    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); // *new* 

    screen = SDL_SetVideoMode(640, 480, 16, SDL_OPENGL); // *changed* 
    if (!screen) { 
    printf("Unable to set video mode: %s\n", SDL_GetError()); 
    return 1; 
} 

    // Set the OpenGL state after creating the context with SDL_SetVideoMode 

glClearColor(0, 0, 0, 0); 

glEnable(GL_TEXTURE_2D); // Need this to display a texture 

    glViewport(0, 0, 640, 480); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    glOrtho(0, 640, 480, 0, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    // Load the OpenGL texture 

    GLuint texture; // Texture object handle 
    SDL_Surface *surface; // Gives us the information to make the texture 

    if ((surface = IMG_Load("img/star.png"))) { 

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

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

     // 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_LINEAR); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

     // Edit the texture object's image data using the information SDL_Surface gives us 
     glTexImage2D(GL_TEXTURE_2D, 0, 3, surface->w, surface->h, 0, 
        GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels); 
    } 
    else { 
     printf("SDL could not load image.bmp: %s\n", SDL_GetError()); 
     SDL_Quit(); 
     return 1; 
    }  

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

    // Clear the screen before drawing 
glClear(GL_COLOR_BUFFER_BIT); 

    // Bind the texture to which subsequent calls refer to 
    glBindTexture(GL_TEXTURE_2D, texture); 

    glColor3f(1,0,0); 
    glDisable(GL_TEXTURE_2D); 
    glBegin(GL_QUADS); 
     // Top-left vertex (corner) 
     glTexCoord2i(0, 0); 
     glVertex3f(0, 0, 0); 

     // Bottom-left vertex (corner) 
     glTexCoord2i(1, 0); 
     glVertex3f(328, 0, 0); 

     // Bottom-right vertex (corner) 
     glTexCoord2i(1, 1); 
     glVertex3f(328, 328, 0); 

     // Top-right vertex (corner) 
     glTexCoord2i(0, 1); 
     glVertex3f(0, 328, 0); 
    glEnd(); 
    glColor3f(1,1,1); 
    glEnable(GL_TEXTURE_2D); 

    glBegin(GL_QUADS); 
     // Top-left vertex (corner) 
     glTexCoord2i(0, 0); 
     glVertex3f(100, 100, 0); 

     // Bottom-left vertex (corner) 
     glTexCoord2i(1, 0); 
     glVertex3f(228, 100, 0); 

     // Bottom-right vertex (corner) 
     glTexCoord2i(1, 1); 
     glVertex3f(228, 228, 0); 

     // Top-right vertex (corner) 
     glTexCoord2i(0, 1); 
     glVertex3f(100, 228, 0); 
    glEnd(); 

    SDL_GL_SwapBuffers(); 

    // Wait for 3 seconds to give us a chance to see the image 
    SDL_Delay(3000); 

    // Now we can delete the OpenGL texture and close down SDL 
    glDeleteTextures(1, &texture); 

    SDL_Quit(); 

return 0; 
} 

该纹理呈现,但在那里应该是透明的,只是黑色。

+1

下一次使用代码示例按钮获取大块代码。 – genpfault 2010-08-25 02:23:40

回答

1

要甲肝透明度,你需要一个alpha通道,在你的纹理,但更重要的是,在你的帧缓冲区。这与SDL_GL_SetAttribute完成,例如:

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); 

这将要求一个帧缓冲至少那些大小,你就可以使用混合。请记住启用混合并设置混合功能。

0

看看你的电话glTexImage2D(GL_TEXTURE_2D, 0, 3, surface->w, surface->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels);。您为内部格式指定3种颜色分量。尝试4(使用Alpha通道)或GL_RGBA(more about this)。

+1

我强烈建议只调用'surface-> format-> BytesPerPixel'而不是手动将'4'写下来作为一个值。它更加灵活,如果由于某种原因导致加载的SDL_Surface对象的通道发生变化(那么我们可能会在一堆大量的代码中找到一个数字 - 这完全没有趣),这样可以避免以后发生的奇怪问题。 。 – rbaleksandar 2015-10-22 19:10:51

0

我一直在检查您的代码在我的电脑中,这是正确运行。你有没有在链接器中设置'opengl32.lib'?

0

作为我的聪明才智,我的问题是我有glEnable(GL_DEPTH_TEST)。删除该行使所有的工作,我担心后面的问题。玩的开心!