我想在嵌入式Linux应用程序中快速移动一个矩形到帧缓冲区.我发现这个功能cfb_copyarea可能很有用.但我无法在/ dev/fb设备上找到任何ioctl来调用该函数.或者可以直接调用此函数吗?
我OpenGLES在iPhone上渲染纹理和屏幕外帧缓冲区时遇到问题.
alt text http://j.imagehost.org/0923/IMG_0020.png alt text http://j.imagehost.org/0725/IMG_0019.png
第一张图片显示CAEAGLLayer直接渲染的麻将牌,这是正确的.第二个显示渲染到屏幕外帧缓冲区的瓦片,使用复制到纹理glCopyTexImage2D和渲染到的纹理CAEAGLLayer.两者都使用白色不透明四边形作为背景.我也尝试直接渲染到纹理,但效果与屏幕外帧缓冲区相同.
我创建帧缓冲区的代码:
GLuint framebuffer;
glGenFramebuffersOES(1, &framebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);
GLuint renderbuffer;
glGenRenderbuffersOES(1, &renderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, renderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGB8_OES,
512, 512);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES,
GL_RENDERBUFFER_OES, renderbuffer);Run Code Online (Sandbox Code Playgroud)
我通过一次调用从纹理图集中绘制所有图块,glDrawElements使用VBO传递隔行扫描的顶点数据(坐标,纹理坐标,颜色).我使用RGBA8888纹理格式,使用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)混合功能在两个三角形(四边形)上绘制每个图像.我不使用深度缓冲(在所有情况下).
有人能告诉我可能是什么问题吗?
我正在笔记本电脑上使用OpenGL应用程序.当我尝试显示单色图像(非常大)时,我的应用程序显示了许多黑白无法识别的图案.我有一种预感,可能是我的旧Geforce Go 7950 GTX(512 MB)对于我的应用来说太旧了,并且认为问题是由于帧缓冲对象大小限制 - 有没有办法找出最大的FBO可以做什么是?
在Mac上,我有一个OpenGL设置,除了帧缓冲区之外工作得很好 - 纹理工作等等.所以我知道纹理已经启用,我有一个有效的上下文等等.所有工作完美无缺,直到我尝试创建一个帧缓冲区.
我用glGenFramebuffers,glBindFramebuffer和glFramebufferTexture2D创建了一个framebuffer,glCheckFramebufferStatus返回GL_FRAMEBUFFER_COMPLETE.如果我然后调用glClear,然后调用glGetTexImage,返回的数据显示glClear就像应该的那样对绑定到帧缓冲区的纹理起作用.我可以将glClearColor设置为我想要的任何东西,glClear可以正确设置纹理数据.
但这就是好消息停止的地方.无论是使用VBO还是glBegin/glEnd,我都无法在帧缓冲区中绘制任何内容.绑定到帧缓冲区的纹理的纹理数据不受绘制调用的影响(尽管glClear结果仍然出现).即使我在glGetTexImage调用之前调用glFlush和glFinish也是如此.此外,glGetError对我的任何调用都没有返回任何错误.
我在下面发布了一些示例代码,我在程序的相关点添加了这些代码,试图解决这个问题,以防任何人有所了解.(这不包括glClear调用,但我知道从同一点的单独测试可以正常工作).
glGenFramebuffers(1, &fb);
glBindFramebuffer(GL_FRAMEBUFFER, fb);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbTexID, 0);
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(status != GL_FRAMEBUFFER_COMPLETE)
Debugger();
glEnable(GL_TEXTURE_2D);
glCullFace(GL_NONE);
glGenTextures(1,(GLuint*)&tex);
glBindTexture(GL_TEXTURE_2D,tex);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,1024,1024,0,GL_RGBA,GL_UNSIGNED_BYTE,NULL);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 1024, 1024, 0, -5000, 5000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glViewport(0, 0, 1024, 1024);
glColor4f(1,1,1,1);
glBegin(GL_TRIANGLES);
glTexCoord2f(0, 0);
glVertex2f(0, 0);
glTexCoord2f(1, 0);
glVertex2f(1024, 0);
glTexCoord2f(0, 1);
glVertex2f(0, 1024);
glEnd();
glFlush();
glFinish();
unsigned char …Run Code Online (Sandbox Code Playgroud) 有没有人成功地做到了这一点?似乎我在模板渲染缓冲区中使用的索引格式glCheckFramebufferStatus(...)返回GL_FRAMEBUFFER_UNSUPPORTED.我已经成功地绑定了深度\颜色渲染缓冲区,但每当我尝试用我的模板缓冲区做同样的事情时(我说)GL_FRAMEBUFFER_UNSUPPORTED.
这是我的代码的片段:
// Create frame buffer
GLuint fb;
glGenFramebuffers(1, &fb);
// Create stencil render buffer (note that I create depth buffer the exact same way, and It works.
GLuint sb;
glGenRenderbuffers(1, &sb);
glBindRenderbuffer(GL_RENDERBUFFER, sb);
glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, w, h);
// Attach color
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, cb, 0);
// Attach stencil buffer
glBindFramebuffer(GL_FRAMEBUFFER, fb);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rb);
// And here I get an GL_FRAMEBUFFER_UNSUPPORTED when doing glCheckFramebufferStatus()
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
注意:颜色附件是纹理而不是渲染缓冲
我必须执行一些需要访问OS X帧缓冲区中的屏幕数据的任务.在10.6.8中我们可以使用Quart Display Service API获取帧缓冲区基址,但我们不能在10.7或10.8中执行此操作.
Apple建议使用CGDisplayCreateImage来获取屏幕图像.但是获取原始图像数据效率很低,因为我们必须将获得的图像对象绘制到上下文中.
是否有其他方法可以获取帧缓冲区的原始数据?
我正在尝试开始使用SDL创建一个可以在X下运行的便携式漂亮前端,或直接从终端运行(希望在某些时候在rasberry pi上运行) - 此刻我正在使用最新的笔记本电脑Ubuntu就可以了.
我无法在终端上正确显示图像 - 它以ascii art的形式出现.我认为这是我的系统配置而不是我的示例程序的问题,因为它在X下运行时工作正常.
到目前为止,我认为我所知道的是SDL应该使用fbcon视频驱动程序,而是使用aalib.我收集SDL检查以查看帧缓冲是否可用并且如果它是 - 并且它在那里 - 使用它 - 至少根据输出
> fbset -i
mode "1024x768"
geometry 1024 768 1024 768 32
timings 0 0 0 0 0 0 0
accel true
rgba 8/16,8/8,8/0,0/0
endmode
Run Code Online (Sandbox Code Playgroud) 场景
我正在创建一个帧缓冲区对象并将纹理绑定到颜色附件0.我没有使用深度缓冲区.创建它之后,我解开它.
在某个时间点之后,帧缓冲区被绑定,向其呈现三角形条带(某些部分部分透明),然后再次解除绑定.使用不同的三角形条重复多次.
最终,绘制到主帧缓冲区的是纹理四边形,其纹理附加到我创建的帧缓冲区对象上.
问题
我发现绘制到纹理中的三角形条带的部分透明部分与其他三角形条带重叠没有正确混合.它们似乎与白色混合,而不是纹理中已经存在的颜色.即使我用纯绿色填充纹理(例如),在混合时拾取的颜色仍然是白色.
这里是我用来完成所有这些的代码的几个片段:
初始化
glGenTextures(1, &texture_id);
glBindTexture(GL_TEXTURE_2D, texture_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
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_RGBA, GL_UNSIGNED_BYTE, NULL);
glGenFramebuffers(1, &framebuffer_id);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_id);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_id, 0);
glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
Run Code Online (Sandbox Code Playgroud)
渲染到纹理(迭代)
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_id);
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// On the first render iteration, do_clear is true
if (do_clear)
{
glClearColor(r, g, b, a);
glClear(GL_COLOR_BUFFER_BIT);
}
// ... render the current triangle strip ...
glBindFramebuffer(GL_FRAMEBUFFER, …Run Code Online (Sandbox Code Playgroud) 我的任务:计算3D网格的像素坐标(例如制作快照),从特定的摄像机角度找到该网格的2D形状.
我目前正在使用带有QGeometryRenderer的Qt3D将包含网格的场景渲染到QWidget,它可以正常工作.我尝试使用QWidget :: render()将QWidget的内容呈现为Pixmap,如本文所建议的如何创建QWidget的屏幕截图?.将像素图保存为.jpg会产生具有默认背景颜色的空白图像,这是有意义的,因为QWidget本身并未保存网格对象.
以下是我在mainwindow.cpp中设置场景的方法
// sets the scene objects, camera, lights,...
void MainWindow::setScene() {
scene = custommesh->createScene(mesh->getVertices(),
mesh->getVerticesNormals(),
mesh->getFaceNormals(),
mesh->getVerticesIndex(),
mesh->getFacesIndex()); // QEntity*
custommesh->setMaterial(scene); // CustomMeshRenderer object
camera = custommesh->setCamera(view);
custommesh->setLight(scene, camera);
custommesh->setCamController(scene, camera);
view->setRootEntity(scene); // Qt3DExtras::Qt3DWindow object
// Setting up a QWiget working as a container for the view
QWidget *container = QWidget::createWindowContainer(view);
container->setMinimumSize(QSize(500, 500));
QSizePolicy policy = QSizePolicy(QSizePolicy::Policy(5), QSizePolicy::Policy(5));
policy.setHorizontalStretch(1);
policy.setVerticalStretch(1);
container->setSizePolicy(policy);
container->setObjectName("meshWidget");
this->ui->meshLayout->insertWidget(0, container);
}
Run Code Online (Sandbox Code Playgroud)
至于渲染,这里是custommeshrenderer类,其中定义了QGeometryRenderer,并在初始化网格时返回QEntity*.
#include "custommeshrenderer.h"
#include <Qt3DRender/QAttribute>
#include <Qt3DExtras>
#include <Qt3DRender/QGeometryRenderer> …Run Code Online (Sandbox Code Playgroud) 我想使用帧缓冲区使用着色器程序创建图像。这很好,除了Y是倒置的。似乎左下角变为左上角。为什么会这样?这正常吗?这会在所有android设备上发生吗?
在我的着色器程序内部,gl_FragCoordY值将反转,具体取决于我是直接绘制到帧缓冲区还是直接绘制到屏幕。