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

ofSetColor does not change color when drawing to an ofFbo (using 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);
}

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

破例

现在我在 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);
}

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

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

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

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

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

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

颜色的r值越小,颜色越深。这就是为什么调用 ofSetColor(0, 255, 0, 255); 使正方形完全变黑的原因。

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

在绘制 fbo 之前,您必须调用 ofSetColor(255, 255, 255, 255);ofSetColor(255);ofSetColor(ofColor::white);(都一样)。

目前正在与上一个ofSetColor(...);画图。

在 openFrameworks 中绘制任何纹理也是如此。例如,如果您调用

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

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