7

最大値以外の値をテクスチャバッファに渡すと、レンダリング中に最大値の色でジオメトリが描画されます。glTexBuffer()APIを使用しているときにこの問題を見つけました。

たとえば、テクスチャデータがGLubyteであると仮定します。255未満の値を渡すと、色は黒とその色の混合ではなく、255で描画された色と同じになります。
AMDとnvidiaカードを試してみましたが、結果は同じです。どこがうまくいかないのか教えていただけますか?

ここにコードをコピーしています:

Vertシェーダー:

in vec2 a_position;
uniform float offset_x;
void main()
{ 
   gl_Position = vec4(a_position.x + offset_x, a_position.y, 1.0, 1.0);
}

フラグシェーダー:

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

}

コード:

GLubyte arr[]={128,5,250};
glGenBuffers(1,&bufferid);

glBindBuffer(GL_TEXTURE_BUFFER,bufferid);

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

glGenTextures(1, &buffer_texture);   

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


glUniform1f(glGetUniformLocation(shader_data.psId,"offset_x"),0.0f);
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);

この場合、3つの正方形すべてを濃い赤色で描画します。

4

1 に答える 1

2
uniform isamplerBuffer sampler;
glTexBuffer(GL_TEXTURE_BUFFER, GL_R8, bufferid);

あなたの問題があります:それらは一致しません。

テクスチャのストレージを符号なし8ビット整数として作成しました。これは、読み取り時に浮動小数点数に正規化されます。しかし、シェーダーに、浮動小数点数ではなく整数として読み取られる符号付き8ビット整数を指定していることを伝えました。

一貫性がないためにOpenGLを混乱させました。サンプラータイプとテクスチャフォーマットが一致しないと、未定義の動作が発生します。

それは、samplerBufferではなく、である必要がありisamplerBufferます。

于 2012-10-11T08:04:51.187 に答える