小编lee*_*mes的帖子

在Qt3D中对QGLView(不是QGLWidget)进行覆盖和后期渲染效果

我目前正在使用Qt3D模块在C++/Qt5中编写游戏.

我可以在QGLView上渲染场景(QGLSceneNodes),但现在我不得不用一些GUI元素重复绘制场景.我还没有决定是否使用QML或C++来定义界面的外观,所以我愿意接受两者的解决方案.(注意,QML模块称为QtQuick3D,C++模块称为Qt3D,它们都是Qt5的一部分.)

我非常喜欢基于QML的解决方案.

我该如何做一些过度涂色?

必须具备以下条件:

  • 在给定的屏幕坐标处绘制2D项目(图像),当然还支持alpha通道.
  • 使用系统字体绘制文本,可能首先在图像上绘制并在Qt3D OpenGL上下文中将其用作纹理.
  • 对屏幕坐标中的鼠标输入作出反应(与3D场景对象拾取相反).

我认为这只是使用另一个QGLSceneNode用于2D GUI部分.但是我认为定位和定向一些场景节点以便在渲染期间(使用顶点着色器)重新定位和重新定位没有意义,引入数值误差并且看起来效率低下.

是否正确使用另一个"GUI"顶点着色器?

(如何)我可以一起制作后期渲染效果和重复绘画?

如果我可以执行以下后期渲染效果,那将是非常好的:

  • 读取先前渲染的场景,应用一些2D图像效果(我可以设想将它们实现为片段着色器,并使用此效果着色器在最终屏幕上渲染先前渲染的缓冲区).这使我能够使GUI的某些部分看起来像具有模糊效果的玻璃.
  • 一些更高级的效果可以使场景看起来更逼真:深度和运动模糊,依赖于热量的空气闪烁,发光效果.它们都可以使用片段着色器(不应该是问题的一部分)和渲染时间内的附加缓冲区来描述.它们应该放在主屏幕渲染过程和GUI重绘之间,这就是我将它包含在这个问题中的原因.

当我使用特殊的着色器程序实现重绘时,我发现了一个问题:我无法访问GUI后面的像素来应用高斯模糊等效果,使GUI看起来像玻璃.我必须将场景渲染到另一个缓冲区而不是QGLView.这是我的主要问题......

c++ opengl qml qt5 qt3d

13
推荐指数
1
解决办法
2862
查看次数

Variadic模板功能:专门的头/尾和空基座

我想在类中有一个可变参数模板函数.可变参数模板参数是字符,应该以类似循环的方式处理.所以我想把它写成haskell,头部/尾部分割列表,直到达到基本情况(空列表).

举个例子,让我们只计算给出的参数数量(只是一个最小的例子).

我想出了以下代码:

struct MyClass {
    template<char ...X>
    static int count();
};


template<>
int MyClass::count<>() {
    return 0;
}
template<char Head, char ...Tail>
int MyClass::count<Head, Tail...>() {
    return 1 + count<Tail...>();
}
Run Code Online (Sandbox Code Playgroud)

但是,这似乎不起作用:

prog.cpp:12:35: error: function template partial specialization ‘count<Head, Tail ...>’ is not allowed
prog.cpp:12:5: error: prototype for ‘int MyClass::count()’ does not match any in class ‘MyClass’
prog.cpp:3:16: error: candidate is: template<char ...X> static int MyClass::count()
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我知道功能不支持部分特化.但我认为将变量模板专门设计为头/尾和空基本案例版本不是局部专业化而是完全专业化,但也许我错了?我是否需要将其写为类而不是函数?

我发现了一些示例(printf),它们在不使用模板语法的情况下实现了基本情况.但我想我的情况有所不同,因为对printf的调用不使用模板语法而是类型推导,所以printf(tail...)调用printf() …

c++ templates template-meta-programming variadic-templates c++11

13
推荐指数
1
解决办法
3225
查看次数

qDebug不打印包含二进制数据的完整QByteArray

我有一个QByteArray存储从GPS接收的数据,这是部分二进制和部分ASCII.我想知道调试提案知道收到了什么,所以我写的qDebug是这样的:

//QByteArray buffer;
//...
qDebug() << "GNSS msg (" << buffer.size() << "): " << buffer;
Run Code Online (Sandbox Code Playgroud)

我在控制台上收到这样的消息:

