OpenGL - Transparenz

BattleMaster246

Aktives Mitglied
Wie kann man Polygone undurchsichtig machen. Denn wenn ich ein Polygon zeichne und danach eins, das hinter dem ersten liegt, legt dieses sich vor das erste.
Ich habs schon mit glColor4f() versucht, wo das 4. Argument auf 1.0f gestellt ist.
 

Evil-Devil

Top Contributor
Du müsstest entweder die Reihenfolge in der du deine Polygone zeichnest entsprechend anpassen, also von hinten nach vorne und sonst den Tiefenpuffer kurzzeitig deaktivieren. Aber ich würde empfehlen die Objekte entsprechend zu sortieren, dann kannst du auch direkt sagen das verdeckte Objekte überhaupt nicht gezeichnet werden müssen.
 

BattleMaster246

Aktives Mitglied
@Evil-Devil: Das mit dem sortieren geht leider nicht so gut, da sich die Kamera dreht.
@Guest:

Java:
gl.glEnable(GL.GL_DEPTH_TEST);

Dabei werden irgentwie Teile der Polygone bei der Kamerafahrt weiß und wenn die Kamera steht ist alles weiß.
 
G

Guest2

Gast
Steht in Deiner display() ziemlich am Anfang gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);?

Hintergrund ist, in OpenGL ist der depth test default aus. Dadurch werden die Dreiecke in der Reihenfolge gezeichnet in der sie an OpenGL übergeben werden. Machst Du den Test mit glEnable an, wird die Tiefeninformation zur Verdeckungsberechnung genutzt. Damit das funktioniert muss der dazugehörige Z-Buffer jedes Frame gelöscht werden (dafür das glClear).
Wenn es dann immer noch nicht geht, fehlt irgendwo noch etwas anderes. :D (Dann währe wohl ein bisschen Code hilfreich)

Gruß,
Fancy
 

BattleMaster246

Aktives Mitglied
Es funktionier nun :)

Java:
gl.glClear(GL.GL_COLOR_BUFFER_BIT);

hab ich zu

Java:
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);

gemacht. :D




Hab aber noch ne Frage. Ich habe in einem Tutorial gelsen, wie man für einen gluSphere eine Textur erstellt. Den Code habe ich jedoch ein wenig umgeschrieben.

Java:
File va = new File("vav2.png");
        try {
            mcnet = TextureIO.newTexture(va, false);
        } catch (IOException ex) {
            System.out.println("# Texture loading failed: "+ex.getMessage()); System.exit(0);
        } catch (GLException ex) {
            System.out.println("# Texture loading failed: "+ex.getMessage()); System.exit(0);
        }

Das lässt sich auf einen gluSphere anwenden und funktioniert bei mir auch. Doch wie lässt sich das auf einen glVertex3f anwenden. Auf Englischen Tutorial seiten hatten die da "demos.common.GLDisplay" als Import, jedoch existiert dies nicht bei mir.
 
G

Guest2

Gast
glVertex beschreibt die Koordinate eines einzelnen Vertex (Eckpunkt). Deine Fläche spannst Du ja aus mehreren Vertices (Eckpunkten) auf. Wenn Du die Fläche nun mit einer Textur beziehen willst, musst Du jedem Vertex auch eine Texturkoordinate zuweisen. Dies geht z.B. mit glTexCoord2f.

Grob sieht das dann für ein Dreieck etwa so aus:

Code:
            gl.glBegin(GL.GL_TRIANGLES);
            
            gl.glTexCoord2f(0, 0);
            gl.glVertex3f(0, 0, 0);
            
            gl.glTexCoord2f(1, 0);
            gl.glVertex3f(1, 0, 0);
            
            gl.glTexCoord2f(1, 1);
            gl.glVertex3f(1, 1, 0);
            
            gl.glEnd();

Wichtig ist, dass glTexCoord immer vor glVertex aufgerufen wird.

Statt die Texturkoordinaten direkt als float anzugeben, kannst Du auch die utility Funktionen aus der Texture Klasse nutzen:

