opengl - 使用 texelFetch() 进行纹理化

标签 opengl glsl shader textures

当我将非最大值传递到纹理缓冲区时,在渲染时它会绘制具有最大值颜色的几何图形。我在使用 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 个正方形。

最佳答案

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

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

您将纹理的存储创建为无符号 8 位整数,在读取时将其标准化为 float 。但是您告诉着色器您要为其提供有符号 8 位整数,这些整数将被读取为整数,而不是 float 。

你因不一致而混淆了 OpenGL。采样器类型与纹理格式不匹配会产生未定义的行为。

那应该是 samplerBuffer,而不是 isamplerBuffer

关于opengl - 使用 texelFetch() 进行纹理化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12834058/

相关文章:

c++ - 顶点着色器中属性的位置不正确

c - 为什么这段代码不画三角形?

ios - 在片段着色器中优化 GLSL 代码 (iOS 5 + OpenGL ES 2.0)

ios - 如何在Xcode中调试ios的metal内核?

java - 为什么此照明代码仅适用于单个灯光,而当我添加多个灯光时会中断?

c++ - OpenGL - 当我从一个单元格移动到另一个单元格时,相机移动有一个闩锁

shader - DirectX 11 什么是着色器资源 View

c++ - 识别展开的网格 UV 区域

opengl - 片段着色器中 `out`变量的名称

opengl - 法线贴图问题