Resultado incorreto ao usar texturas 3D
Estou usando o moderno núcleo OpenGL 4.3.
Acabei de perceber que 1024p x 1024p tileset é muito pequeno para minhas necessidades. Então, substituí-o por uma textura 3D de 1024p x 1024p x 4p. (Eu sei, não é a melhor solução e é melhor usar a matriz de textura 2D. Estou apenas me perguntando por que minha solução atual não funciona.)
x
ey
As coordenadas de textura funcionam bem, como antes.z
também funciona, mas um pouco incorretamente. Eu esperaria que a 1ª camada tivessez == 0.0
, Segunda camada -z == 0.3333333
, Terceira camada -z == 0.66666666
e 4º um -z == 1.0
.
As 1ª e 4ª camadas funcionam conforme o esperado. Mas0.33333333
e0.66666666
me dê resultados incorretos:
0,33333333 -> 1ª camada misturada com a 2ª camada
0,666666666 -> 3ª camada misturada com a 4ª camada
(Estou usando a filtragem linear, é por isso que eles se misturam.)
Tentei escolher os valores z corretos para a 2ª e a 3ª camadas:
2º exibe bem quandoz == 0.38
3º exibe bem quandoz == 0.62
(Esses números são aproximados, é claro.)
Alguma idéia de por que isso acontece e como posso corrigir isso?
É assim que eu crio a textura:
glActiveTexture(GL_TEXTURE1);
glGenTextures(1, &maintex);
glBindTexture(GL_TEXTURE_3D, maintex);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, TEXSIZE, TEXSIZE, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, textemp);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
E é o meu shader:
const char *vertex = 1+R"(
#version 430
uniform layout(location = 3) vec2 fac;
in layout(location = 0) vec2 vpos; // vertex coords
in layout(location = 1) vec3 tpos; // texture coords
in layout(location = 2) vec4 c_off; // color offset = vec4(0,0,0,0) by default
in layout(location = 3) vec4 c_mult; // color multiplicator = vec4(1,1,1,1) by default
// These two are used to do some sort of gamma correction
out vec3 var_tpos;
out vec4 var_c_off;
out vec4 var_c_mult;
void main()
{
var_tpos = tpos;
var_c_off = c_off;
var_c_mult = c_mult;
gl_Position = vec4(vpos.x * fac.x - 1, vpos.y * fac.y + 1, 0, 1);
})";
const char *fragment = 1+R"(
#version 430
uniform layout(location = 0) sampler3D tex;
in vec3 var_tpos;
in vec4 var_c_off;
in vec4 var_c_mult;
out vec4 color;
void main()
{
color = texture(tex, vec3(var_tpos.x / 1024, var_tpos.y / 1024, var_tpos.z));
color.x *= var_c_mult.x;
color.y *= var_c_mult.y;
color.z *= var_c_mult.z;
color.w *= var_c_mult.w;
color += var_c_off;
})";