小编lee*_*mes的帖子

在QGLFramebufferObject上渲染时,alpha混合错误

我为我的应用程序编写了一个基于OpenGL的矢量图形渲染器.它需要渲染到帧缓冲对象而不是直接渲染到屏幕.因为我在Qt中编写应用程序,所以我使用了QGLFramebufferObject,它是OpenGL帧缓冲对象的包装类.

我创建了一个最小的例子,它显示了在渲染更复杂的东西时我也得到的错误结果(例如使用片段着色器设置颜色与非一个alpha值).我只是在黑色清除的屏幕上渲染一个红色圆圈和一个半透明的绿色圆圈,然后在FBO上渲染相同:

void MainWidget::initializeGL()
{
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glClearColor(0, 0, 0, 0);
}

void MainWidget::resizeGL(int w, int h)
{
    glViewport(0, 0, w, h);
}

void MainWidget::paintGL()
{
    // DRAW ON THE SCREEN
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glPointSize(100);
        glEnable(GL_POINT_SMOOTH);
        glBegin(GL_POINTS);
        glColor4f(1, 0, 0, 1);
        glVertex2f(-.2, 0);
        glColor4f(0, 1, 0, .5);
        glVertex2f( .2, 0);
        glEnd();
    }

    QGLFramebufferObject fbo(width(), height());
    fbo.bind();

    // DRAW ON THE FBO USING THE SAME CODE AND THE SAME CONTEXT
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glPointSize(100);
        glEnable(GL_POINT_SMOOTH);
        glBegin(GL_POINTS);
        glColor4f(1, 0, 0, 1);
        glVertex2f(-.2, 0); …
Run Code Online (Sandbox Code Playgroud)

opengl qt

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

具有富文本的 QML 文本元素:如何调整 <img> 的垂直位置

我有一个 Text 元素,其中包含一些包含<img>标签的 HTML 内容。我想调整该图像的基线,因为它显示光栅化乳胶数学公式。检测图像内的基线是另一项任务。这个问题是当我知道需要移动图像多少像素时如何调整图像的垂直位置。

在 HTML 中,我可以使用相对定位。由于 Qt 仅支持CSS 的子集,因此我必须使用不同的 CSS 属性。然而,当使用 QML 文本元素显示 HTML 时,它们似乎都不起作用怎么了?

Text {
    text: 'test <img style="padding: 100px" src="latex/182.png"/>'
}
Run Code Online (Sandbox Code Playgroud)

与省略样式属性相比,这显示完全相同。就像 QML 忽略样式属性一样。QML 是否使用另一个(甚至更小的)HTML 引擎?

我已经发现图像仅在“富文本”模式下受支持(还有“样式文本”模式,该模式不支持图像,但支持其他 HTML 标签,如<b><i>)。

html css qt qml

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

在cpp中将字符串转换为_T

我想转换string或者char*_T,但无法做到.

如果我写

_tcscpy(cmdline,_T ("hello world")); 
Run Code Online (Sandbox Code Playgroud)

它完美无缺,但如果我写的话

char* msg="hello world";
_tcscpy(cmdline,_T (msg));
Run Code Online (Sandbox Code Playgroud)

它显示如下错误: error C2065: 'Lmsg' : undeclared identifier

请给我一个解决方案.

Thanx提前.

c++ windows

4
推荐指数
1
解决办法
9609
查看次数

null终止char(\ 0)和`^ @`之间的区别

我的代码是这样的:

#include <iostream>
using std::cout;
using std::endl;

