2009-11-25 2 views
0

좋아, 그래서 카이로를 사용하여 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

어떻게하면 복잡한 카이로와 OpenGL 코드를 작성할 수 있으며 초보자 C++ 오류가 눈에 띄지 않습니까? 우리는 모두 그것을 만들지 만, 보통 질문을 위해 온라인으로 게시하기 전에 코드의 정확성을 두 번 확인합니다. 나는 너 자신에게이 문제를 해결하려고 노력하지 않았던가 (정말로 부끄러움을 말하고있는 것) 아니면 나는 정말로 놀랐다. –

답변

6

어떤 이유로 들어, 길이 1의 int 배열을했습니다,하지만 당신은 (존재하지 않는) 요소 (2) 에은 glGenTextures를 전달합니다. 배열 경계 너머로 읽습니다. 정의되지 않은 동작입니다. 또한 렌더링 루프 내에서 텍스처 이름을 삭제하는 것처럼 보입니다. 동일한 불법적 인 색인은 glBindTexture에 대한 호출에서도 사용됩니다.

+0

삭제 부분이 흰색 일 가능성이 높습니다. 그러나 텍스처 [1]은 * 정말로 * 나쁘다. 토치, C 배열은 0 인덱싱됩니다. 그래서 GLuint texture [1]의 (유일한) 요소에 접근하기 위해 texture [0]을 작성해야합니다. – Bahbar

+0

오. 그래서 배열에 하나의 요소 만 있다면 텍스처 [5]이더라도 텍스처 [0]을 통해 액세스해야합니다. –

관련 문제