纹理使用texelFetch()(texturing using texelFetch())

2019-08-01 08:22发布

当我通过非最大值为纹理缓存,而渲染它吸引几何与最大值的颜色。 我发现这个问题,而使用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个格与暗红色。

Answer 1:

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

这里是你的问题:它们不匹配。

您创建纹理的存储作为8位无符号整数,这是归在阅读到漂浮 。 但是你告诉你给它签署 ,这将被解读为整数 ,浮点数不是8位整数的着色器。

而你对不一致的困惑的OpenGL。 不匹配的采样类型的纹理格式产生不确定的行为。

这应该是一个samplerBuffer ,不是isamplerBuffer



文章来源: texturing using texelFetch()