[英]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.