3

フラグシェーダー:

out vec4 Color;
uniform samplerBuffer sampler;
uniform int index;
void main() 
{
   Color=normalize(texelFetch(sampler,index));

}

http://www.opengl.org/sdk/docs/man3/xhtml/glTexBuffer.xmlで提供されているすべての内部フォーマットのテクスチャリングにglTexBuffer()を使用しています。上記のシェーダーは、ubyte、ushort正規化タイプ、およびfloat、halffloat非正規化タイプでのみ機能します。残りの内部フォーマットでは、ジオメトリにテクスチャを適用しません。

目的の効果を得るには、何を変更する必要がありますか?

コード

GLbyte arr[]={124,5,126};
glGenBuffers(1,&bufferid);

glBindBuffer(GL_TEXTURE_BUFFER,bufferid);

glBufferData(GL_TEXTURE_BUFFER,sizeof(arr),arr,GL_STATIC_DRAW);


glGenTextures(1, &buffer_texture);   

glBindTexture(GL_TEXTURE_BUFFER, buffer_texture);
glTexBuffer(GL_TEXTURE_BUFFER, GL_R8I, bufferid);

glUniform1i(glGetUniformLocation(shader_data.psId,"sampler"),0);
glUniform1i(glGetUniformLocation(shader_data.psId,"index"),0);

glGenBuffers(1,&bufferid1);

glBindBuffer(GL_ARRAY_BUFFER,bufferid1);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices4),vertices4,GL_STATIC_DRAW);

attr_vertex = glGetAttribLocation(shader_data.psId, "a_position");

glVertexAttribPointer(attr_vertex, 2 , GL_FLOAT, GL_FALSE ,0, 0);

glEnableVertexAttribArray(attr_vertex);

glDrawArrays(GL_TRIANGLE_FAN,0,4);

glUniform1i(glGetUniformLocation(shader_data.psId,"index"),1);

glVertexAttribPointer(attr_vertex, 2 , GL_FLOAT, GL_FALSE ,0,(void *)(32) );

glDrawArrays(GL_TRIANGLE_FAN,0,4);

glUniform1i(glGetUniformLocation(shader_data.psId,"index"),2);

glVertexAttribPointer(attr_vertex, 2 , GL_FLOAT, GL_FALSE ,0,(void *)(64) );

glDrawArrays(GL_TRIANGLE_FAN,0,4);

すべての内部フォーマットを使用してテクスチャを適用する必要があります。

4

1 に答える 1

2

「望ましい効果」が、任意の形式の画像データで機能する単一のシェーダーを持つことである場合、それを行う方法はありません。または、少なくとも、簡単な方法はありません。

3つの異なるフォーマット(float、signed-int、unsigned-int)に対応する、3つの異なるテクスチャイメージユニットにバインドされた3つの異なるサンプラーを持つことができます。(同じバッファーを使用して)3つの異なるバッファーテクスチャを作成し、シェーダーで使用するデータの種類に応じて、適切なテクスチャを適切なサンプラーにバインドします。次に、使用するサンプラーを定義するユニフォームを渡します。

しかし、そのような条件付きロジック以外は、違います。サンプラーのタイプは、シェーダーに与えられたデータを解釈する方法を決定するために使用され、テクスチャのフォーマットと一致する必要があります。

一般に、シェーダーは特定の特定のデータを期待するように設計されており、クライアントコードがそれに投げかけたい古い任意のものではありません。テクスチャからフロートを引き出すシェーダーは、正規化されているかどうかは関係ありません。整数または16ビットフロート、あるいはR11F_G11F_B10Fなどです。シェーダーはフロートが必要です。フロートを期待するシェーダーで画像を押し出すことは適切ではありません。

于 2012-10-11T10:51:41.120 に答える