【问题标题】:OpenGl rotating triangles have some bad effectsOpenGL旋转三角形有一些不好的影响
【发布时间】:2014-11-06 08:11:02
【问题描述】:

我写了一个代码来在屏幕上绘制 10 个黄色三角形并旋转它们以像这样动画我将在下面添加 2 帧:

这一切都很好,但是当我添加大约 800 个矩形时,我看到了:

如果我有 500 个三角形,我会看到以下问题:

如你所见,我什至没有这些颜色。 (我只有黑色和黄色。)实际上,您可以看到任何颜色,具体取决于三角形的数量。我认为这是一些OpenGL问题。我是 OpenGL 的新手,我想我在 OpenGL 中滥用了一些东西。这是代码。它在 cocos2d-x (C++) 中,但您肯定可以理解这里的操作:

Color4F color1e(239.0f / 255, 255.0f / 255, 138.0f / 255, 1);

auto sunNode = DrawNode::create();
sunNode->setContentSize(_size);

int bansCount = 1000;
Vec2 center(_size / 2);

float angleStep = (2 * 3.1415926) / bansCount;

auto rotated = [angleStep, center](float mult) {
Vec2 vc(0, 0);
vc.rotate(center, angleStep * mult);
return vc - center;
};

for(int i = 0; i < bansCount; i+=2) {
   sunNode->drawTriangle(
   Vec2(0,0), // vertex 1
    rotated(i), // vertex 2
    rotated(i + 1), // vertex 3
    color1e // color of vertices
);
}

addChild(sunNode, 2); // add to sceen
sunNode->setPosition(center); // position on center

// infinitely rotate 
sunNode->runAction(RepeatForever::create(RotateBy::create(0.05, 3.1415926 / 10)));

完整代码在这里,如果有人想查看或实验:https://github.com/jonyrock/Cocos2dxDrawingArtifacts

【问题讨论】:

    标签: c++ opengl cocos2d-x cocos2d-x-3.0


    【解决方案1】:

    干涉图案是正常的,它的发生是因为边缘被量化(到一个像素或某个子像素固定值)并且步骤创建的干涉图案的频率比步进频率本身低得多。

    颜色不正常,我可以想到两种可能:

    • 使用非饱和 RGB 颜色和类似“cleartype”的技术,尝试使用单独的亚像素 LED 强度值来提高分辨率(这可能与干涉图案相互作用)

    • 一个错误

    如果是第一种情况,则使用纯红色、纯绿色或纯蓝色等

    Color4F color1e(255.0f / 255, 0.0f / 255, 0.0f / 255, 1); // Pure red
    

    不应引入额外的颜色。

    【讨论】:

    • 感谢您的回复。我的问题是我不应该看到的颜色。但是除了“错误”之外,我无法理解您的意思。 :) 对不起,我真的很新,我不知道什么是亚像素,什么是 clearview,什么是非饱和 RGB。更简单的是什么会导致这个问题?以及如何解决这个问题?
    • @Narek:对不起......这个想法的微软名称是“cleartype”而不是“clearview”。即使在渲染灰度图形时也使用不同的 R、G 和 B 值来提高空间分辨率。
    • 我应该提到这是 OpenGL ES,它发生在 iOS、Android 和 Linux 上。我希望这些信息能告诉你更多。
    • @Narek:那么 IMO 我们只剩下选项 2 了:-D
    • 你说的完全正确!这是错误报告:cocos2d-x.org/issues/5573 我尝试过不使用DrawNode,它成功了。
    【解决方案2】:

    您看到的图案显然是您尝试绘制的图案的结果,其结构比显示器所能解析的更精细(即您违反了所谓的奈奎斯特限制)。这会导致所谓的“混叠波纹”图案。您看到的颜色可能是混叠图案中混合伪影的结果,或者如果通过渗入子像素(其中监视器的像素结构用于人为地提高分辨率)启用抗锯齿。无论如何,问题出在这样一个事实,即您的模式具有比目标帧缓冲区能够解决的更高的空间分辨率。

    【讨论】:

    • 介意,链接技术术语吗?
    • @Domi:介意使用谷歌吗?抱歉,但每个术语都有很多文本,我认为没有理由为每个术语放置非常具体的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多