在64位Ubuntu 14.04 LTS上,我正在尝试编译一个使用过剩的简单OpenGL程序.我在main中执行任何代码行之前得到了一个Segmentation Fault(SIGSEV); 即使是在一个非常简单的测试计划上.什么可能导致这个?
我的命令行:
g ++ -Wall -g main.cpp -lglut -lGL -lGLU -o main
我的简单测试案例:
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <string>
#include <cstdio>
int main(int argc, char** argv){
printf("Started\n");
std::string dummy = "hello";
glutInit(&argc, argv);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行程序时,main开头的printf不会在segfault之前执行.在GDB下,我在segfault之后得到了这个回溯
#0 0x0000000000000000 in ?? ()
#1 0x00007ffff3488291 in init () at dlerror.c:177
#2 0x00007ffff34886d7 in _dlerror_run (operate=operate@entry=0x7ffff3488130 <dlsym_doit>, args=args@entry=0x7fffffffddf0) at dlerror.c:129
#3 0x00007ffff3488198 in __dlsym (handle=<optimized out>, name=<optimized out>) at dlsym.c:70
#4 0x00007ffff702628e in ?? () from …Run Code Online (Sandbox Code Playgroud) 我想在Lua中使用一次写入表(特别是LuaJIT 2.0.3),这样:
local tbl = write_once_tbl()
tbl["a"] = 'foo'
tbl["b"] = 'bar'
tbl["a"] = 'baz' -- asserts false
Run Code Online (Sandbox Code Playgroud)
理想情况下,这将像常规表(pairs()和ipairs()工作)一样运行.
__newindex基本上与我想要实现它的方法相反,我不知道任何使用pair()和ipairs()使代理表模式工作的技术.
我有一个模板函数(在我的例子中是一个 cuda 内核),其中有少量布尔模板参数可以在运行时选择。我很高兴在编译时实例化所有排列并动态调度,就像这样(对于布尔值 b0、b1、b2):
if (b0) {
if (b1) {
if (b2) {
myFunc<true,true,true,otherArgs>(args);
} else {
myFunc<true,true,false,otherArgs>(args);
}
} else {
if(b2) {
myFunc<true,false,true,otherArgs>(args);
} else {
myFunc<true,false,false,otherArgs>(args);
}
}
} else {
if(b1) {
if(b2) {
myFunc<false,true,true,otherArgs>(args);
} else {
myFunc<false,true,false,otherArgs>(args);
}
} else {
if(b2) {
myFunc<false,false,true,otherArgs>(args);
} else {
myFunc<false,false,false,otherArgs>(args);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这写起来很烦人,如果我最终得到 b3 和 b4,情况会变得更糟。
有没有一种简单的方法可以在 C++11/14 中以更简洁的方式重写它而不引入大型外部库(如 boost)?就像是:
const auto dispatcher = construct_dispatcher<bool, 3>(myFunc);
Run Code Online (Sandbox Code Playgroud)
...
dispatcher(b0,b1,b2,otherArgs,args);
Run Code Online (Sandbox Code Playgroud) 我有一个OpenGL纹理,并希望能够读回单个像素的值,所以我可以在屏幕上显示它.如果纹理是常规的旧RGB纹理等,这是没有问题的:我采用一个空的Framebuffer对象,我已经躺在周围,将纹理附加到帧缓冲区上的COLOR0并调用:
glReadPixels(x, y, 1, 1, GL_RGBA, GL_FLOAT, &c);
Run Code Online (Sandbox Code Playgroud)
其中c基本上是浮子[4].
但是,当它是深度纹理时,我必须沿着不同的代码路径,设置DEPTH附件而不是COLOR0,并调用:
glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &c);
Run Code Online (Sandbox Code Playgroud)
其中c是浮点数.这在运行NVIDIA GeForce 580的Windows 7计算机上运行良好,但在我的旧版2008 MacBook Pro上出错.具体来说,在将深度纹理附加到帧缓冲区后,如果我调用glCheckFrameBufferStatus(GL_READ_BUFFER),我会得到GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER.
搜索OpenGL的文档后,我发现这条线,这似乎意味着,OpenGL的不不支持从帧缓冲区的深度分量阅读,如果没有附色:
GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER is returned if GL_READ_BUFFER is not GL_NONE
and the value of GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is GL_NONE for the color
attachment point named by GL_READ_BUFFER.
Run Code Online (Sandbox Code Playgroud)
果然,如果我创建一个临时颜色纹理并将其绑定到COLOR0,当我从深度纹理读取像素时不会发生错误.
现在通过这段代码每次创建一个临时纹理(编辑:甚至一次并将GPU内存绑定)都很烦人且可能很慢,所以我想知道是否有人知道从深度读取单个像素的替代方法质地?(当然,如果没有更好的方法,我会保留一个纹理,以便在需要时调整大小,并仅使用临时颜色附件,但这似乎相当迂回).