c++ - OpenGL 纹理不会映射 - 白色方 block ?

标签 c++ macos opengl cairo

好吧,我正在使用 cairo 将 SVG 转换为 openGL 纹理的图像数据。

那部分有效。

但现在我使用的纹理不会映射到我正在制作的四边形。它只是显示为一个空白方 block 。

是不是我调用的顺序有问题,或者是有什么我忘记使用的 secret 函数?

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 的 int 数组,但是您将(不存在的)元素 2 传递给 glGenTextures。这超出了数组边界并且是未定义的行为。您似乎还删除了渲染循环中的纹理名称。那里也使用了相同的非法索引,在您对 glBindTexture 的调用中也是如此。

关于c++ - OpenGL 纹理不会映射 - 白色方 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1794821/

相关文章:

c++ - 如何修复由生成随机枚举值引起的堆栈损坏?

python - 使用手套中的训练数据为您的数据集获取词嵌入

c++ - OpenGL 库

c++ - OpenGL Y 纹理坐标行为异常

c++ - select() 和 FD_ISSET() 成功后 read() 失败

C++ 模板 : Select different type based on value of template parameter

c++ - xcode 中的 Stray/377

linux - 将文件从桌面复制到虚拟服务器 LINUX

c++ - OpenGL imgui slider 范围

c++ - 为 C++ STL 头文件生成 Doxygen 文档