在尝试创建32位RGBA CVPixelBuffer时,我经常会遇到错误.
最值得注意的是错误-6680,这意味着:"缓冲区不支持指定的像素格式."
这是代码片段:(宽度和高度指定为256*256)
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
// [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey,
// [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,
// [NSNumber numberWithBool:YES], kCVPixelBufferOpenGLCompatibilityKey,
nil];
CVPixelBufferRef pxbuffer = NULL;
CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, WIDTH,
HEIGHT, kCVPixelFormatType_32RGBA, (CFDictionaryRef) options,
&pxbuffer);
NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL);
Run Code Online (Sandbox Code Playgroud)
任何人都可以暗示我做错了什么吗?
使用UBO时,我们将统一块绑定到绑定点.然后我们还将UBO绑定到相同的绑定点:类似于:
glUseProgram(ProgramName);
glUniformBlockBinding(ProgramName, uniformLocation, bindingPoint);
glBindBufferBase(GL_UNIFORM_BUFFER, bindingPoint, bufId);
Run Code Online (Sandbox Code Playgroud)
我有2个问题:
#import "AppDelegate.h"
#import <MapKit/MapKit.h>
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions
{
[self setWindow:[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]];
[self.window makeKeyAndVisible];
UIViewController *vc = [[UIViewController alloc] init];
self.window.rootViewController = vc;
vc.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
MKMapView *map = [[MKMapView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
map.autoresizingMask = UIViewAutoresizingFlexibleHeight;
[vc.view addSubview:map];
return YES;
}
@end
Run Code Online (Sandbox Code Playgroud)
要查看问题,请运行上面的代码并旋转设备.您将体验旋转动画的显着延迟.
如果您连接iOS8 iPad并运行模拟器,您将收到以下警告:
崩溃!0x15dd7980
错误/SourceCache/VectorKit/VectorKit-992.16/GeoGL/GeoGL/GLCoreContext.cpp 1237:帧缓冲不完整,附件不完整
有谁知道如何解决这个问题?
XCB 官方文档告诉我们,将 OpenGL 与 XCB 一起使用是不可能的:还必须使用 Xlib。
Bart Massey(XCB 的创建者)的这篇文章并不表明这应该是不可能的。但我确定我错过了一些东西。
我花了几个小时浏览xcb/glx.h,这里组织得很好。在我看来,它就像一个成熟的 API。但我无法让它工作。
xcb/glx.h什么?(注意。这是了解 XCB 工作原理的持续努力的一部分。)
相关的SO 线程。
如果有人愿意尝试一下,这里是 XCB 邮件列表中原始帖子的来源,将其精简并放入单个文件中。
你会注意到xcb_glx_make_context_current返回错误169(不知道是什么意思),但只有在 xcb_glx_create_window需要0和NULL它的最后两个参数。这些参数涉及一组属性,似乎是由函数返回的xcb_glx_create_window_attribs,但我不知道如何使用它...
之前的长辅助函数int main()仅意味着两个返回两个整数,xcb_glx_fbconfig_t fbconfig xcb_visualid_t glx_visual,对应于第一个“匹配”帧缓冲区配置。在我的平台上,这些是0xa7和0x24。它们正是 Xlib/GLX 例程(实际有效)返回的内容,所以我知道我选择的帧缓冲区配置很好。
所以,问题似乎发生在xcb_glx_create_window和xcb_glx_make_context_current......
// gcc main2.c -o main …Run Code Online (Sandbox Code Playgroud) 所以,我想为mac编写一个虚拟监视器驱动程序。这类似于屏幕回收器应用程序所做的事情。我已经阅读了很多关于驱动程序编程和 kext 的一般资源,我已经完成了苹果的基本 iokit 驱动程序教程,但是从哪里开始呢?
本教程提供了对驱动程序的非常基本的了解,但对于我的用例来说,这绝对是不够的。我知道我们必须实现 IOframebuffer 标头,但我不知道其余的?此外 IOframebuffer 标头有一些非常复杂的方法,我不太清楚如何实现这些方法。有人可以向我提供一些关于需要做什么的有用指示吗?
我已经看过这个问题
这些回购,
https://github.com/tSoniq/displayx
https://github.com/mkernel/EWProxyFramebuffer
但问题是,这两个项目在 MAC OS 10.12 中都不起作用,因为它们很长时间没有更新。
我正在寻找一些我需要遵循的指南来编写这样的驱动程序,而苹果文档并没有真正的帮助。
我有兴趣训练一个对象检测神经网络,看看我是否能在从镜头中提取我的特征时获得更好的性能/准确性。
是否可以在 openGL 环境中运行经过训练的模型(使用帧缓冲区/纹理作为输入)而无需从 cpu/gpu 来回读取纹理?
我一直在努力解决这个问题,而且这个代码对我来说不明原因崩溃了.我正在创建一个FBO,绑定一个纹理,然后第一个glDrawArrays()在我的iPhone模拟器上崩溃了"EXC_BAD_ACCESS".
这是我用来创建FBO的代码(并绑定纹理和......)
glGenFramebuffers(1, &lastFrameBuffer);
glGenRenderbuffers(1, &lastFrameDepthBuffer);
glGenTextures(1, &lastFrameTexture);
glBindTexture(GL_TEXTURE1, lastFrameTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 768, 1029, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_6_5, NULL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
//Bind/alloc depthbuf
glBindRenderbuffer(GL_RENDERBUFFER, lastFrameDepthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 768, 1029);
glBindFramebuffer(GL_FRAMEBUFFER, lastFrameBuffer);
//binding the texture to the FBO :D
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, lastFrameTexture, 0);
// attach the renderbuffer to depth attachment point
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, lastFrameDepthBuffer);
[self checkFramebufferStatus];
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它参与了一个对象,checkFrameBufferStatus如下所示:
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
switch(status)
{
case GL_FRAMEBUFFER_COMPLETE:
JNLogString(@"Framebuffer complete.");
return TRUE; …Run Code Online (Sandbox Code Playgroud) 离屏渲染到纹理绑定的屏幕外帧缓冲对象应该是如此微不足道,但我遇到了一个问题,我无法绕过头脑.
我的完整示例程序(目前只有2D!)在这里:
请参阅下面的一些说明.
我正在创建一个rgba纹理对象512x512,将其绑定到FBO.此时不需要深度或其他渲染缓冲区,严格来说是2D.
以下非常简单的着色器渲染到此纹理:
顶点着色器:
varying vec2 vPos; attribute vec2 aPos;
void main (void) {
vPos = (aPos + 1) / 2;
gl_Position = vec4(aPos, 0.0, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
在aPos中,这只是一个包含4 xy坐标的VBO,用于四边形(-1,-1 :: 1,-1 :: 1,1:-1,1)
因此,虽然帧缓冲分辨率理论上应该是512x512,但着色器将其"纹理"渲染到"全(关)屏幕四边形"上,遵循GLs -1..1 coords范例.
片段着色器:
varying vec2 vPos;
void main (void) {
gl_FragColor = vec4(0.25, vPos, 1);
}
Run Code Online (Sandbox Code Playgroud)
所以它设置了一个完全不透明的颜色,红色固定为0.25,绿色/蓝色取决于x/y,介于0和1之间.
在这一点上,我的假设是渲染512x512纹理,仅显示-1..1全(关)屏幕四边形,片段阴影显示绿色/蓝色从0..1.
所以这是我的屏幕外设置.在屏幕上,我有另一个真正可见的全屏四边形与4 xyz坐标{-1,-1,1 ::: 1,-1,1 ::: 1,1,1 ::: -1,1, 1}.同样,现在这是2D所以没有矩阵,所以z总是1.
此四边形由不同的着色器绘制,只需渲染给定的纹理,即教科书GL-101样式.在我上面链接的示例程序中,我有一个简单的布尔切换doRtt,当这是假(默认)时,根本不执行渲染到纹理,这个着色器只显示使用当前目录中的texture.jpg.
这个doRtt = false模式显示第二个屏幕四重渲染器对于我当前的要求是"正确的"并按照我的要求执行纹理化:垂直重复两次和水平重复两次(稍后将被钳制,重复仅用于测试这里),否则使用NO纹理过滤或mipmapping进行缩放.
因此,无论窗口(以及视图端口)如何调整大小,我们总是会看到一个全屏四边形,其中单个纹理水平重复两次,垂直重复两次.
现在,使用doRtt = true,第二个着色器仍然可以完成它的工作,但纹理永远不会完全正确缩放 - 或绘制,我不确定,因为不幸的是我们不能只说"嘿gl将此FBO保存到磁盘调试目的".
RTT着色器执行一些部分渲染(或者可能是一个完整的渲染,再次无法确定屏幕外发生了什么......)特别是当您调整视口大小比默认大小小很多时,您会看到纹理之间的间隔重复,并非确实显示了我们非常简单的RTT片段着色器所期望的所有颜色.
(A)要么:512x512纹理是正确创建的,但我的代码没有正确映射(但是为什么doRtt = false任何给定的texture.jpg文件使用完全相同的简单纹理四边形着色器显示得很好?)
(B)或:512x512纹理没有正确渲染,不知何故rtt frag着色器根据窗口分辨率改变其输出 …
我正在使用OpenGL帧缓冲对象.我创建了一个具有2种颜色纹理和深度纹理的帧缓冲对象.
我正在使用
glBindFramebuffer(GL_READ_FRAMEBUFFER, ID);
Run Code Online (Sandbox Code Playgroud)
要绑定我的帧缓冲区,但在控制台上我收到此警告
Redundant State change in glBindFramebuffer call, FBO 1 already bound
Run Code Online (Sandbox Code Playgroud)
如何检查我的哪些帧缓冲区已被绑定?我的意思是哪个OpenGL函数允许我检查已经绑定的帧缓冲区的ID,以便我可以防止冗余绑定.
我想在 Mac 上重新创建本文中所示的程序。这可能吗?到目前为止,我的研究表明“不”,但我还不想放弃。Python 是首选,但我的目的很简单,大多数语言都可以。
编辑:为了详细说明我的目标,它将单个像素写入没有背景的屏幕上。我不在乎它们是否会被鼠标移动删除,如果有比帧缓冲区更好的方法,我会使用它。