Code:
            TextureCoords textureCoords = texture.getImageTexCoords();
            
            // [..]
            
            gl.glTexCoord2f(textureCoords.left(),  textureCoords.bottom());
            gl.glVertex3f(-1.0f, -1.0f, 1.0f);
            
            // usw.


(und wenn die Textur noch nicht gebunden ist, texture.bind() nicht vergessen)

(und ja, man kann auch alle Textur- und Vertextkoordinaten gesammelt als ein großes Array (Buffer) übergeben und damit tausende glTexCoord / glVertex Aufrufe einsparen, aber ka. ob Du das schon wissen willst :D)

Gruß,
Fancy
 

BattleMaster246

Aktives Mitglied
Ja, das mit den Eckpunkten weis ich, nur habe ich bei gamedev einen ganz anderen Code gefunden.

Irgentwie funktioniert das nicht. Hier mein Code:

Java:
            gl.glBegin(GL.GL_QUADS);
                gl.glEnable(GL.GL_TEXTURE_2D);
                mcnet2.enable();
                mcnet2.bind();
                gl.glColor3f(1,1,1);
                gl.glTexCoord2f(1,1); gl.glVertex3f(x+l-1,y,z);
                gl.glTexCoord2f(1,0); gl.glVertex3f(x+l-1,y+h,z);
                gl.glTexCoord2f(0,0); gl.glVertex3f(x+l-1,y+h,z+b);
                gl.glTexCoord2f(0,1); gl.glVertex3f(x+l-1,y,z+b);
                mcnet2.disable();
            gl.glEnd();
 
G

Guest2

Gast
Das gl.glEnable(GL.GL_TEXTURE_2D) muss vor das glBegin, sinnvollerweise wahrscheinlich sogar in die init(). Dann sollte es gehen.

Gruß,
Fancy
 

BattleMaster246

Aktives Mitglied
Jetzt funktionierts, danke. Aber wenn ich das in die Init()-Funktion schreibe, hat alles diese Textur.
So funktioniert es jetzt richtig:

Java:
           gl.glEnable(GL.GL_TEXTURE_2D);
           mcnet2.enable();
           mcnet2.bind();
            gl.glBegin(GL.GL_QUADS);
                gl.glColor3f(1,1,1);
                gl.glTexCoord2f(1,1); gl.glVertex3f(x+l,y,z);
                gl.glTexCoord2f(1,0); gl.glVertex3f(x+l,y+h,z);
                gl.glTexCoord2f(0,0); gl.glVertex3f(x+l,y+h,z+b);
                gl.glTexCoord2f(0,1); gl.glVertex3f(x+l,y,z+b);
            gl.glEnd();
            mcnet2.disable();
            gl.glDisable(GL.GL_TEXTURE_2D);
 
G

Guest2

Gast
[..]Aber wenn ich das in die Init()-Funktion schreibe, hat alles diese Textur.[..]

Dazu gibt es gl.glBindTexture(GL.GL_TEXTURE_2D, 0).

Allgemein hat die Art, wie Ressourcen in OpenGL geladen und gebunden werden eine ziemlich zentrale Bedeutung. Neben Texturen wirst Du später noch ne ganze Reihe weiterer "Dinge" laden / erstellen / binden. Deshalb kann es imho nicht schaden, auch die Texturen mal ohne Utilityklassen zu laden - meines Erachtens werden dann viele Dinge klarer (zumindest langfristig).

Deshalb, der Vollständigkeit halber:

Java:
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;

import javax.imageio.ImageIO;
import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCanvas;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.glu.GLU;

import com.sun.opengl.util.Animator;
import com.sun.opengl.util.BufferUtil;

public class Tex implements GLEventListener {

    private static final String IMAGE = "pic.png";

    private GL                  gl;
    private GLU                 glu;

    private int                 textureID;
    private final ByteBuffer    texture;
    private final int           width;
    private final int           height;


