Awesomium 与 OpenGL 纹理转换

Posted

技术标签:

【中文标题】Awesomium 与 OpenGL 纹理转换【英文标题】:Awesomium with OpenGL Texture Shift 【发布时间】:2013-12-29 09:44:53 【问题描述】:

我正在尝试将 awesomium 与 opengl(glut 和 cpp)一起使用,但在将网页渲染为纹理时遇到了问题。纹理在 x 和 y 轴上随机移动(每次运行程序时都不同)。图片:

我认为 GL_CLAMP_TO_EDGE 会解决这个问题,但它没有。我做错了什么?

Awesomium 部分:

    web_core = WebCore::Initialize(WebConfig());
    view  = web_core->CreateWebView(WIDTH, HEIGHT);
    WebURL url(WSLit(URL));
    view->LoadURL(url);
    BindMethods(view);
    while (view->IsLoading())
        web_core->Update();
    Sleep(300);
    web_core->Update();
    surface = (BitmapSurface*)view->surface();  

加载纹理的部分:

    glBindTexture(GL_TEXTURE_2D, 13);   
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, WIDTH, HEIGHT, 0,
        GL_BGRA_EXT, GL_UNSIGNED_BYTE, surface);

【问题讨论】:

找到了解决方案。通过 surface->CopyTo 将表面复制到 unsigned char * 并将其用作纹理。 【参考方案1】:

这就是我所做的。我知道你解决了这个问题,但它可能会在未来帮助某人。

int w = surface->width();
int h = surface->height();

unsigned char *buffer = new unsigned char[w * h * 4];
surface->CopyTo(buffer, w * 4, 4, false, false);

glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, buffer);

delete[] buffer;

【讨论】:

以上是关于Awesomium 与 OpenGL 纹理转换的主要内容,如果未能解决你的问题,请参考以下文章

Android 上的 OpenGL - 将位图转换为纹理,并保存纹理

将 GLubyte* 转换为 GLuint* 用于 alpha 纹理 Opengl 3.0 / c++ / Win32

加载 HBITMAP 并将其转换为 OpenGL 纹理

ffmpeg 视频到 opengl 纹理

OpenGL 七 - OpenGL 纹理基础与案例演示

OpenGL-载入纹理