绘制到ofFbo时,ofSetColor不会改变颜色(使用openFrameworks)

时间:2017-11-29 19:34:51

标签: c++ openframeworks

首先,我将举例说明我希望它做的事情。然后我将给出一个导致问题的小改动的第二个例子。

工作示例

ofApp.h

#pragma once

#include "ofMain.h"

class ofApp : public ofBaseApp {
  public:
    void setup();
    void draw();

    ofFbo fbo;
};

ofApp.cc

#include "ofApp.h"

void ofApp::setup() {
  fbo.allocate(200, 100, GL_RGBA);
}

void ofApp::draw() {
  // Draw a red square to the FBO
  fbo.begin();
  ofClear(255,255,255, 0);
  ofSetColor(255, 0, 0, 255);
  ofDrawRectangle(100, 0, 100, 100);
  fbo.end();

  fbo.draw(0, 0);
}

这会导致以下红色方块被绘制到屏幕上:

working example of red square

破碎的例子

现在我在draw方法的顶部添加两行,但我没有得到我期望的结果。以下是ofApp.cc的完整代码:

#include "ofApp.h"

void ofApp::setup() {
  fbo.allocate(200, 100, GL_RGBA);
}

void ofApp::draw() {
  // Draw a blue square directly to screen
  ofSetColor(0, 0, 255, 255);
  ofDrawRectangle(0, 0, 100, 100);

  // Draw a red square to the FBO
  fbo.begin();
  ofClear(255,255,255, 0);
  ofSetColor(255, 0, 0, 255);
  ofDrawRectangle(100, 0, 100, 100);
  fbo.end();

  fbo.draw(0, 0);
}

我希望得到一个蓝色方块(直接绘制到窗口)和一个红色方块(绘制到FBO)。但红色方块变黑了:

broken example with blue and black square

似乎在绘制到FBO之前调用ofSetColor会导致绘制到FBO的所有内容都变黑。这是怎么回事?

2 个答案:

答案 0 :(得分:1)

我认为这可能是一个错误。

也许您可以在https://github.com/openframeworks/openFrameworks/issues

上发布此内容

但是,在ofSetColor(255, 255, 255, 255);之前调用fbo.draw(0, 0);似乎可以解决问题。

我认为调用ofSetColor会以一种奇怪的方式影响FBO的颜色。 例如,如果您在ofSetColor(150, 0, 0, 255);之前拨打fbo.draw(0, 0);,则FBO会绘制一个较暗的红色方块。

减少颜色的r值越多,它就越暗。这就是为什么调用ofSetColor(0, 255, 0, 255);使方块完全变黑。

也许有人可以更好地解释为什么会这样。但是,ofSetColor(255, 255, 255, 255);之前调用fbo.draw(0, 0);似乎无法解决问题。

答案 1 :(得分:1)

在绘制fbo之前,您必须先致电ofSetColor(255, 255, 255, 255);ofSetColor(255);ofSetColor(ofColor::white);(所有相同)。

目前正在使用之前的ofSetColor(...);进行绘制。

在openFrameworks中绘制任何纹理都是一样的。例如,如果你打电话

ofSetColor(255, 255, 0);
myTexture.draw(0, 0);

您的纹理将以黄色调绘制。