繁体   English   中英

片段着色器中纹理错误的值

[英]Texture wrong value in fragment shader

我正在将自定义数据加载到2D纹理GL_RGBA16F中:

glActiveTexture(GL_TEXTURE0);
int Gx = 128;
int Gy = 128;
GLuint grammar;
glGenTextures(1, &grammar);
glBindTexture(GL_TEXTURE_2D, grammar);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA16F, Gx, Gy);

float* grammardata = new float[Gx * Gy * 4](); // set default to zero

*(grammardata) = 1; 

glTexSubImage2D(GL_TEXTURE_2D,0,0,0,Gx,Gy,GL_RGBA,GL_FLOAT,grammardata);

int grammarloc = glGetUniformLocation(p_myGLSL->getProgramID(), "grammar");
if (grammarloc < 0) {
    printf("grammar missing!\n");
    exit(0);
}

glUniform1i(grammarloc, 0);

当我在GLSL中读取统一sampler2D语法的值时,它将返回0.25而不是1。如何解决缩放问题?

if (texture(grammar, vec2(0,0) == 0.25) {
    FragColor = vec4(0,1,0,1);
} else
{
    FragColor = vec4(1,0,0,1);
}

默认情况下,纹理插值设置为以下值:

GL_TEXTURE_MIN_FILTER = GL_NEAREST_MIPMAP_LINEAR,
GL_TEXTURE_MAG_FILTER = GL_LINEAR
GL_WRAP[R|S|T] = GL_REPEAT

这意味着,在纹理的纹理像素与屏幕上的像素之间的映射不适合的情况下,硬件插值将为您插值。 可能有两种情况:

  • 显示的纹理小于实际的纹理:在这种情况下,在两个mipmap级别之间执行插值。 如果未生成mipmap,则将其视为beeing 0,这可能会导致0.25。

  • 显示的纹理要比实际显示的要大(我想这里就是这种情况):在这里,硬件不会在mipmap级别之间进行插值,而是在纹理中的相邻纹理之间进行插值。 现在,问题出在以下事实:纹理坐标中的(0,0) 不是像素[0,0]的中心,而是像素的左下角。

请看下图,该图说明了如何定义纹理坐标(此处有4个纹理像素)

tex-coord:   0          0.25        0.5         0.75         1
texels       |-----0-----|-----1-----|-----2-----|-----3-----|

如您所见,0位于纹理像素的边界,而第一个纹理像素的中心位于(1 /(2 * | texels |))。

对您来说,这意味着将自动换行模式设置为GL_REPEAT,纹理坐标(0,0)将在纹理像素[0,0],[-1,0],[-1,-1],[0, -1]。 由于-1 == 127 (由于重复),并且除[0,0]以外的所有内容均为0,因此得出

([0,0] + [-1,0] + [-1,-1] + [0,-1]) / 4 =
   1   +    0   +    0    +   0   ) / 4 = 0.25

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM