- 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/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!