texelFetch()中的samplerBuffer

时间:2012-10-11 09:53:23

标签: opengl glsl shader textures

Frag shader:

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

}

我正在使用glTexBuffer()对http://www.opengl.org/sdk/docs/man3/xhtml/glTexBuffer.xml处给出的所有内部格式进行纹理处理。上面的着色器仅适用于ubyte,ushort规范化类型和float,halffloat unnormalised类型。对于其余的内部格式,它不会在几何体上应用纹理。

我需要改变什么才能达到预期的效果?

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);

我必须使用所有内部格式应用纹理。

1 个答案:

答案 0 :(得分:1)

如果“所需效果”是要有一个单个着色器,它可以处理任何格式的图像数据,那么就没办法了。或者至少,没有简单的方式。

你可以有三个不同的采样器,绑定到三个不同的纹理图像单元,对应于三种不同的可能格式(float,signed-int,unsigned-int)。您可以创建3个不同的缓冲区纹理(使用相同的缓冲区),并将适当的纹理绑定到适当的采样器,以获得希望着色器使用的数据类型。然后你传递一个定义应该使用哪个采样器的制服。

但除此之外的条件逻辑,没有。采样器的类型用于确定如何解释提供给着色器的数据,并且它必须与纹理的格式匹配。

通常,着色器旨在期望某些特定的数据,而不是客户端代码想要抛出的任何旧的任意事物。从纹理中拉出浮点数的着色器并不关心它是标准化整数还是16位浮点数,还是R11F_G11F_B10F等等;着色器只是想浮动。在预期浮动的着色器上推送图像是不合适的。