Ich bin derzeit ein Projekt von der Verwendung eines Texturatlas zu einer Array Textur, sondern für das Leben von mir konvertieren arbeiten kann ich nicht arbeiten.OpenGL Array Texturen Rendering nicht an allen
Einige Anmerkungen zu meiner Umgebung:
- Ich bin mit OpenGL 3.3 Core Zusammenhang mit GLSL Version 3.30
- Die Texturen sind alle 128x128 und völlig in Ordnung gemacht wird, wenn ein Atlas mit (die Kantenartefakte Sperrung des hat mich überzeugt
Probleme zu wechseln) ich glaube, ich habe ausgeschlossen:
- Auflösung Probleme - 128x128, eine Zweierpotenz ist, sollte
- Texture Laden (es funktioniert perfekt wie zuvor) in Ordnung sein
- Unvollständige Texturen (MipMap Ausgaben) - Ich habe durch die häufig gestellte Fragen in Bezug auf Mipmaps gegangen und ich glaube nicht, OpenGL erwarten sie meinen Code sollte
Hier ist die Array-Textur für die Erstellung von:
public void createTextureArray() {
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
int handle = glGenTextures();
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D_ARRAY, handle);
glPixelStorei(GL_UNPACK_ROW_LENGTH, Texture.SIZE);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, Texture.SIZE, Texture.SIZE, textures.size());
try {
int layer = 0;
for (Texture tex : textures.values()) {
// Next few lines are just for loading the texture. They've been ruled out as the issue.
PNGDecoder decoder = new PNGDecoder(ImageHelper.asInputStream(tex.getImage()));
ByteBuffer buffer = BufferUtils.createByteBuffer(decoder.getWidth() * decoder.getHeight() * 4);
decoder.decode(buffer, decoder.getWidth() * 4, PNGDecoder.Format.RGBA);
buffer.flip();
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, layer, decoder.getWidth(), decoder.getHeight(), 1,
GL_RGBA, GL_UNSIGNED_BYTE, buffer);
tex.setLayer(layer);
layer++;
}
} catch (IOException ex) {
ex.printStackTrace();
System.err.println("Failed to create/load texture array");
System.exit(-1);
}
}
Der Code für die Erstellung des VAO/VBO:
private static int prepareVbo(int handle, FloatBuffer vbo) {
IntBuffer vaoHandle = BufferUtils.createIntBuffer(1);
glGenVertexArrays(vaoHandle);
glBindVertexArray(vaoHandle.get());
glBindBuffer(GL_ARRAY_BUFFER, handle);
glBufferData(GL_ARRAY_BUFFER, vbo, GL_STATIC_DRAW);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D_ARRAY, GraphicsMain.TEXTURE_REGISTRY.atlasHandle);
glEnableVertexAttribArray(positionAttrIndex);
glEnableVertexAttribArray(texCoordAttrIndex);
glVertexAttribPointer(positionAttrIndex, 3, GL_FLOAT, false, 24, 0);
glVertexAttribPointer(texCoordAttrIndex, 3, GL_FLOAT, false, 24, 12);
glBindVertexArray(0);
vaoHandle.rewind();
return vaoHandle.get();
}
Fragment-Shader:
#version 330 core
uniform sampler2DArray texArray;
varying vec3 texCoord;
void main() {
gl_FragColor = texture(texArray, texCoord);
}
(texCoord
funktioniert gut; Es wird vom Vertex-Shader korrekt übertragen.)
Ich bin über keine Ideen hinaus, da es für OpenGL noch etwas neu ist, würde ich gerne wissen, ob irgendetwas mit meinem Code grell falsch ist.
Was sind Ihre Texturkoordinaten? Stellen Sie sicher, dass der Ebenenindex eine Ganzzahl ist und kein normalisierter Wert von "0" bis "1". –
"' texture2DArray' "Das ist keine legale GLSL 3.30-Funktion. Die Funktion, die Sie zum Abtasten aus einem Textur-Array verwenden, wird "Textur" genannt, genau wie die Funktion, die Sie zum Abtasten von Texturen aller Art verwenden. –
@ColonThirtyTwo Die xy-Koordinaten sind entweder 0 oder 1, je nachdem, welcher Stützpunkt gerendert wird. Der Layer wird als "int" gespeichert und direkt vom Accessor an den als VBO bereitgestellten "FloatBuffer" übergeben. – caseif