【问题标题】:What is the best practice for drawing polylines with different colors绘制不同颜色的折线的最佳做法是什么
【发布时间】:2014-02-13 17:00:03
【问题描述】:

我想画折线,每条线由不同数量的点组成,每条线都有自己的颜色。

在这种情况下,最佳实践是什么 - 我应该如何收集信息并将其发送到 GPU?

【问题讨论】:

  • 你想在一次绘制调用中绘制它们?
  • 这基本上是个问题——我应该如何画它们?在一次调用中,每条折线都在其自己的 glDrawArrays 调用中(这就是我现在正在做的事情)
  • 如何使用一个小纹理,每个像素每行有一种颜色。然后只需将纹理坐标添加到您的顶点数据。例如,您创建一个 128x1 纹理,填充颜色并具有纹理坐标,如 (1/128*(0-.5), .5), (1/128*(1-.5), .5), (1 /128*(2-.5), .5)...

标签: graphics opengl-es 3d opengl-es-2.0


【解决方案1】:

将所有片段分解为GL_LINES,并通过一个glDrawArrays()/glDrawElements() 调用来渲染它们。

对于glDrawElements() 的情况,您可以像这样分解条带:

#include <vector>
using namespace std;

#include <glm/glm.hpp>
using namespace glm;

struct LineBatch
{
    void AddStrip( const vector< vec2 >& strip, const vec3& color )
    {
        if( strip.size() < 2 )
            return;

        for( size_t i = 1; i < strip.size(); ++i )
        {
            indices.push_back( (GLushort)verts.size() + (GLushort)(i-1) );
            indices.push_back( (GLushort)verts.size() + (GLushort)(i-0) );
        }

        for( size_t i = 0; i < strip.size(); ++i )
        {
            Vertex temp;
            temp.pos = strip[i];
            temp.color = color;
            verts.push_back( temp );
        }
    }

    void Render()
    {
        ...
        glDrawElements( GL_LINES, indices.size(), GL_UNSIGNED_SHORT, &indices[0] );
        ...
    }

private:
    struct Vertex
    {
        vec2 pos;
        vec3 color;
    };
    vector< Vertex > verts;
    vector< GLushort > indices;
};

【讨论】:

  • 这实际上是 OpenGL ES 2.0,所以我相信 glMultiDrawElements 不受支持。如果我将使用 GL_LINES,我将不得不复制每个顶点而不是折线边缘之一,不是吗?原始重启是什么意思?
  • Primitive restart 不在 ES 2.0 中,所以也没有了。
  • 您必须为glDrawArrays() 的情况复制顶点。对于glDrawElements(),您只需复制索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 2016-06-28
  • 2020-05-09
相关资源
最近更新 更多