1

OpenGL でこのパターンを描画しようとしています:

ここに画像の説明を入力

これを取得するために、次のようなパターンを作成しました。

vector< vector<DataPoint> > datas;
float Intensitytemp=0;
float xPos=0, yPos=0, angleInRadians=0;
for (float theta = 0.0f; theta < 4096; theta += 1.f)
{
    vector<DataPoint> temp;
    angleInRadians = 2 * M_PI*theta / 4096;
    for (float r = 0; r < 4096; r += 1.f)
    {
        xPos = cos(angleInRadians)*r / 4096;
        yPos = sin(angleInRadians)*r / 4096;
        Intensitytemp = ((float)((int)r % 256)) / 255;
        DataPoint dt;
        dt.x = xPos;
        dt.y = yPos;
        dt.Int = Intensitytemp;
        temp.push_back(dt);
    }
    datas.push_back(temp);
}

そして私は次のようにパターンを描いています:

glBegin(GL_POINTS);
    for (int x = 0; x < 4096; x++)
        for (int y = 0; y < 4096; y++)
        {
            xPos = datas[x][y].x;
            yPos = datas[x][y].y;
            Intensitytemp = datas[x][y].Int;
            glColor4f(0.0f, Intensitytemp, 0.0f, 1.0f);
            glVertex3f(xPos, yPos, 0.0f);
        }
glEnd();

データをglBegin()-glEnd()ブロックで作成すると、動作が速くなります。しかし、どちらの場合も、GLSL ですべてを行う方がよい方法だと思います。私は、最新の OpenGL の背後にあるロジックをよく理解していませんでした。

頂点バッファ配列とカラー配列を作成しようとしましたが、うまくいきませんでした。問題は、配列をグラフィック カードに転送することではありませんでした。配列でスタック オーバーフローが発生しています。これは別のトピックの問題ですが、これらの巨大な配列をグラフィックス カードに転送することなく、完全に GLSL コード(.vert ファイル内のもの) でこのタスクを実行できるのではないかと思います。

4

2 に答える 2

0

あなたの質問に直接答えるには

いいえ、それがシェーダーの仕組みです。シェーダーは、レンダリング パイプラインの一部を再定義します。パイプラインが固定されている古代の OpenGL では、GPU は組み込みのシェーダー ルーチンを使用して、glBegin/glEnd関連する呼び出しを介してアップロードしたプリミティブをレンダリングします。ただし、以降の OpenGL バージョンでは、GPU が使用するカスタム ルーチンを作成できます。どちらの場合もシェーダーが処理するデータを送信する必要があります。

それを行う方法についてのより良いアプローチにあなたを導くために

まず、頂点シェーダーが頂点データをフィードします。頂点を取り、さまざまな変換を適用して一度に 1 つずつ操作します (頂点にモデル ビュー プロジェクション マトリックスを掛けることによって)。すべての頂点に対してこれが行われると、頂点を接続することによって作成された領域は、ラスタライズと呼ばれるプロセスで (頂点シェーダーからフラグメント シェーダーに渡すことができるものの中でも特に) 座標値に分解されます。それぞれが画面上のピクセルの位置を表すこれらの座標は、フラグメント シェーダーに送信されます。フラグメント シェーダーは、それらを操作して色を設定し、照明計算を適用します。

ここで、描画しようとしているのは背後に数式があるパターンであるため、文字通り 4 つの頂点のみを送信することで、4096x4096 の正方形に色を付けて、同じ結果を生成することができます。

頂点シェーダー:

#version 150

in vec2 vertexPos;
out vec2 interpolatedVertexPos;

void main()
{
  interpolatedVertexPos = vertexPos;
}

フラグメント シェーダー:

#version 1.5

in vec2 interpolatedVertexPos;
out vec4 glFragColor;

void main()
{
  const vec2 center = vec2(2048, 2048);
  float distanceFromCenter = sqrt(pow((interpolatedVertexPos.x-center.x), 2) + pow((interpolatedVertexPos.y-center.y), 2));
  if (distanceFromCenter > 2048){
    discard;
  }
  float Intensitytemp = ((float)((int)distanceFromCenter % 256)) / 255;
  glFragColor = vec4(0, Intensitytemp , 0, 1);
}

編集: この回答が役に立つと思うかもしれません: OpenGL big projects, VAO-s and more

于 2016-03-11T12:32:41.360 に答える