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 - 将位图转换为纹理,并保存纹理