2

私は試した:

#version 130

uniform sampler2D texID;
in vec2 texcoord;
out vec4 outcolor;

void main(void) {
    vec2 tcoord=texcoord.xy*768.0;
    ivec2 tst=ivec2(tcoord.x,tcoord.y);
    outcolor=texelFetch(texID,tcoord);
}

そして、次の行でエラーが発生しましたtexelFetch

互換性のあるオーバーロードされた関数 "texelFetch(sampler2D, vec2)" が見つかりません。

これらのパラメーターを頭から入れなかったいくつかの情報源:

  1. http://www.opengl.org/wiki/Sampler_(GLSL)#Direct_texel_fetches

  2. http://www.opengl.org/sdk/docs/manglsl/xhtml/texelFetch.xml

TheQuestion:シェーダーを実行するときに、テクスチャーから直接読み取りピクセルを使用する方法、または単にピクセルを直接読み取るGL_TEXTURE_2D方法はありますか?texelFetch

4

2 に答える 2

5

1.30 仕様、89 ページを確認してください。

5 つのオーバーロードはどれtexelFetch()も2 つの引数を取り

gvec4 texelFetch (gsampler1D sampler, int P, int lod) 
gvec4 texelFetch (gsampler2D sampler, ivec2 P, int lod) 
gvec4 texelFetch (gsampler3D sampler, ivec3 P, int lod) 
gvec4 texelFetch (gsampler1DArray sampler, ivec2 P, int lod) 
gvec4 texelFetch (gsampler2DArray sampler, ivec3 P, int lod) 

3 番目のパラメーターが必要です。

于 2012-12-11T04:33:05.167 に答える
2
texelFetch(sampler1D(0),0,0);

これは合法的な GLSL ではありません。

sampler1D不透明タイプです。どんな種類の値もありません。はい、 で値を「設定」していることは知ってglUniform1iいますが、実際には値を設定していません。sampler1D構築できません。これは、 GLSL でサンプラー型を使用して実行できるすべてのリストです。

  1. グローバル スコープで一様変数として宣言します。
  2. 入力関数パラメーターとして宣言します。
  3. サンプラー型の変数を、そのサンプラー型を引数として取る関数に渡します。

「コンストラクターの呼び出し」はそのリストにないことに注意してください。sampler1D(0)は適切な構文ではありません。サンプラーを使用する場合は、それをユニフォームとして宣言し、OpenGL ソース コードからテクスチャ イメージ ユニットを設定する必要があります。または、GL 4.2 またはARB_shading_language_420packlayout(binding=#)がある場合は、構文を使用します。

本当は、パフォーマンスのために欲しいということです。

次に、間違った理由でそれを望んでいます。やろうとしていることを最も正確に説明するtexelFetchときに使用します。texelFetch単に「フィルタリングされていない」だけではありません。これは、テクスチャ/サンプラーのパラメーターを適切に設定するだけで取得できます。テクスチャ座標の正規化などを行わずに、特定のテクセルにアクセスする必要がある場合に使用する必要があります。

于 2012-12-29T15:17:36.053 に答える