1

OpenGL テクスチャ バッファを処理して、グレースケール値のバッファを、選択した式によってオンザフライで RGB 値に変換する方法があるかどうか疑問に思っていました。

私はすでにうまく機能しますが、カラー3ベクトルを出力するような関数を持っています。

rgb convertToColor(float value);

私は OpenGL に非常に慣れていないので、どの種類のシェーダーを使用する必要があり、どこに行くべきか疑問に思っていました。私のプログラムは現在、次のようにフレームを循環しています:

program1.bind();
program1.setUniformValue("texture", 0);
program1.enableAttributeArray(vertexAttr1);
program1.enableAttributeArray(vertexTexr1);
program1.setAttributeArray(vertexAttr1, vertices.constData());
program1.setAttributeArray(vertexTexr1, texCoords.constData());
glBindTexture(GL_TEXTURE_2D, textures[0]);
glTexSubImage2D(GL_TEXTURE_2D,0,0,0,widthGL,heightGL, GL_LUMINANCE,GL_UNSIGNED_BYTE, &displayBuff[displayStart]);
glDrawArrays(GL_TRIANGLES, 0, vertices.size());
glBindTexture(GL_TEXTURE_2D,0);
//...

シェーダー

QGLShader *fshader1 = new QGLShader(QGLShader::Fragment, this);
    const char *fsrc1 =
        "uniform sampler2D texture;\n"
        "varying mediump vec4 texc;\n"
        "void main(void)\n"
        "{\n"
        "    gl_FragColor = texture2D(texture, texc.st);\n"
        "}\n";

たとえば、下の画像に示すように、imagesc のような matlab で効果を再現しようとしています。 画像sc

4

2 に答える 2

6

次のようなものが機能します。

    "uniform sampler2D texture;\n"
    "uniform sampler1D mappingTexture;\n"
    "varying mediump vec4 texc;\n"
    "void main(void)\n"
    "{\n"
    "    gl_FragColor = texture1D(mappingTexture, texture2D(texture, texc.st).s);\n"
    "}\n";

ここで、マッピング テクスチャは、グレースケールをカラーにマッピングする 1D テクスチャです。

もちろん、グレースケールに基づいて RGB カラーを計算する関数を作成することもできますが、(ハードウェアによっては) テクスチャ ルックアップを実行するだけの方が高速な場合があります。

一度に 2 つのバッファを OpenGL プログラムにバインドする方法が明確でない

テクスチャをサンプラーにバインドします。

于 2013-06-14T03:16:31.953 に答える
1

既にプログラムがロードされ、テクスチャを読み取るように設定されているようです (コード内の program1)。ピクセル シェーダー テクスチャ座標を渡してテクスチャを調べるように頂点シェーダーが既に設定されていると仮定すると (以下のプログラムでは、これは "texcoord" です)、ピクセル シェーダーを次のように変更できるはずです。

uniform texture2d texture;   // this is the greyscale texture
varying vec2 texcoord;       // passed from your vertex shader

void main() 
{  
    float luminance = tex2D(texture, texcoord).r;     // grab luminance texture
    gl_FragColor = convertToColor(luminance);         // run your function
}

これは輝度テクスチャを読み込み、輝度を色に変換する関数を呼び出します。関数が 3 成分の RGB ベクトルのみを返す場合は、最後の行を次のように変更できます。

gl_FragColor = vec4(convertToColor(luminance), 1.0);
于 2013-06-14T02:48:13.073 に答える