2009-11-25 66 views
0

好的,所以我使用cairo將SVG轉換爲openGL紋理的圖像數據。OpenGL紋理不會映射 - 白色正方形?

該部分工作。

但是現在我使用的紋理將不會映射到我正在製作的四邊形。它只是顯示爲一個空白的方塊。

有沒有東西與我打電話給事情的順序或有一些祕密功能,我忘了使用?

const int SCREEN_WIDTH = 1280; 
const int SCREEN_HEIGHT = 720; 
const int SCREEN_BPP = 32; 

int frame = 0; 
SDL_Event event; 
bool quit; 
GLuint texture[1]; 

int main(int argc, char *argv[]) { 
    g_type_init(); 
    rsvg_init(); 

    SDL_Surface *screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_OPENGL); 

    SDL_WM_SetCaption ("Cairo", NULL); 
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); 

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

/*2D stuff - it worked here 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1, 1); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glEnable (GL_BLEND); 
    glEnable (GL_TEXTURE_2D); 
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glEnable (GL_TEXTURE_2D); 
    glEnable(GL_LIGHTING); 
    glEnable(GL_COLOR_MATERIAL); 
*/ 

//An attempt at setting up 3D stuff 
glEnable(GL_TEXTURE_2D); 
glMatrixMode(GL_MODELVIEW); 
glMatrixMode(GL_PROJECTION); 
glViewport(0,0,SCREEN_WIDTH, SCREEN_HEIGHT); 

glShadeModel(GL_SMOOTH); 
glClearColor(0.0,0.0,0.0,0.0); 
glClearDepth(1.0); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE); 
glEnable(GL_BLEND); 
//glLoadIdentity(); 


    float FlowerWidth = .5; 
    float FlowerHeight = .5; 

    float FlowerTextureWidth = 80; 
    float FlowerTextureHeight = 80; 

    float FlowerScaleWidth = 1; 
    float FlowerScaleHeight = 1; 
    cairo_surface_t* Flower; 
    cairo_t* context; 

    Flower = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, FlowerTextureWidth, FlowerTextureHeight); 
    context = cairo_create(Flower); 

    const gchar* Filename = "resources/area/haneda/lavender.svg"; 
    RsvgHandle* SvgData = rsvg_handle_new_from_file(Filename, NULL); 

    rsvg_handle_render_cairo_sub(SvgData, context,"#1000"); 
    unsigned char *buffer = cairo_image_surface_get_data(Flower); 
    cairo_surface_write_to_png(Flower,"flower.png"); 


//Make a texture 
     glGenTextures(1, &texture[1]); 
    glBindTexture(GL_TEXTURE_2D, texture[1]); 
    glPixelStoref(GL_UNPACK_ALIGNMENT, 1); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 

    glGetError(); 
    //or am I supposed to use GL_TEXTURE_2D? 
    glTexImage2D(GL_TEXTURE_2D, 
    0, 
    GL_RGBA, 
    FlowerHeight, 
    FlowerWidth, 
    0, 
    GL_BGRA, 
    GL_UNSIGNED_BYTE, 
    buffer); 
//done 


    while (quit==false) { 
     while(SDL_PollEvent(&event)) { 
      if(event.type == SDL_QUIT) { 
      quit = true; 
      } 
      } 




      /* 
FlowerScaleWidth+=.001; 
FlowerScaleHeight+=.001; 
cairo_scale(context,FlowerScaleWidth,FlowerScaleHeight); 
*/ 










glBindTexture (GL_TEXTURE_2D, texture[1]); 

glBegin (GL_QUADS); 
    glTexCoord2f (0.0, 0.0); 
    glVertex3f (0.0, 0.0, 0.0); 

    glTexCoord2f (FlowerWidth, 0.0); 
    glVertex3f (FlowerWidth, 0.0, 0.0); 

    glTexCoord2f (FlowerWidth, FlowerHeight); 
    glVertex3f (FlowerWidth, FlowerHeight, 0.0); 

    glTexCoord2f (0.0, FlowerHeight); 
    glVertex3f (0.0, FlowerHeight, 0.0); 
glEnd(); 
glDeleteTextures(1, &texture[1]); 


     cairo_save (context); 
     cairo_set_source_rgba (context, 0, 0, 0, 0); 
     cairo_set_operator (context, CAIRO_OPERATOR_SOURCE); 
     cairo_paint (context); 
     cairo_restore (context); 

     SDL_GL_SwapBuffers(); 
     //glClear(GL_COLOR_BUFFER_BIT); 
//SDL_Delay(100); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glGetError(); 


SDL_Delay(400); 

     } 

} 
+1

它是如何編寫複雜的cairo和opengl代碼,仍然錯過明顯的初學C++錯誤?我們都製作它們,但通常我會仔細檢查我的代碼是否正確,然後在網上發佈問題。我不僅僅是卑鄙的,要麼你沒有試圖自己解決這個問題(對你不好意思),要麼我真的很驚訝。 – 2009-11-25 15:51:37

回答

6

出於某種原因,您所做長度1的一個整數數組,但你通過(不存在的)元件2 glGenTextures。這超出了數組邊界,並且是未定義的行爲。您似乎也會在渲染循環中刪除紋理名稱。這裏也使用了相同的非法索引,以及您致電glBindTexture

+0

刪除部分很可能是白色的原因。但紋理[1]真的很糟糕。火炬,C數組是0索引。所以你需要寫紋理[0]來訪問GLuint紋理[1]的(唯一)元素。 – Bahbar 2009-11-25 08:17:37

+0

ohhh。所以我在猜測,如果一個數組只有一個元素,即使它是紋理[5],那麼它也必須通過紋理[0]來訪問? – 2009-11-25 14:06:00