int main(int argc, char *argv[])
{
    cout << (int)('\0') << endl;
    cout << (char)(0) << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望在终端看到这样的:

$ test-program
0

$ 
Run Code Online (Sandbox Code Playgroud)

但是,我看到的是这样的:

$ test-program
0
^@
$
Run Code Online (Sandbox Code Playgroud)

令我困惑的是,我认为'\0'可以转换为0.并且0还可以投入\0.我希望看到一个null char跟随a endl,但结果是奇怪的^@.

有没有人有这个想法?

c c++ arrays string char

4
推荐指数
2
解决办法
894
查看次数

浮点计算使用float而不是double来得到不同的结果

我有以下代码行.

hero->onBeingHit(ENEMY_ATTACK_POINT * (1.0 - hero->getDefensePercent()));
Run Code Online (Sandbox Code Playgroud)
  • void onBeingHit(int decHP) 方法接受整数并更新健康点.
  • float getDefensePercent() method是一个getter方法,返回英雄的防御百分比.
  • ENEMY_ATTACK_POINT是一个定义为的宏常数因子#define ENEMY_ATTACK_POINT 20.

让我们说hero->getDefensePercent()回报0.1.所以计算是

20 * (1.0 - 0.1)  =  20 * (0.9)  =  18
Run Code Online (Sandbox Code Playgroud)

每当我尝试使用以下代码时(无f附加1.0)

hero->onBeingHit(ENEMY_ATTACK_POINT * (1.0 - hero->getDefensePercent()));
Run Code Online (Sandbox Code Playgroud)

17岁了.

但是对于以下代码(f后面附后1.0)

hero->onBeingHit(ENEMY_ATTACK_POINT * (1.0f - hero->getDefensePercent()));
Run Code Online (Sandbox Code Playgroud)

18岁了.

这是怎么回事?是f显著要不惜任何虽然hero->getDefensePercent()已在浮动?

c++ floating-point double floating-accuracy

4
推荐指数
1
解决办法
4187
查看次数

尽管使用静态unique_ptr进行析构函数调用,但内存泄漏

unique_ptr用作静态数据成员来保存指针.

struct Test
{
    int i;
    ~Test()
    {
        cout << "destructed" << endl;
    }
};

struct S
{
    static unique_ptr<Test> te;
};
unique_ptr<Test> S::te = unique_ptr<Test>(new Test());
Run Code Online (Sandbox Code Playgroud)

程序终止S::te被破坏,调用Test-destructor.

但_CrtDumpMemoryLeaks向我显示内存泄漏,其内存位置S::te.get()是指向(破坏的)Test对象的指针.

我不明白这种行为.

我不能用静电unique_ptr吗?尽管unique_ptr实现调用析构函数,为什么会出现泄漏?

c++ static memory-leaks unique-ptr

4
推荐指数
1
解决办法
1369
查看次数

如何将unique_ptr用于数组

我上课了

class A {
public:
  A(){cout<<"C";}
  ~A(){cout<<"D";}
};
int main(){
  unique_ptr<A> a(new A[5]); // - doesn't work 
  unique_ptr<A> a(new A[1]); // - doesn't work
  unique_ptr<A> a(new A); // - works
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

我想这是关于移动构造函数(由于析构函数不能自动创建),但为什么我们需要一个移动构造函数呢?

有什么区别:

unique_ptr<A> a(new A[1]); // - doesn't work
unique_ptr<A> a(new A); // -works
Run Code Online (Sandbox Code Playgroud)

c++ unique-ptr move-constructor

4
推荐指数
1
解决办法
104
查看次数

C++如何对右值引用进行模板推导?

template<typename T>
void foo(T&& arg);
Run Code Online (Sandbox Code Playgroud)

我知道 arg 是否是左值,例如int x = 0; foo(x);thenT = int&并且函数将为foo(int& &&),即foo(int&).

如果 arg 是一个右值,例如foo(0);然后T = int,函数将是foo(int&&).

如果我有

template<typename T>
void foo(T& arg);

template<typename U>
void bar(U&& u)
{
    foo(u);
}
Run Code Online (Sandbox Code Playgroud)

是什么Tfoo打电话时bar(0)

c++ templates rvalue-reference

4
推荐指数
1
解决办法
230
查看次数

使用即时计算的临时值为ForwardIterator实现成员访问操作符 - >

我正在为适配器范围实现一个迭代器,它可以懒惰地评估原始范围内的某些东西.这意味着:取消引用迭代器应取消引用底层迭代器并对结果应用一些操作,然后返回该操作的结果.

T operator*() const {
    return someOperation(*original_iterator);
}
Run Code Online (Sandbox Code Playgroud)

operator->该如何实现类似的operator*呢?在查看其他迭代器的实现时,它们通常返回一个T*.但是我无法返回指针,因为"指向对象"是一个临时的,即时计算的.

在这种情况下通常的指导是什么?我可以简单地回来T吗?

虽然我个人不需要这个操作符(我也可以使用(*i).m而不是i->m标准算法似乎也不依赖于它们->),我希望我的迭代器严格遵循这个ForwardIterator概念,这个概念InputIterator需要特殊化.这个运营商的实施.

c++ iterator operator-overloading

4
推荐指数
1
解决办法
463
查看次数

在创建对象时理解{...}的含义

我遇到了以下代码

#include <iterator>
#include <string>
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>

int main() {

    std::string inputfilename, outputfilename;

    std::cin  >> outputfilename;

    std::ofstream outputfile{ outputfilename };

    outputfile << "I exist Yo!";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的第一反应是它不应该编译.我从未见过outputfile{ outputfilename };语法.有人可以告诉我C++语言的哪些特性定义了{...}这行代码中的行为?

PS代码可以正常运行.

c++ c++11

4
推荐指数
1
解决办法
205
查看次数