Falsches Ergebnis bei Verwendung von 3D-Texturen

Ich verwende den modernen OpenGL 4.3-Core.

Ich habe gerade festgestellt, dass das 1024p x 1024p-Kachelset zu klein für meine Anforderungen ist. Also habe ich es durch 1024p x 1024p x 4p 3D-Textur ersetzt. (Ich weiß, es ist nicht die beste Lösung, und ich verwende besser ein 2D-Texturarray. Ich frage mich nur, warum meine aktuelle Lösung nicht funktioniert.)

x undy Texturkoordinaten funktionieren wie zuvor.z funktioniert auch, aber ein bisschen falsch. Ich würde erwarten, dass die 1. Schicht @ hz == 0.0, 2. Schicht -z == 0.3333333, 3. Schicht -z == 0.66666666 und 4. eins -z == 1.0.

Die 1. und 4. Schicht funktionieren wie erwartet. Aber0.33333333 und0.66666666 gib mir falsche Ergebnisse:
0.33333333 -> 1. Schicht gemischt mit 2. Schicht
0.66666666 -> 3. Schicht gemischt mit 4. Schicht
(Ich verwende lineare Filterung, deshalb mischen sie sich.)

Ich habe versucht, die richtigen z-Werte für die 2. und 3. Ebene auszuwählen:
2nd wird gut angezeigt, wennz == 0.38
3rd wird gut angezeigt, wennz == 0.62
(Diese Zahlen sind natürlich ungefähr.)

Irgendwelche Ideen, warum das passiert und wie ich das beheben kann?


So erstelle ich die Textur:

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);

Und es ist mein 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;
})";

Antworten auf die Frage(1)

Ihre Antwort auf die Frage