- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在做一个涉及使用 glGenFramebuffers() 的 OpenGL 学习练习。但是,当我调用该函数时,似乎什么也没有发生。我创建了以下简单程序来重现该问题:
#define GL_GLEXT_PROTOTYPES
#include <stdio.h>
#include <GL/gl.h>
#include <GL/glext.h>
static GLuint fb[2];
int main(void)
{
glGenFramebuffers(2, fb);
printf("result: %u %u\n", fb[0], fb[1]);
return 0;
}
$ gcc -std=c99 -I/usr/X11/include test.c -o test -L/usr/X11/lib -lGL -lOSMesa
$./test
输出是result: 0 0
根据 http://www.opengl.org/wiki/GLAPI/glGenFramebuffers glGenFramebuffers() 应该设置 fb[0] 和 fb[1]。在我的例子中,我找不到解释实际结果的引用资料。我的真实代码的行为方式相同,所以我想这不是这里缺少某些初始化的问题。
我是做错了什么还是这是某种错误?
编辑:即使我有上下文,同样的事情也会发生。这是代码的更完整版本。
#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#include <GL/glx.h>
#include <GL/glext.h>
#include <xcb/xcb.h>
#include <X11/Xlib-xcb.h>
#include <stdio.h>
static Display *display;
static xcb_connection_t *connection;
static xcb_window_t window;
static GLXDrawable drawable;
static GLXContext context;
static GLuint fb[2];
int main(void)
{
display = XOpenDisplay(0);
if (!display) return 0;
int default_screen = XDefaultScreen(display);
connection = XGetXCBConnection(display);
if (!connection) goto error;
int visualID = 0;
XSetEventQueueOwner(display, XCBOwnsEventQueue);
// find XCB screen
xcb_screen_iterator_t screen_iter = xcb_setup_roots_iterator(xcb_get_setup(connection));
int screen_num = default_screen;
while (screen_iter.rem && screen_num > 0)
{
screen_num -= 1;
xcb_screen_next(&screen_iter);
}
xcb_screen_t *screen = screen_iter.data;
// query framebuffer configurations
GLXFBConfig *fb_configs = 0;
int num_fb_configs = 0;
fb_configs = glXGetFBConfigs(display, default_screen, &num_fb_configs);
if (!fb_configs || num_fb_configs == 0) goto error;
// select first framebuffer config and query visualID
GLXFBConfig fb_config = fb_configs[0];
glXGetFBConfigAttrib(display, fb_config, GLX_VISUAL_ID , &visualID);
// create OpenGL context
context = glXCreateNewContext(display, fb_config, GLX_RGBA_TYPE, 0, True);
if (!context) goto error;
// create XID's for colormap and window
xcb_colormap_t colormap = xcb_generate_id(connection);
window = xcb_generate_id(connection);
xcb_create_colormap(connection, XCB_COLORMAP_ALLOC_NONE, colormap, screen->root, visualID);
uint32_t eventmask = XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE;
uint32_t valuelist[] = {eventmask, colormap, 0};
uint32_t valuemask = XCB_CW_EVENT_MASK | XCB_CW_COLORMAP;
// TODO set window parameters
xcb_create_window(connection, XCB_COPY_FROM_PARENT, window, screen->root, 100, 0, 400, 300, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT, visualID, valuemask, valuelist);
// NOTE: window must be mapped before glXMakeContextCurrent
xcb_map_window(connection, window);
drawable = glXCreateWindow(display, fb_config, window, 0);
if (!window)
{
xcb_destroy_window(connection, window);
glXDestroyContext(display, context);
goto error;
}
// make OpenGL context current
if (!glXMakeContextCurrent(display, drawable, drawable, context))
{
xcb_destroy_window(connection, window);
glXDestroyContext(display, context);
goto error;
}
glGenFramebuffers(2, fb);
printf("%s\n", glGetString(GL_VERSION));
printf("%d %d\n", fb[0], fb[1]);
return 0;
error:
XCloseDisplay(display);
}
输出:
2.1 NVIDIA-7.32.12
0 0
MacOS X 10.7.5
NVIDIA GeForce 320M 256MB
$ gcc --version
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.1.00)
glGetString(GL_VERSION): 2.1 NVIDIA-7.32.12
最佳答案
调用该函数后检查 glGetError (...)
的值。在 2.1 上下文中很可能是 GL_INVALID_OPERATION
。您可以从 OS X 上的 GL 2.1 上下文调用 GL 3.x 函数,但它们将始终生成 GL_INVALID_OPERATION
。
情况与大多数其他平台截然不同,在其他平台中,函数指针是在运行时设置的。在 OS X 上,无论您拥有 GL 2.1 上下文还是 GL 3.2+ 核心,您都链接到同一个库,它包含 Apple 实现的每个 GL 版本的函数。这允许您调用未在您的上下文版本中实现的函数。但是,除了设置 GL_INVALID_OPERATION
之外,任何调用这些函数的尝试都不会在运行时产生任何影响。
要解决此问题,您需要使用 FBO 的 EXT
形式,或者获取 3.2+ 核心上下文。由于以后无法在 OS X 上使用 X11,因此您可能不得不使用扩展。我应该澄清一下,当我说使用 FBO 的扩展形式时,所有这些在 OS X 上实际上涉及的是将 glGenFramebuffers (...)
替换为 glGenFramebuffersEXT (...)
.您不必调用任何 *GetProcAddress (...)
函数。
或者,您可以使用 SDL 或 GLFW3 之类的框架,或者从 X11/GLX 迁移到 NSOpenGL (Obj-C) 或 CGL (C/C++)。在 OS X 上使用 native 接口(interface)而不是弃用的东西,如 AGL 或 X11/GLX 是获得 3.2 核心上下文的唯一方法。
关于c - MacOS X : unexpected behavior of glGenFramebuffers(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21240036/
一旦在 qconsole Marklogic 中运行以下代码,我就会遇到以下错误 XDMP-UNEXPECTED: (err:XPST0003) Unexpected token syntax err
我已经在我的包中编写了这个函数。 def partitionIntoDays(ls, number, lookupKey=None): ''' Partitions the location
我只是一个 android 初学者,我已经安装了 Android Studio(版本是 1.0.2),并创建了一个新的空白应用程序,按照名为“构建你的第一个应用程序”的官方教程,我学习到这个页面' h
这只是前几天工作,但我刚刚将我的代码更新到运行乘客 2.2.4 的审查服务器,而我的 2.3.4 rails 应用程序现在无法在那个盒子上启动。 乘客报告: Passenger encountered
我正在尝试使用带有 Angular 2的整页, 将其导入我的 app.module.ts 时出现以下错误。 "(SystemJS) Unexpected token ) at Obje
TFS2015 vNext 构建失败并出现记录器错误(下面附有错误消息)。根据我的调查,这看起来与 CentralLogger - "Microsoft.TeamFoundation.Distribu
计算机科学学校项目。我需要编写一个程序,其中用户声明数组的大小,然后以数字、非递减顺序填充数组,然后声明一个值 x。然后将 X 分配到适当的位置,以便整个数组按数字、非递减顺序排列。然后输出该数组。
在这 2 个方法中,inspect1 显示编译错误“Unexpected bound”而 inspect2 工作正常,为什么? public void inspect1(List u){ S
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我正在尝试运行以下代码,但遇到了“此时意外”错误。 (echo COPY (SELECT ta.colA as name, ta.colB as user_e, ta.colC as user_n,
我有以下查询: select u.UserName, count(*) as total from Voting v join User u using (UserID) where unique (
我们有以下查询在 MSSQL 中完美运行但在 MySQL 中无法运行: select CONVERT(datetime, dateVal) as DateOccurred, itemID, COUNT
我的代码中存在缩进错误问题。它看起来是正确的...有人能指出我做错了什么吗?我的查询行不断收到错误。 def invoice_details(myDeliveryID): conn = pym
我有以下代码: int a , b , sum; cin>>a>>b; sum=a+b; cout>a>>b>>c; cout<
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我在一个批处理文件上运行这个命令: for %I in (*.txt *.doc) do copy %I c:\test2 ...它不断返回: I was unexpected at this tim
创建查询时出现错误: 'from' unexpected 我的代码如下: @Override public Admin findByAdmin(Admin admin) {
我正在尝试运行此 python 代码,但我不断收到错误消息“意外缩进”。我不确定怎么了。间距似乎很好。有什么想法吗? services = ['Service1'] for service in
我在名为“circular_dependency”的目录中有一些 python 文件: 导入文件_1.py: from circular_dependency.import_file_2 import
我正在尝试使用 gcc 编译代码并运行可执行文件,但它抛出错误: gcc somefile.c -o somefile 编译成功。但是,当我尝试执行它时: $sh somefile 它导致:语法错误:
我是一名优秀的程序员,十分优秀!