GNSS msg ( 1774 ): "ygnnsdgk...(many data)..PR085hlHJGOLH
(more data into a new line, which is OK because it is a new GNSS sentence and
probably has a \n at the end of each one) blablabla...
Run Code Online (Sandbox Code Playgroud)

但突然间我得到了一个新的打印迭代.数据尚未删除,已附加.所以新的消息大小例如3204,明显比之前的打印大.但它打印完全相同(但括号之间的新尺寸3204).没有打印新数据,只是与上一条消息相同:

GNSS msg ( 3204 ): "ygnnsdgk...(many data)..PR085hlHJGOLH
(more data into a new line, which is OK because it is a new GNSS sentence …
Run Code Online (Sandbox Code Playgroud)

c++ qt qdebug qbytearray

12
推荐指数
1
解决办法
1万
查看次数

EASTL表现

今天我下载并创建了一个Electronic Arts STL实现的示例项目,EA的矢量看起来比标准慢得多.我刚创建了2个向量并上传了100万个项目:

void performance_test(void)
{
    clock_t start;
    clock_t end;


    // EA

    eastl::string strEA = "hello";
    eastl::vector<eastl::string> vec_EA;

    start = clock();
    for (size_t i = 0; i < 1000000; i++)
    {
        vec_EA.push_back(strEA);
    }

    end = clock();
    printf("EA       %f\n", (double(end - start) / 1000));

    // Standard

    std::string strStandard = "hello";
    std::vector<std::string> vec_Standard;

    start = clock();
    for (size_t i = 0; i < 1000000; i++)
    {
        vec_Standard.push_back(strStandard);
    }

    end = clock();
    printf("Standard %f\n", (double(end - start) / 1000));
}
Run Code Online (Sandbox Code Playgroud)

结果是:

  1. EA 0.759000 …

c++ templates stl eastl

12
推荐指数
1
解决办法
8196
查看次数

有效地读取XBMC呈现的屏幕内容的平均颜色

我想在运行XBMC时获得屏幕内容的平均颜色,以更改电视环境光的颜色.XBMC运行在一个小型HTPC上,OpenGL ES 2.0硬件(Raspberry Pi)运行Debian派生的发行版.我想我必须从XBMC使用OpenGL绘制的屏幕帧缓冲区中读取.(至少,我认为并希望XBMC使用OpenGL呈现所有内容.)

是否可以读取代表整个屏幕输出的OpenGL帧缓冲区?我需要访问它什么?我是否还需要一个自己的渲染上下文来访问屏幕的帧缓冲区?(我不会自己渲染任何东西到屏幕上,我只想阅读).

有效地计算平均颜色是下一个任务.我正在考虑每行/每列读取第8或第16个像素(足够,我们正在讨论1080p高清电影),然后计算CPU上的平均值.欢迎任何有关更好解决方案的想法.

linux opengl-es framebuffer screen-capture

11
推荐指数
1
解决办法
1649
查看次数

10
推荐指数
2
解决办法
569
查看次数

返回C++ lambda的类型

我正在编写一个模板函数,它将一个函数对象(现在是一个lambda)作为参数,使用lambda数据类型作为模板参数,并返回lambda返回的相同类型.像这样:

template<typename TFunctor, typename TReturn>
TReturn MyFunc(TFunctor &Func, TReturn) //The second arg is just to keep the template spec happy
{
    return Func();
}
Run Code Online (Sandbox Code Playgroud)

消费代码如下:

int n = MyFunc([](){return 17;}, int());
Run Code Online (Sandbox Code Playgroud)

我不喜欢指定返回数据类型的丑陋方式.在编译器生成的lambda类中是否有一些内置的typedef会给我它的返回类型?所以MyFunc可以这样:

template<typename TFunctor>
TFunctor::return_type MyFunc(TFunctor &Func)
{ //...
Run Code Online (Sandbox Code Playgroud)

我希望它返回lambda返回的相同类型,而不显式拼写该类型.

编辑:目前,我所关注的所有lambda都没有争议.变量捕获也可以做到这一点.

c++ lambda c++11

10
推荐指数
1
解决办法
4312
查看次数

初始化列表中的const引用成员的初始化

我正在玩一些无用的代码来理解成员引用的初始化,并碰到了这个:

struct A {};

struct B
{
    B() : a()
    {
    }

    const A& a;
};
Run Code Online (Sandbox Code Playgroud)

使用gcc 4.9.2编译时,上面的代码给出以下错误:

In constructor 'B::B()':
error: value-initialization of reference type 'const A&'
  B() : a()
Run Code Online (Sandbox Code Playgroud)

我明白了

但是如果我在B的​​构造函数的初始化列表中使用统一初始化,就像这样:

struct A {};

struct B
{
    B() : a{}
    {
    }

    const A& a;
};
Run Code Online (Sandbox Code Playgroud)

它汇编很好.

所以问题是,为什么在这里使用统一初始化会改变编译结果?

我也尝试使用Microsoft Visual C++ 2013.它不编译任何版本的代码,并使用相同的错误消息:

Error 3 error C2440: 'initializing' : cannot convert from 'int' to 'const A & 
Run Code Online (Sandbox Code Playgroud)

你可以在这里快速玩它:

http://ideone.com/7f2t8I

c++ gcc initialization reference initializer-list

10
推荐指数
1
解决办法
1245
查看次数

将文件放在FTP站点上,其中包含来自字符串变量的内容(无本地文件)

我想将文件上传到FTP服务器,但文件内容保存在变量中,而不是实际的本地文件中.我想避免使用文件; 这是为了避免在(可能)不那么安全的系统(*)上处理敏感数据时的安全风险,以及最小化文件处理(已经很低)的开销.

但PHP的FTP API仅提供通过函数从本地文件上传文件ftp_put或(当文件已作为文件句柄打开时)ftp_fput.

目前,我将此函数与临时文件一起使用,我在上传之前编写内容:

$tmpfile = tmpfile();
fwrite($tmpfile, $content);
fseek($tmpfile, 0);
ftp_fput($ftp, $filename, $tmpfile, FTP_BINARY);
Run Code Online (Sandbox Code Playgroud)

有没有在本地(PHP)网站上使用文件的简单方法?

ftp_raw可以用来发送任意命令,所以我可以PUT手动发出命令,但是我没有看到在数据通道上手动写入数据的方法......

我不知道它是否重要,但FTP连接是用SSL(ftp_ssl_connect)保护的.


(*)考虑攻击者对整个文件系统具有只读控制的情况.

php ftp

10
推荐指数
1
解决办法
5095
查看次数

linux/X11中的"无缝"多用户会话

目标

我希望拥有一个多用户系统(基于Linux),只使用一个带有多个屏幕的X11会话和一对鼠标和键盘.因此,两个(或更多)人可以使用相同的计算机共享不仅相同的硬件而且共享相同的"屏幕"(当然,它将被分成两个物理屏幕,但您可以将窗口移动到您的伙伴身上. ..).共享窗口不仅可以更方便地"显示"您的合作伙伴您所做的事情 - 如果用户A开始使用复杂的应用程序处理某些事情(断言保存文件并打开它们不方便另一个会话)将应用程序的窗口移动到用户B应该就像在自己的屏幕中移动窗口一样简单.这就是我称之为"无缝"多用户会话的原因.

可能的解决方案

我在这篇文章中读到了X11"多座位",它没有我想要的功能.它为每个用户使用会话而不是一个会话.

我发现XI2又名Xinput2,它提供了多指针支持.这允许具有由两只小鼠控制的两个单独的鼠标指针.我读到你可以为两只鼠标分配两个键盘,提供独立的焦点和文本输入.但我想知道剪贴板("真实"和"鼠标中键"剪贴板)是否也被单独处理......我发现只有少数关于XI2多指针功能但没有"现场报告"的信息.

另一个完全不同的想法是在计算机上有两个独立的X11会话,但在两个会话之间使用X11-forward共享窗口.但是:据我所知,你不能共享一个转发X11的窗口,以便用户A运行一个应用程序,当它运行时,将窗口发送给用户B.据我所知,只有用户B可以在硬件上运行一个应用程序用户A并在其自己的X11会话上显示窗口.那也不是我想要的......或者我错了,可以在应用程序启动后通过X11转发转发窗口吗?

编辑:我刚刚发现XPRA类似于X11转发,但允许从/向X11会话分离和附加正在运行的应用程序.我现在试一试.

完成任何其他想法?

linux x11 xinput

9
推荐指数
1
解决办法
2726
查看次数