2010-08-25 20 views
5

मैं बस सोच रहा हूं कि मैं एक एसडीएल_Surface (IMG_Load के माध्यम से एक पीएनजी से लोड) कैसे परिवर्तित कर सकता हूं और इसे एक ट्रैक्टर पर चिपका सकता हूं। यहां मेरे पास है (ज्यादातर मुझे मिले ट्यूटोरियल से चिपकाया गया है)।एसडीएल/ओपनजीएल बनावट पारदर्शिता

#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

उत्तर

5

मैं आपको कहीं भी मिश्रण को सक्षम नहीं देख रहा हूं। आप के कुछ बदलाव की आवश्यकता होगी:

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 
glEnable(GL_BLEND); 

यहाँ देखें: http://www.opengl.org/resources/faq/technical/transparency.htm

1

पारदर्शिता हवलदार के लिए, आप एक अल्फा चैनल की जरूरत है, अपने बनावट पर है, लेकिन अधिक महत्वपूर्ण है, अपने फ्रेमबफर में। यह 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 (अल्फा चैनल के साथ), या जीएल_आरजीबीए (more about this) आज़माएं।

+1

मैं दृढ़ता से '4' को मान के रूप में लिखने के बजाय 'सतह-> प्रारूप-> बाइट्सपीर पिक्सेल' को कॉल करने की सलाह देता हूं। यह अधिक लचीला है और अगर किसी कारण से लोड किए गए एसडीएल_Surface ऑब्जेक्ट के चैनल बदलते हैं तो हम अजीब मुद्दों से बचेंगे (फिर हमारे पास कोड का एक बड़ा ढेर में एक अंक को शिकार करने की स्थिति होगी - बिलकुल मजा नहीं) । – rbaleksandar

0

मैं अपने कंप्यूटर में अपना कोड जांच चुका हूं और यह सही ढंग से चलता है। क्या आपने अपने लिंकर में 'opengl32.lib' सेट किया है?

0

मैं जो शानदार दिमाग हूं, मेरा मुद्दा यह था कि मेरे पास glEnable (GL_DEPTH_TEST) था। उस रेखा को हटाने से सब कुछ काम करता है और मुझे बाद के मुद्दों के बारे में चिंता है। मज़े करो!

संबंधित मुद्दे