Java lernen

LWJGL 3 Problem mit einer Texture

Diskutiere LWJGL 3 Problem mit einer Texture im Spiele- und Multimedia-Programmierung Forum; Hallo, ich bin jüngst unter die "Spielentwickler" gegangen und baue gerade Agar.io nach. Mit der kleinen Besonderheit, dass eine 3D-Engine dafür...

  1. Meeresgott
    Meeresgott Mitglied
    Hallo,
    ich bin jüngst unter die "Spielentwickler" gegangen und baue gerade Agar.io nach. Mit der kleinen Besonderheit, dass eine 3D-Engine dafür verwende. Agar.io hat einen Hintergrund der sich am besten mit einer Seite von einem karierten Collegeblock vergleichen lässt.
    Ich habe hier mal eine Aufnahme, von meinen Spiel gemacht:

    Wie Ihr dort sehen könnt wird der Hintergrund gut gerendert, wenn ich relativ nah am Spieler bin, sobald ich raus zoome "flackert" der Hintergrund und scheint zu verschwimmen (Kann man gut in der Sekunde 4-6 sehen).

    Ich benutzte das LWJGL-Framework mit der Version 3.1.5.

    Die render Methode:
    Code (Java):
    public void render() {
            if (texture != null) {
                // Activate firs texture bank
                glActiveTexture(GL_TEXTURE0);
                // Bind the texture
                glBindTexture(GL_TEXTURE_2D, texture.getId());
            }

            // Draw the mesh
            glBindVertexArray(getVaoId());
            glEnableVertexAttribArray(0);
            glEnableVertexAttribArray(1);
            glEnableVertexAttribArray(2);

            glDrawElements(GL_TRIANGLES, getVertexCount(), GL_UNSIGNED_INT, 0);

            // Restore state
            glDisableVertexAttribArray(0);
            glDisableVertexAttribArray(1);
            glDisableVertexAttribArray(2);
            glBindVertexArray(0);
            glBindTexture(GL_TEXTURE_2D, 0);
        }
    Fragmentshader
    Code (Text):
    #version 330

    in  vec2 outTexCoord;
    out vec4 fragColor;

    uniform sampler2D texture_sampler;
    uniform vec3 colour;
    uniform int useColour;

    void main()
    {
        if ( useColour == 1 )
        {
            fragColor = vec4(colour, 1);
        }
        else
        {
            fragColor = texture(texture_sampler, outTexCoord);
        }
    }
    Vertexshader
    Code (Text):
    #version 330

    layout (location=0) in vec3 position;
    layout (location=1) in vec2 texCoord;
    layout (location=2) in vec3 vertexNormal;

    out vec2 outTexCoord;

    uniform mat4 modelViewMatrix;
    uniform mat4 projectionMatrix;
    uniform float textureMulti;

    void main()
    {
        gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
        outTexCoord = texCoord * textureMulti;
    }
    Sagt bitte Bescheid, wenn Ihr noch mehr Infos braucht.
    Danke im voraus für eure Antworten!

    VG Meeresgott
     
  2. Vielleicht hilft dir diese Seite hier weiter (Klick!)
  3. httpdigest
    httpdigest Aktives Mitglied
    Der Effekt, den du da siehst, entsteht durch sogenanntes "Aliasing".
    Bei Texturen passiert es immer dann, wenn der Footprint der Textur in einem Bildschirmpixel größer ist als ein Texel. Der Begriff Aliasing kommt ursprünglich aus der Signalverarbeitung und hat dort ziemlich dieselbe Bedeutung und denselben Effekt. Wenn wir uns ein kontinuierliches Signal vorstellen, etwa eine Sinuswelle, und dieses Signal "samplen", also an Punkten mit gleichen Abständen abgreifen, dann kann ab einem bestimmten Intervallgröße (der sogenannten Nyquist-Frequenz) das ursprüngliche Signal nicht mehr wiederhergestellt werden und es entsteht ein "Alias" des Signals. Das ist dasselbe wie man auch beim Textur-Sampling erlebt. Hier ist das Signal die eigentliche Textur und die Sampling-Punkte sind die Framebuffer/Bildschirm-Pixel.
    Je weiter du also herauszoomst, desto größer wird das Intervall zwischen jeweils zwei Sampling-Punkten und ab einer bestimmten Größe sehen wir nicht mehr die eigentliche Textur, sondern ein Alias davon.

    Um dem entgegenzuwirken, werden "Anti"-Aliasing Techniken benutzt. Im einfachsten Fall wird ein Low-Pass-Filter auf die Textur angewendet (z.B. ein 2x2 Box-Filter im Falle von OpenGL's Mipmapping). Das heißt, du kannst einfach Mipmapping für die Textur aktivieren und die Mipmap-Levels generieren (z.B. per glGenerateMipmap()). Du musst außerdem für die Textur bzw. den Sampler die GL_TEXTURE_MIN_FILTER Einstellung auf eine Mipmap-Einstellung etwa GL_LINEAR_MIPMAP_LINEAR setzen, sodass OpenGL beim Samplen der Textur in deinem Fragment Shader die Mipmap Levels verwendet.

    Siehe: https://www.khronos.org/opengl/wiki/Common_Mistakes#Automatic_mipmap_generation
     
    Zuletzt bearbeitet: 13. Sep. 2018
    Meeresgott gefällt das.
  4. Meeresgott
    Meeresgott Mitglied
    Code (Java):
    /* Some Texture load code*/

    // Generate Mip Map
            glGenerateMipmap(GL_TEXTURE_2D);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);

    /* Methode end load texture*/
    Nachdem ich diese Zeilen eingefügt habe, funktioniert alles super!
    Vielen Dank httpdigest!
     
  5. httpdigest
    httpdigest Aktives Mitglied
    Beachte, dass GL_LINEAR_MIPMAP_LINEAR kein gültiger Wert für den Magnification-Filter Parameter GL_TEXTURE_MAG_FILTER ist. Dieser Aufruf wird deshalb ignoriert und der Default GL_LINEAR oder ein von dir früher gültiger gesetzter Wert bleibt bestehen und OpenGL generiert einen Fehlercode, den du mit glGetError() abfragen kannst.
    Siehe: https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glTexParameter.xml
     
  6. Meeresgott
    Meeresgott Mitglied
  7. Hinweis: Du möchtest Java lernen? Vielleicht hilft dir diese Seite hier weiter.
Die Seite wird geladen...

LWJGL 3 Problem mit einer Texture - Ähnliche Themen

Low Poly 3D LWJGL Shader Problem
Low Poly 3D LWJGL Shader Problem im Forum Spiele- und Multimedia-Programmierung
Problem mit Transparenz/TextDrawing in LWJGL/Slick2d (OpenGL)
Problem mit Transparenz/TextDrawing in LWJGL/Slick2d (OpenGL) im Forum Spiele- und Multimedia-Programmierung
LWJGL 2.9.2: Seltsamer Effekt beim Rendern (VertexShader Problem?)
LWJGL 2.9.2: Seltsamer Effekt beim Rendern (VertexShader Problem?) im Forum Spiele- und Multimedia-Programmierung
2D-Render Probleme LWJGL 2 (Java)
2D-Render Probleme LWJGL 2 (Java) im Forum Spiele- und Multimedia-Programmierung
LWJGL gluLookAt "Umschauen" Problem
LWJGL gluLookAt "Umschauen" Problem im Forum Spiele- und Multimedia-Programmierung
Thema: LWJGL 3 Problem mit einer Texture