使用texelFetch()进行纹理贴图

7
当我将非最大值传递到纹理缓冲区时,在渲染时会使用最大值的颜色绘制几何图形。我在使用glTexBuffer() API时发现了这个问题。
例如,假设我的纹理数据是GLubyte类型,当我传递任何小于255的值时,颜色与使用255绘制的颜色相同,而不是黑色和该颜色的混合色。 我在AMD和Nvidia卡上尝试过,但结果都一样。 您能告诉我哪里出了问题吗?
以下是我的代码:
顶点着色器:
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个正方形。
1个回答

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

这就是问题所在:它们不匹配。
你将纹理的存储创建为无符号8位整数,读取时会被规范化为浮点数。但是你告诉着色器你正在提供有符号8位整数,这些整数将被读取为整数而不是浮点数。
你的不一致让OpenGL感到困惑了。采样器类型与纹理格式不匹配会导致未定义的行为。
那应该是一个samplerBuffer,而不是isamplerBuffer。

非常感谢..!! 现在的问题是,当我将isamplerBuffer替换为samplerBuffer时,它可以正确输出GL_R8、GL_R16、GL_R16F、GL_R32F,但对于http://www.opengl.org/sdk/docs/man3/xhtml/glTexBuffer.xml上给出的其他内部格式,则无法正确输出。 你能告诉我如何实现所有内部格式的正确输出吗..? 实际上我对glsl没有太多了解.. 请帮帮我.. - debonair
@user1737197:Stack Overflow不是一个网上论坛。在这里,如果你有一个新问题,请使用“提问”按钮来询问。或者你可以直接去OpenGL Wiki上阅读相关内容 - Nicol Bolas
抱歉,我已经创建了新的问题。 - debonair

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