texelFetch()中的samplerBuffer

3

片元着色器:

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非归一化类型。对于其余的内部格式,它不会在几何图形上应用纹理。

我需要改变什么才能得到所需的效果?

代码:

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个回答

2
如果“期望的效果”是有一个能适用于任何图像数据格式的单一着色器,那么这是不可能的。或者至少没有简单的方法。
你可以拥有三个不同的采样器,绑定到三个不同的纹理图像单元,对应三种不同的可能格式(浮点、带符号整数、无符号整数)。你创建3个不同的缓冲区纹理(使用相同的缓冲区),并将适当的纹理绑定到适当的采样器以获取着色器要使用的数据类型。然后传递一个定义应使用哪个采样器的统一变量。
但除了这样的条件逻辑外,就没有其他方法了。采样器的类型用于确定如何解释提供给着色器的数据,并且它必须与纹理的格式匹配。
通常,着色器被设计为期望某些特定的数据,而不是客户端代码想要扔到它上面的任何旧东西。从纹理中取出浮点数的着色器并不关心是否规格化整数或16位浮点数,或R11F_G11F_B10F或任何其他格式;该着色器只需要浮点数。将图像推送到期望浮点数的着色器中是不适当的。

我尝试使用isamplerBuffer来处理GL_8I格式的有符号字节,但强度值没有任何变化。我曾尝试使用isamplerbuffer处理包含"I"的格式,usamplerbuffer处理包含"U"的格式,但输出结果仍然不如预期。 - debonair
@user1737197:你期望得到什么,与你实际获得的有何不同? - Nicol Bolas
在上面的程序中,我定义了GLbyte arr[]={124,5,126};并在着色器中使用"uniform isamplerBuffer sampler"和内部格式为GL_R8I。我得到了3个具有相同红色强度的四边形,而不是变化的强度。 规格说明这种格式没有被标准化,所以我在片段着色器中使用normalize()函数来处理颜色值,但输出仍然出乎意料。 - debonair
@user1737197: 你怎么规范化它(更重要的是,你为什么要规范化它)?另外,不要把关键信息放在评论里,编辑你的问题并将其放在那里。 - Nicol Bolas
GL_R8I格式不会对数据进行规范化,因此我在片段着色器中通过Color=normalize(texelFetch(sampler,index))手动进行了规范化。我也尝试过不进行规范化。 - debonair
@user1737197:请不要把这些信息放在评论中。这不是一个论坛;回答你的问题所需的信息应该放在问题中。在你的问题完整之前,我无法回答你的问题。而且在你把你遇到问题的实际着色器和代码放入你的问题之前,你的问题是不完整的。 - Nicol Bolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接