小编Mik*_*x7f的帖子

使用glut和std :: string时main()之前的分段错误?

在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)

c++ opengl glut glu

19
推荐指数
1
解决办法
3786
查看次数

在lua写一次表?

我想在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()使代理表模式工作的技术.

lua luajit lua-table

5
推荐指数
1
解决办法
105
查看次数

动态调度到模板函数 C++

我有一个模板函数(在我的例子中是一个 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)

c++ templates c++11

5
推荐指数
1
解决办法
616
查看次数

如何有效地从深度纹理中读取像素?

我有一个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内存绑定)都很烦人且可能很慢,所以我想知道是否有人知道从深度读取单个像素的替代方法质地?(当然,如果没有更好的方法,我会保留一个纹理,以便在需要时调整大小,并仅使用临时颜色附件,但这似乎相当迂回).

opengl

3
推荐指数
1
解决办法
1703
查看次数

标签 统计

c++ ×2

opengl ×2

c++11 ×1

glu ×1

glut ×1

lua ×1

lua-table ×1

luajit ×1

templates ×1