    public Tex() throws IOException {

        final BufferedImage image = ImageIO.read(this.getClass().getClassLoader().getResourceAsStream(IMAGE));

        width = image.getWidth();
        height = image.getHeight();

        final byte[] data = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
        texture = BufferUtil.newByteBuffer(data.length);
        texture.put(data);
        texture.rewind();

    }


    @Override
    public void init(final GLAutoDrawable drawable) {

        gl = drawable.getGL();
        glu = new GLU();

        gl.glEnable(GL.GL_DEPTH_TEST);
        gl.glEnable(GL.GL_TEXTURE_2D);

        final IntBuffer buffer = BufferUtil.newIntBuffer(1);
        gl.glGenTextures(1, buffer);
        textureID = buffer.get(0);

        gl.glBindTexture(GL.GL_TEXTURE_2D, textureID);
        gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
        gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
        gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);

        gl.glPixelStorei(GL.GL_UNPACK_ALIGNMENT, 1);
        gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGB, width, height, 0, GL.GL_BGR, GL.GL_UNSIGNED_BYTE, texture);

    }


    @Override
    public void display(final GLAutoDrawable drawable) {

        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);

        gl.glBindTexture(GL.GL_TEXTURE_2D, textureID);
        gl.glBegin(GL.GL_TRIANGLES);
        gl.glTexCoord2f(1, 1);
        gl.glVertex3f(1, -1, -5);
        gl.glTexCoord2f(1, 0);
        gl.glVertex3f(1, 1, -5);
        gl.glTexCoord2f(0, 0);
        gl.glVertex3f(-1, 1, -5);
        gl.glEnd();
        gl.glBindTexture(GL.GL_TEXTURE_2D, 0);

        gl.glColor3f(0.3f, 0.3f, 0.5f);
        gl.glBegin(GL.GL_TRIANGLES);
        gl.glVertex3f(-1, 1, -5);
        gl.glVertex3f(-1, -1, -5);
        gl.glVertex3f(1, -1, -5);
        gl.glEnd();

    }


    @Override
    public void reshape(final GLAutoDrawable drawable, final int x, final int y, final int width, int height) {

        if (height <= 0)
            height = 1;

        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();
        glu.gluPerspective(45.0f, (float) width / (float) height, 1.0, 20.0);
        gl.glMatrixMode(GL.GL_MODELVIEW);
        gl.glLoadIdentity();

    }


    @Override
    public void displayChanged(final GLAutoDrawable drawable, final boolean modeChanged, final boolean deviceChanged) {

    }


    public static void main(final String[] args) throws IOException {

        final Tex tex = new Tex();
        final Frame frame = new Frame();
        final GLCanvas canvas = new GLCanvas();
        final Animator animator = new Animator(canvas);

        canvas.addGLEventListener(tex);
        frame.add(canvas);
        frame.setSize(500, 500);
        frame.addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(final WindowEvent e) {

                new Thread(new Runnable() {
                    public void run() {

                        animator.stop();
                        System.exit(0);

                    }

                }).start();
            }
        });

        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        animator.start();
    }

}


Gruß,
Fancy
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Streeber Problem mit Transparenz/TextDrawing in LWJGL/Slick2d (OpenGL) Spiele- und Multimedia-Programmierung 1
F OpenGL - Transparenz mit Depth Peeling Spiele- und Multimedia-Programmierung 0
temi OpenGL: Eine Kugel Spiele- und Multimedia-Programmierung 7
P Audio Visualizer mit OpenGL in Java? Spiele- und Multimedia-Programmierung 4
Z Vlcj in OpenGL Spiele- und Multimedia-Programmierung 4
coolian opengl von scale in breite und höhe konvertieren Spiele- und Multimedia-Programmierung 23
F OpenGL (LWJGL) Shader Programmierung GLSL Spiele- und Multimedia-Programmierung 2
K Messdaten in Echtzeit darstellen in OpenGL Spiele- und Multimedia-Programmierung 4
J OpenGL Bild wird nicht richtig angezeigt Spiele- und Multimedia-Programmierung 2
B LWJGL OpenGL SIGSEGV auf Linux (Verzweiflung :/) Spiele- und Multimedia-Programmierung 8
KeexZDeveoper Fehler von OpenGL Spiele- und Multimedia-Programmierung 1
Kim_Dotcom libGDX - opengl Fehler Spiele- und Multimedia-Programmierung 5
RalleYTN OpenGL Context im JFrame? Spiele- und Multimedia-Programmierung 0
L OpenGL TransformationMatrix eines Flugzeugs Spiele- und Multimedia-Programmierung 2
turing OpenGL / Jogle Code Reveiw zur Performance Verbesserung Spiele- und Multimedia-Programmierung 1
K LibGdx, Loadingscreen & Opengl context Spiele- und Multimedia-Programmierung 3
turing OpenGL VBO and Unfiform Handling Spiele- und Multimedia-Programmierung 1
B LWJGL / OPENGL Kriege Depth-Test nicht hin :( Spiele- und Multimedia-Programmierung 0
T opengl und Android.... Spiele- und Multimedia-Programmierung 3
D [OpenGL] Spiel in der Art von Age of Empires Spiele- und Multimedia-Programmierung 4
R LWJGL: OpenGL Fehler - weitere Informationen auslesen möglich? Spiele- und Multimedia-Programmierung 2
T Welche OpenGL-Version soll ich verwenden? Spiele- und Multimedia-Programmierung 2
O OpenGL - Texture falsch herum Spiele- und Multimedia-Programmierung 3
Gregorrr OpenGL & RCP/SWT Spiele- und Multimedia-Programmierung 3
P LWJGL oder OpenGL (C++) Spiele- und Multimedia-Programmierung 7
K Android: OpenGL render performance Tipps ? Spiele- und Multimedia-Programmierung 4
lumo opengl, sprites/tiles Spiele- und Multimedia-Programmierung 8
M OpenGL: Rectangle dort erstellen wo ich hintippe Spiele- und Multimedia-Programmierung 2
U OpenGl 1.1 (LWJGL GL11.*) und weiter? Spiele- und Multimedia-Programmierung 7
CookieSoft OpenGl Translatef Frage Spiele- und Multimedia-Programmierung 2
V Keine Ahnung von OpenGL! Hilfe wäre lieb! Spiele- und Multimedia-Programmierung 8
T 3D Stadtmodell mit OpenGL Spiele- und Multimedia-Programmierung 5
TheWhiteShadow OpenGL glDrawArrays Bufferfehler Spiele- und Multimedia-Programmierung 10
B LWJGL/OpenGL rendert manche Objekte nicht Spiele- und Multimedia-Programmierung 6
S OpenGL Textur unsauber Spiele- und Multimedia-Programmierung 2
T OpenGL ES verschwindene Vertices Spiele- und Multimedia-Programmierung 2
T Android OpenGL Bewegen Spiele- und Multimedia-Programmierung 5
R OpenGL Textur mit verschiedenen bit depths Spiele- und Multimedia-Programmierung 6
Helgon OpenGL Blend Frage Spiele- und Multimedia-Programmierung 18
A LWJGL/OpenGL und Text Spiele- und Multimedia-Programmierung 8
Helgon OpenGL vernünftige Tutorial? Spiele- und Multimedia-Programmierung 22
A OpenGL Textur und nicht Textur Spiele- und Multimedia-Programmierung 2
T Jmonkey opengl problem Spiele- und Multimedia-Programmierung 13
T Probleme mit Skysphere in Opengl Spiele- und Multimedia-Programmierung 4
M Problem mit Kamera (glMultMatrix (OpenGL/ LWJGL)/ Quaternionen) Spiele- und Multimedia-Programmierung 5
F Suche Tutorial zu "purem" OpenGL mit Java Spiele- und Multimedia-Programmierung 10
Kr0e OpenGL + glSubTexImage2D -> Bufferproblem Spiele- und Multimedia-Programmierung 3
F OpenGL Screenshot in iMove (als Greenscreen) => Farben invertiert? Spiele- und Multimedia-Programmierung 16
I Vergleich von Java3D und OpenGL Spiele- und Multimedia-Programmierung 17
F Mac: OpenGL Desktop-Screen aus Grafikkarte lesen Spiele- und Multimedia-Programmierung 2
F OpenGL 2D MouseClick/MouseMove Listener Spiele- und Multimedia-Programmierung 4
Kr0e Sehr schnelle Texturupdates (OpenGL) Spiele- und Multimedia-Programmierung 3
Kr0e OpenGL beliebige Texturgröße Spiele- und Multimedia-Programmierung 2
Kr0e OpenGL .. Pixel Buffer Objekt oder Frame Buffer Object? Spiele- und Multimedia-Programmierung 2
Y JOGL / OPENGL in Frame Spiele- und Multimedia-Programmierung 11
A Problem openGL-Pipeline mit Win7? Spiele- und Multimedia-Programmierung 6
G OpenGL boolesche operation auf Rechtecke Spiele- und Multimedia-Programmierung 15
A JOGL / OpenGL Spiele- und Multimedia-Programmierung 7
G API für 3d-Programmierung? OpenGL? Spiele- und Multimedia-Programmierung 12
J OpenGL (JOGL) - Radial Blur Effekt (Glow) Spiele- und Multimedia-Programmierung 2
J Opengl Texture laden Null Pointer Exception Spiele- und Multimedia-Programmierung 6
J netbeans opengl keyPressed(KeyEvent evt) benutzen Spiele- und Multimedia-Programmierung 4
J netbeans opengl gluPerspective und gluLookAt Verständnis Spiele- und Multimedia-Programmierung 13
S glTexSubImage2D()-Fragen(Zerstörbares Terrain, OpenGL) Spiele- und Multimedia-Programmierung 3
Z Suche Tutorial zum Einstieg in OpenGl mit Java (JOGL) Spiele- und Multimedia-Programmierung 2
T Overlay in anderer OpenGL Anwendung Spiele- und Multimedia-Programmierung 4
egrath Vista OpenGL Performance Problem? Spiele- und Multimedia-Programmierung 3
Y OpenGL Spiele- und Multimedia-Programmierung 5
J opengl beispiele? Spiele- und Multimedia-Programmierung 10
D Java mit OpenGL - besser LWJGL oder JOGL? Spiele- und Multimedia-Programmierung 6
N OpenGL und DirectX - was genau ist das? Spiele- und Multimedia-Programmierung 5
C OpenGl Support für Applet (sun.java2d.opengl=True) Spiele- und Multimedia-Programmierung 3
B OpenGL oder Direct X Spiele- und Multimedia-Programmierung 9
L Transparenz wird magenta Spiele- und Multimedia-Programmierung 3
aze Java3D:Farbige Flächen verschwinden lassen(Transparenz- oder Colorinterpolator?)) Spiele- und Multimedia-Programmierung 5
I JOGL: Problem mit Blending bei Billboards (Transparenz) Spiele- und Multimedia-Programmierung 2
L Java 3 D - Transparenz einzelner Punkte Spiele- und Multimedia-Programmierung 6
Z Transparenz in BufferedImage Spiele- und Multimedia-Programmierung 8
G Punkt in Image auf Transparenz prüfen Spiele- und Multimedia-Programmierung 6
G Transparenz - Geschwindigkeit Spiele- und Multimedia-Programmierung 3
G png transparenz geschwindigkeitsproblem Spiele- und Multimedia-Programmierung 2
L Skalierung von Bildern mit Transparenz Spiele- und Multimedia-Programmierung 7
S Fehlerhafte Darstellung durch Transparenz? Spiele- und Multimedia-Programmierung 8
D 2 Texturen & transparenz Spiele- und Multimedia-Programmierung 16
S transparenz per paint()-methode will nicht Spiele- und Multimedia-Programmierung 12

Ähnliche Java Themen

Neue Themen


Oben