OpenGL Blend Frage

Helgon

Bekanntes Mitglied
Hey, ich hab grade gemerkt, dass die Methode wie ich sie verwende (aus nem Tutorial) 2 Texturen überblenden zu lassen bei eingeschaltetem depth test nicht funktioniert (ist ja auch logisch weils 2x die gleiche position ist).

Gibts ne Elegantere Art das zu lösen als ich es tue, sodass der Depth test anbleiben kann? (außer die dreiecke an leicht andere Positionen zu verschieben)


Java:
		//glEnable(GL_DEPTH_TEST);         				
		glEnable(GL_CULL_FACE);  						
		
		glViewport(0, 0, 800, 600);							
		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();
		gluPerspective(45, 800 / 600, 0.1f, 1000);

		glMatrixMode(GL_MODELVIEW);
		glLoadIdentity();
		
		glTranslatef(0, 0 , -6f);

		while(!Display.isCloseRequested()){
			

			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
			 

			  glLoadIdentity();
			  gluLookAt(0,2,8,
			            0,0,0,
			            0,1,0);
			  glPushMatrix();
			  
			  glEnable(GL_BLEND);
			  glBlendFunc(GL_SRC_ALPHA,GL_ONE);
			  glColor4f(1,1,1,0.5f);
			  
				t1.bind();				
				glBindTexture(GL_TEXTURE_2D, t1.getTextureID());
				glBegin(GL_TRIANGLES);
					glTexCoord3f(-1,-1, 0);	glVertex3f(-1,-1,0); 
					glTexCoord3f(1,-1, 0);	glVertex3f(1,-1,0);
					glTexCoord3f(0,1, 0);	glVertex3f(0,1,0);
				glEnd();
				
				t2.bind();				
				glBindTexture(GL_TEXTURE_2D, t2.getTextureID());
				glBegin(GL_TRIANGLES);
					glTexCoord3f(-1,-1, 0);	glVertex3f(-1,-1,0); 
					glTexCoord3f(1,-1, 0);	glVertex3f(1,-1,0);
					glTexCoord3f(0,1, 0);	glVertex3f(0,1,0);
				glEnd();

Grüße
 
Zuletzt bearbeitet:
S

Spacerat

Gast
1. Kleiner Nachtrag zu einem Anderen Thread...(werd' ich der Vollständigkeit halber dort auch noch posten.) www.joachimrohde.com - Artikel

2. Bei Lektion 8 (Blending) ist dort nachzulesen, warum sich Transparenz (Blending) und Tiefentest gegeneinander ausschliessen (leider nicht automatisch :().
 

Helgon

Bekanntes Mitglied
Hab glaub ich an die 30 OpenGL Tutorial Seiten (unteranderem auch die gefunden xD), aber OpenGL ist wirklich nicht so wie "mal eben ne neue Sprache lernen".. man muss sich doch recht konzentrieren und rumprobieren, damit man auch wirklich weis was da passiert.. - Dachte erst, einfach mal paar Seiten horten, aber das dauert wohl bis ich durch bin xD

Wie gesagt, GLDelphi ist sau gut (auch auf den anderen Thread bezogen) - bin grad da auch bei Blending Tutorial Lektion 7 ? DGL Wiki deswegen die Frage :) Werd auch mal in deinen Link reinschauen und es mir durchlesen, danke :)
 
G

Guest2

Gast
Moin,

warum willst Du denn auch 2 verschiedene Dreiecke auf dieselbe Position legen?

Klingt, als ob Du evtl. nach "Multitexture" suchst?

Als Beispiel sieht das dann etwa so aus:
(Sorry, habe dazu gerade nur Code zur Hand, welchen Du nicht ausführen kannst. Sehe ihn als funktionierenden Pseudocode an und übersetze ihn in ein GL-Binding deiner Wahl. (Das geht mehr oder weniger 1:1))

Java:
public final class Multitexture<GLT extends GL21> extends GLCanvas<GLT> {

    private final List<TextureIO<GLT>> textures = new ArrayList<TextureIO<GLT>>();

    private GLT                        gl;


    public Multitexture() throws IOException {

        textures.add(new TextureIO<GLT>(getClass().getClassLoader().getResourceAsStream("1.png"), GLT.GL_TEXTURE0));
        textures.add(new TextureIO<GLT>(getClass().getClassLoader().getResourceAsStream("2.png"), GLT.GL_TEXTURE1));

    }


    @Override
    public void glInit(final GLT g) {

        gl = g;

        for (final TextureIO<GLT> texture : textures)
            texture.init(gl);

    }


    @Override
    public void glDisplay(final double deltaTime) {

        gl.glClear(GLT.GL_COLOR_BUFFER_BIT);
        gl.glLoadIdentity();


        textures.get(0).bind();

        gl.glTexEnvi(GLT.GL_TEXTURE_ENV, GLT.GL_TEXTURE_ENV_MODE, GLT.GL_DECAL);

        textures.get(1).bind();

        gl.glTexEnvi(GLT.GL_TEXTURE_ENV, GLT.GL_TEXTURE_ENV_MODE, GLT.GL_DECAL);


        gl.glBegin(GLT.GL_TRIANGLES);

        gl.glMultiTexCoord2f(textures.get(0).getUnit(), 0.0f, 0.0f);
        gl.glMultiTexCoord2f(textures.get(1).getUnit(), 0.0f, 0.0f);
        gl.glVertex3f(-1.0f, -1.0f, -0.5f);

        gl.glMultiTexCoord2f(textures.get(0).getUnit(), 1.0f, 0.0f);
        gl.glMultiTexCoord2f(textures.get(1).getUnit(), 1.0f, 0.0f);
        gl.glVertex3f(+1.0f, -1.0f, -0.5f);

        gl.glMultiTexCoord2f(textures.get(0).getUnit(), 0.5f, 1.0f);
        gl.glMultiTexCoord2f(textures.get(1).getUnit(), 0.5f, 1.0f);
        gl.glVertex3f(+0.0f, +1.0f, -0.5f);

        gl.glEnd();

        textures.get(0).unbind();
        textures.get(1).unbind();

    }


    @Override
    public void glReshape(final int x, final int y, final int width, final int height) {

        gl.glMatrixMode(GLT.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glMatrixMode(GLT.GL_MODELVIEW);
        gl.glLoadIdentity();

    }


    @Override
    public void glDispose() {

    }

}

Java:
public final class TextureIO<GLT extends GLActiveTexture & GLEnable & GLGenTextures & GLBindTexture & GLTexParameteri & GLTexImage2D & GLEnum11 & GLEnum12> {

    private final GLVoidBuffer texture;
    private final int          width;
    private final int          height;
    private final int          unit;

    private GLT                gl;
    private int                id;


    public TextureIO(final InputStream inputStream, final int unit) throws IOException {

        this.unit = unit;

        BufferedImage image = ImageIO.read(inputStream);

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

        final AffineTransform tx = AffineTransform.getScaleInstance(1, -1);
        tx.translate(0, -height);

        final AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
        image = op.filter(image, null);

        final int[] pixels = image.getRGB(0, 0, width, height, null, 0, width);
        texture = new GLVoidBuffer(pixels);

    }


    public void init(final GLT g) {

        gl = g;

        gl.glActiveTexture(unit);
        gl.glEnable(GLT.GL_TEXTURE_2D);

        final GLIntBuffer buffer = new GLIntBuffer(1);
        gl.glGenTextures(1, buffer);
        id = buffer.get(0);

        gl.glBindTexture(GLT.GL_TEXTURE_2D, id);
        gl.glTexParameteri(GLT.GL_TEXTURE_2D, GLT.GL_TEXTURE_MAG_FILTER, GLT.GL_LINEAR);
        gl.glTexParameteri(GLT.GL_TEXTURE_2D, GLT.GL_TEXTURE_MIN_FILTER, GLT.GL_LINEAR);

        gl.glTexImage2D(GLT.GL_TEXTURE_2D, 0, GLT.GL_RGBA8, width, height, 0, GLT.GL_BGRA, GLT.GL_UNSIGNED_INT_8_8_8_8_REV, texture);

        gl.glBindTexture(GLT.GL_TEXTURE_2D, 0);

    }


    public void bind() {

        gl.glActiveTexture(unit);
        gl.glBindTexture(GLT.GL_TEXTURE_2D, id);

    }


    public void unbind() {

        gl.glActiveTexture(unit);
        gl.glBindTexture(GLT.GL_TEXTURE_2D, 0);

    }


    public int getUnit() {

        return unit;

    }

}

Viele Grüße,
Fancy
 

Helgon

Bekanntes Mitglied
Hey danke für den ausführlichen Code. Ich hab mich damit und ein paar anderen Quellen noch mal hingesetzt und geguckt was ich noch machen kann.

Dann hab ichs endlich geschafft, einziges Problem bleibt jedoch, dass
Code:
glBlendFunc()
keine Rolle zu spielen scheint.

Das Überblenden sieht immer gleich aus, egal was für Parameter ich da mitgebe. Ne Idee worans liegt? Grüße

Java:
glEnable(GL_CULL_FACE);  						
		glEnable(GL_TEXTURE_2D);
		glShadeModel(GL_SMOOTH);
		glClearColor(0, 0, 0, 0.5f);
		glClearDepth(1.0);		       
		glEnable(GL_DEPTH_TEST);	       
		glDepthFunc(GL_LEQUAL);	       
		glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

		glViewport(0, 0, 800, 600);							
		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();
		gluPerspective(45, 800 / 600, 0.1f, 1000);

		glMatrixMode(GL_MODELVIEW);
		glLoadIdentity();
		
		t1.bind();
		t2.bind();
		  
		while(!Display.isCloseRequested()){
			
			glClearColor(0,0,0,0);
			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
			
			glLoadIdentity();
			glTranslatef(0, 0 , -6f);
			
			//  Texturen vorbereiten
			ARBMultitexture.glActiveTextureARB(ARBMultitexture.GL_TEXTURE0_ARB);
			glEnable(GL_TEXTURE_2D);
			glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);// Tex-Envroiment einstellen
			glBindTexture(GL_TEXTURE_2D, t1.getTextureID());
			
			ARBMultitexture.glActiveTextureARB(ARBMultitexture.GL_TEXTURE1_ARB);
			glEnable(GL_TEXTURE_2D);
			glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);// Tex-Envroiment einstellen
			glEnable(GL_BLEND);
			glBlendFunc(GL_ONE, GL_SRC_COLOR);
			glBindTexture(GL_TEXTURE_2D, t2.getTextureID());
			  
			glBegin(GL_QUADS);
				
				ARBMultitexture.glMultiTexCoord2fARB(ARBMultitexture.GL_TEXTURE0_ARB, 0, 0);
				ARBMultitexture.glMultiTexCoord2fARB(ARBMultitexture.GL_TEXTURE1_ARB, 0, 0);
				glVertex3f(-1,-1,0);
				
				ARBMultitexture.glMultiTexCoord2fARB(ARBMultitexture.GL_TEXTURE0_ARB, 1, 0);
				ARBMultitexture.glMultiTexCoord2fARB(ARBMultitexture.GL_TEXTURE1_ARB, 1, 0);
				glVertex3f(1,-1,0);
				
				ARBMultitexture.glMultiTexCoord2fARB(ARBMultitexture.GL_TEXTURE0_ARB, 1, 1);
				ARBMultitexture.glMultiTexCoord2fARB(ARBMultitexture.GL_TEXTURE1_ARB, 1, 1);
				glVertex3f(1,1,0);
				
				ARBMultitexture.glMultiTexCoord2fARB(ARBMultitexture.GL_TEXTURE0_ARB, 0, 1);
				ARBMultitexture.glMultiTexCoord2fARB(ARBMultitexture.GL_TEXTURE1_ARB, 0, 1);
				glVertex3f(-1,1,0);
				
			glEnd();
					 
			
			Display.update();
			Display.sync(60);
		}
 
G

Guest2

Gast
Wie die Farbwerte kombiniert werden, hängt bei der fixed function pipeline vom texture env mode ab. Gesetzt wird dieser über den 3. Parameter bei glTexEnvi (für jede Textur einzeln). Die "normalen" Werte (GL_MODULATE, GL_DECAL, GL_BLEND, GL_REPLACE) sind z.B. bei DGL erklärt. Weitere Kombinationsmöglichkeiten ergeben sich über GL_COMBINE, was z.B. ebenfalls bei DGL erklärt ist.

Nach Möglichkeit solltest Du die ARB-Versionen der Methoden meiden. Also statt [c]ARBMultitexture.glActiveTextureARB[/c] besser [c]GL13.glActiveTexture[/c].


Viele Grüße,
Fancy
 
S

Spacerat

Gast
Also wie gesagt... wenn GL_BLEND aktiv ist, muss GL_DEPTH_TEST disabled sein. Transparente Polygone muss man halt selber auf der orthogonalen Z-Achse sortieren und von hinten nach vorne zeichnen und zwar nachdem man mit dem Zeichnen aller undurchsichtigen Polygone fertig ist. Alles andere verfälscht das Endergebnis.
 

Helgon

Bekanntes Mitglied
@Spacerat: Das ist nicht das Problem weil
Java:
		glEnable(GL_DEPTH_TEST);	       
		glDepthFunc(GL_LEQUAL);
@Guest: Ich hab jetzt mal alle ARB durch GL13 ersetzt.

Ich hab mal versucht es IRGENDWIE! mit einander zu verblenden

Java:
	t1.bind();
			t2.bind();

			//  Texturen vorbereiten
			GL13.glActiveTexture(GL13.GL_TEXTURE0);
			glEnable(GL_TEXTURE_2D);
			glBindTexture(GL_TEXTURE_2D, t1.getTextureID());
			
			GL13.glActiveTexture(GL13.GL_TEXTURE1);
			glEnable(GL_TEXTURE_2D);
			glTexEnvi(GL_TEXTURE_ENV, GL13.GL_COMBINE_RGB, GL13.GL_INTERPOLATE);
			glEnable(GL_BLEND);
			glBindTexture(GL_TEXTURE_2D, t2.getTextureID());

			  
			glBegin(GL_QUADS);
				
				GL13.glMultiTexCoord2f(GL13.GL_TEXTURE0, 0, 1);
				GL13.glMultiTexCoord2f(GL13.GL_TEXTURE1, 0, 1);
				glVertex3f(-1,-1,0);
				
				GL13.glMultiTexCoord2f(GL13.GL_TEXTURE0, 1, 1);
				GL13.glMultiTexCoord2f(GL13.GL_TEXTURE1, 1, 1);
				glVertex3f(1,-1,0);
				
				GL13.glMultiTexCoord2f(GL13.GL_TEXTURE0, 1, 0);
				GL13.glMultiTexCoord2f(GL13.GL_TEXTURE1, 1, 0);
				glVertex3f(1,1,0);
				
				GL13.glMultiTexCoord2f(GL13.GL_TEXTURE0, 0, 0);
				GL13.glMultiTexCoord2f(GL13.GL_TEXTURE1, 0, 0);
				glVertex3f(-1,1,0);
				
			glEnd();

egal was ich da einsetze, hab einfach mal alles mögliche aus der Wiki und Source den ich aus Tutorials hab genommen, bei keinem verändert sich der Blendmodus.

Jedoch verändert sich dieser je nachdem wo ich t1 und t2 binde

Wo sollte man es denn richtiger weise machen?

Haste vllt gradn Beispiel, dass auch Funktioniert, weil wie gesagt, ich hab wie dumm rumprobiert mit dem glTexEnv aber nix bringt bei mir ne Veränderung :/

Grüße
 
G

Guest2

Gast
Vielleicht noch zur Klarstellung, das, was mit [c]glEnable(GL BLEND)[/c] aktiviert wird, beschreibt, wie der Wert eines Pixels im Framebuffer durch ein neues Fragment beeinflusst wird. Das ist dann abhängig vom depth buffer. "Multitexture" bedeutet aber das auf einer Geometrie mehrere Texturen aufgelegt werden. Das wiederum ist dann unabhängig vom depth buffer und unabhängig vom [c]glEnable(GL BLEND)[/c].

Das Beispiel von oben 1:1 nach LWJGL übersetzt (und um GL_COMBINE statt GL_MODULATE ergänzt) ergibt:

Java:
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL13;

public class Multitexture {

    private final List<TextureIO> textures = new ArrayList<TextureIO>();


    public Multitexture() throws IOException {

        textures.add(new TextureIO(getClass().getClassLoader().getResourceAsStream("1.png"), GL13.GL_TEXTURE0));
        textures.add(new TextureIO(getClass().getClassLoader().getResourceAsStream("2.png"), GL13.GL_TEXTURE1));

    }


    public void init() throws LWJGLException {

        Display.setDisplayMode(new DisplayMode(500, 500));
        Display.create();

        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GL11.glMatrixMode(GL11.GL_MODELVIEW);
        GL11.glLoadIdentity();

        for (final TextureIO texture : textures)
            texture.init();

    }


    public void display() {

        while (!Display.isCloseRequested()) {

            GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
            GL11.glLoadIdentity();


            textures.get(0).bind();
            GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_REPLACE);


            textures.get(1).bind();
            GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL13.GL_COMBINE);
            GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_RGB, GL11.GL_ADD);
            GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_RGB, GL11.GL_TEXTURE);
            GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_RGB, GL13.GL_PREVIOUS);


            GL11.glBegin(GL11.GL_TRIANGLES);

            GL13.glMultiTexCoord2f(textures.get(0).getUnit(), 0.0f, 0.0f);
            GL13.glMultiTexCoord2f(textures.get(1).getUnit(), 0.0f, 0.0f);
            GL11.glVertex3f(-1.0f, -1.0f, -0.5f);

            GL13.glMultiTexCoord2f(textures.get(0).getUnit(), 1.0f, 0.0f);
            GL13.glMultiTexCoord2f(textures.get(1).getUnit(), 1.0f, 0.0f);
            GL11.glVertex3f(+1.0f, -1.0f, -0.5f);

            GL13.glMultiTexCoord2f(textures.get(0).getUnit(), 0.5f, 1.0f);
            GL13.glMultiTexCoord2f(textures.get(1).getUnit(), 0.5f, 1.0f);
            GL11.glVertex3f(+0.0f, +1.0f, -0.5f);

            GL11.glEnd();


            textures.get(0).unbind();
            textures.get(1).unbind();


            Display.update();

        }

        Display.destroy();

    }


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

        final Multitexture multitexture = new Multitexture();
        multitexture.init();
        multitexture.display();

    }
}

Java:
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.nio.IntBuffer;

import javax.imageio.ImageIO;

import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
import org.lwjgl.opengl.GL13;


public class TextureIO {

    private final IntBuffer texture;
    private final int       width;
    private final int       height;
    private final int       unit;

    private int             id;


    public TextureIO(final InputStream inputStream, final int unit) throws IOException {

        this.unit = unit;

        BufferedImage image = ImageIO.read(inputStream);

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

        final AffineTransform tx = AffineTransform.getScaleInstance(1, -1);
        tx.translate(0, -height);

        final AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
        image = op.filter(image, null);

        final int[] pixels = image.getRGB(0, 0, width, height, null, 0, width);
        texture = BufferUtils.createIntBuffer(pixels.length);
        texture.put(pixels);
        texture.rewind();

    }


    public void init() {

        GL13.glActiveTexture(unit);
        GL11.glEnable(GL11.GL_TEXTURE_2D);

        final IntBuffer buffer = BufferUtils.createIntBuffer(1);
        GL11.glGenTextures(buffer);
        id = buffer.get(0);

        GL11.glBindTexture(GL11.GL_TEXTURE_2D, id);
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);

        GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, width, height, 0, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, texture);

        GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);

    }


    public void bind() {

        GL13.glActiveTexture(unit);
        GL11.glBindTexture(GL11.GL_TEXTURE_2D, id);

    }


    public void unbind() {

        GL13.glActiveTexture(unit);
        GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);

    }


    public int getUnit() {

        return unit;

    }


}

Viele Grüße,
Fancy
 
S

Spacerat

Gast
Das ist nicht das Problem weil
Java:
		glEnable(GL_DEPTH_TEST);	       
		glDepthFunc(GL_LEQUAL);
...Ich hab mal versucht es IRGENDWIE! mit einander zu verblenden...
...bei keinem verändert sich der Blendmodus.
Hmm... ignorier mich ruhig aber nicht die Fakten... :lol:
Java:
glDisable(GL_DEPTH_TEST); // !!!
glEnable(GL_BLEND); // !!!
Man kann es nicht oft genug sagen, auch wenn die Polygone eine Multitextur bekommen sollen. Blending wird zum zeichnen von Tranzparenz benutzt.
Nun gut... vllt. geht es ja gar nicht um Tranzparenz sondern darum, dass eine Multitextur anscheinend nicht richtig dargestellt wird, egal in welchem Modus man zeichnet.
Wie ich über Multitexturen informiert bin:
1. Jede Textur hat genau einen Farbkanal (Color).
2. Bei Multitexturen können wahlweise noch Bump, Light, Blend usw. als Kanal hinzugefügt werden.
3.1 Bump- und Light-Kanäle sind nur sichtbar, wenn Lightning aktiviert wurde
3.2.1 Der Blend-Kanal ist nur sichtbar, wenn Blending aktiviert wurde.
3.2.2 Tranzparenz zeichnet man am Ende der Szene mit abgeschaltetem Tiefenpuffer polygonweise von fern nach nah.
Und natürlich... Guest2 hat vollkommen recht. Texturen ist es vollkommen egal, wann und in welchem Modus sie erstellt oder verwendet werden. Ihre Capabilities (z.B. bei Multitexturen) werden aber halt erst in entsprechenden Modi sichtbar.
 

Helgon

Bekanntes Mitglied
Hey, erneut danke ich für die Antworten.

In nem anderen Forum hab ich die "klick machende Antwort" bekommen - Multitexturen sind nicht zum mit einander verblenden gedacht xD

Da hab ich wohl versucht mim Traktor zu fliegen. Klappt vllt wenn man sich von der Klippe stürzt, aber richtig funktionieren will es wohl doch nicht :p

Hab mich dann umentschieden erstmal Nehe durchzuarbeiten, weil da einfach erstmal "Noob freundlicher" auf alles eingegangen wird. Bei der DGL wird mir einfach zu viel weggelassen und die Delphi Syntax... brauch ich was dazu sagen? :D Da krieg ich Kopfschmerzen.


Aber auf jeden Fall Danke! Die nächsten Fragen werden wohl nicht lange auf sich warten lassen :)
 
G

Guest2

Gast
Ob Multitexturen das richtige Mittel sind, hängt davon ab was Du exakt erreichen möchtest. Möchtest Du das was Dein erster Quelltext suggeriert und was in Deinem Link zum DGL Tutorial beschrieben wird, dann sind sie geeignet (die werden sogar am ende des Tutorial angesprochen). Möchtest Du was anderes erreichen, dann vielleicht auch nicht.

Viele Grüße,
Fancy
 

Helgon

Bekanntes Mitglied
Ich wollte eigentlich 3 Texturen vermischen.

Mal ne etwas andere Frage dann.

Wenn ich 2 Texturen habe.

Eine ist ne Blend Map (schwarz weiß)
Das andere die Textur.

Wenn ich dann normal die Textur mit
Code:
glBlendFunc(GL_ZERO,GL_SRC_COLOR);
drüber lege, legt sich die Textur ja nur über die weißen stellen.

Wie krieg ichs hin eine andere Textur über die schwarzen zu legen? Mit irgend nem Blendmodus oder Multitexturing?

Grüße

P.S.: Zur verständniss nochmal
So soll es am Ende aussehen.
Vorher wäre das gras bspw weiß und wo die Stein textur liegt schwarz

blend2.jpg
 
Zuletzt bearbeitet:
G

Guest2

Gast
Da das Ganze eine Fläche ist, werden dazu Multitexturen eingesetzt. Lediglich vor 1998 wurde dazu noch Blending verwendet. Heute wird Blending aber nur noch eingesetzt um durch eine Fläche hindurch auf eine andere (weiter hinten liegende) Oberfläche sehen zu können. Eigentlich ist das dann auch weniger Blending sondern meint vielmehr Transparency bzw. Translucency.

Bei der Anwendung von Multitexturen auf einer fixed function pipeline wird das Verhalten der einzelnen Texturen ausschließlich über glTexEnvi gesteuert.

Bei dem Bild in deinem Beispiel gibt es 2 Möglichkeiten:

1.: 3 verschiedene Texturen: 1x Stein, 1x Grass, 1x Blendmap (Alpha-Kanal)
2.: 2 verschiedene Texturen: 1x Stein, 1x Grass, Alpha wird aus der Stein- oder Grass- Textur gewählt.


Variante 1 sieht dann z.B. so aus:
(von blendmap.png wird nur der Alpha-Kanal genutzt, TextureIO wie oben)

Java:
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL13;

public class Multitexture {

    private final List<TextureIO> textures = new ArrayList<TextureIO>();


    public Multitexture() throws IOException {

        textures.add(new TextureIO(getClass().getClassLoader().getResourceAsStream("blendmap.png"), GL13.GL_TEXTURE0));
        textures.add(new TextureIO(getClass().getClassLoader().getResourceAsStream("rock.png"), GL13.GL_TEXTURE1));
        textures.add(new TextureIO(getClass().getClassLoader().getResourceAsStream("gras.png"), GL13.GL_TEXTURE2));

    }


    public void init() throws LWJGLException {

        Display.setDisplayMode(new DisplayMode(500, 500));
        Display.create();

        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GL11.glMatrixMode(GL11.GL_MODELVIEW);
        GL11.glLoadIdentity();

        for (final TextureIO texture : textures)
            texture.init();

        textures.get(0).bind();
        GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_REPLACE);

        textures.get(1).bind();
        GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL13.GL_COMBINE);
        GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_RGB, GL11.GL_REPLACE);
        GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_RGB, GL11.GL_TEXTURE);
        GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR);
        GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_ALPHA, GL11.GL_REPLACE);
        GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_ALPHA, GL13.GL_PREVIOUS);
        GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_ALPHA, GL11.GL_SRC_ALPHA);

        textures.get(2).bind();
        GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL13.GL_COMBINE);
        GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_RGB, GL13.GL_INTERPOLATE);
        GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_RGB, GL13.GL_PREVIOUS);
        GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR);
        GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_RGB, GL11.GL_TEXTURE);
        GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_RGB, GL11.GL_SRC_COLOR);
        GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE2_RGB, GL13.GL_PREVIOUS);
        GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND2_RGB, GL11.GL_SRC_ALPHA);

    }


    public void display() {

        while (!Display.isCloseRequested()) {

            GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
            GL11.glLoadIdentity();

            textures.get(0).bind();
            textures.get(1).bind();
            textures.get(2).bind();


            GL11.glBegin(GL11.GL_TRIANGLES);

            GL13.glMultiTexCoord2f(textures.get(0).getUnit(), 0.0f, 0.0f);
            GL13.glMultiTexCoord2f(textures.get(1).getUnit(), 0.0f, 0.0f);
            GL13.glMultiTexCoord2f(textures.get(2).getUnit(), 0.0f, 0.0f);
            GL11.glVertex3f(-1.0f, -1.0f, -0.5f);

            GL13.glMultiTexCoord2f(textures.get(0).getUnit(), 1.0f, 0.0f);
            GL13.glMultiTexCoord2f(textures.get(1).getUnit(), 1.0f, 0.0f);
            GL13.glMultiTexCoord2f(textures.get(2).getUnit(), 1.0f, 0.0f);
            GL11.glVertex3f(+1.0f, -1.0f, -0.5f);

            GL13.glMultiTexCoord2f(textures.get(0).getUnit(), 0.5f, 1.0f);
            GL13.glMultiTexCoord2f(textures.get(1).getUnit(), 0.5f, 1.0f);
            GL13.glMultiTexCoord2f(textures.get(2).getUnit(), 0.5f, 1.0f);
            GL11.glVertex3f(+0.0f, +1.0f, -0.5f);

            GL11.glEnd();


            textures.get(0).unbind();
            textures.get(1).unbind();
            textures.get(2).unbind();


            Display.update();

        }

        Display.destroy();

    }


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

        final Multitexture multitexture = new Multitexture();
        multitexture.init();
        multitexture.display();

    }
}

(als Shader wäre das übrigens ein übersichtlicher 1-Zeiler, hat schon seinen Grund, warum der ganze Schmu depricatet ist.)

Viele Grüße,
Fancy
 
S

Spacerat

Gast
Eigentlich ist das dann auch weniger Blending sondern meint vielmehr Transparency bzw. Translucency.
Nee nee, des ist schon Blending... Allerdings ausschliesslich Alpha-Blending (Transparency bzw. Translucency :lol:) und nichts anderes. Soweit ich mich erinner, gab es GL_BLEND schon anno 1995 bei Mesa 3D (realisierung einer OpenGL-Schnittstelle für diverse Platformen unter anderem auch AmigaOS). Warum es blos GL_BLEND statt GL_ALPHA_BLENDING hies, lässt sich wohl nur damit erklären, weil man andere Blendings bzw. Mappings (für damalige Verhältnisse fallen mir da auf Anhieb nur noch Bumpmaps ein) eigentlich gar nicht brauchte, da sie nur auf Licht reagierten und deswegen im Tiefenpuffer gleich mitbeachtet werden konnten. Transparenz war etwas ganz anderes und konnte von Anfang an nicht im Tiefenpuffer realisiert werden, weil dort ohne Rücksichtnahme auf einen vorhandenen Alpha-Kanal gezeichnet wurde (bzw. immer noch wird?).
"Multitexturing" gab's übrigens auch schon vor den Riva TNTs, jedoch nur "softwareemuliert". Dazu wurden halt (wie es heute durch die Hardware geschieht) die einzelnen Pixel von zwei oder drei Texturen miteinander per Algorithmus verknüpft, bevor sie an den Texturpuffer der GraKa übergeben wurden.
 
G

Guest2

Gast
Nee nee, des ist schon Blending... Allerdings ausschliesslich Alpha-Blending (Transparency bzw. Translucency :lol:) und nichts anderes.

Ich bezog mich damit auf dem hier:

http://www.opengl.org/resources/faq/technical/transparency.htm hat gesagt.:
15.010 What is the difference between transparent, translucent, and blended primitives?

A transparent physical material shows objects behind it as unobscured and doesn't reflect light off its surface. Clear glass is a nearly transparent material. Although glass allows most light to pass through unobscured, in reality it also reflects some light. A perfectly transparent material is completely invisible.

A translucent physical material shows objects behind it, but those objects are obscured by the translucent material. In addition, a translucent material reflects some of the light that hits it, making the material visible. Physical examples of translucent materials include sheer cloth, thin plastic, and smoked glass.

Transparent and translucent are often used synonymously. Materials that are neither transparent nor translucent are opaque.

Blending is OpenGL's mechanism for combining color already in the framebuffer with the color of the incoming primitive. The result of this combination is then stored back in the framebuffer. Blending is frequently used to simulate translucent physical materials. One example is rendering the smoked glass windshield of a car. The driver and interior are still visible, but they are obscured by the dark color of the smoked glass.


Soweit ich mich erinner, gab es GL_BLEND schon anno 1995 bei Mesa 3D (realisierung einer OpenGL-Schnittstelle für diverse Platformen unter anderem auch AmigaOS). Warum es blos GL_BLEND statt GL_ALPHA_BLENDING hies, lässt sich wohl nur damit erklären, weil man andere Blendings bzw. Mappings (für damalige Verhältnisse fallen mir da auf Anhieb nur noch Bumpmaps ein) eigentlich gar nicht brauchte[..]

Mesa 3D nutzt die OpenGL API. In OpenGL ist glBlendFunc ab Version 1.1 enthalten, welche im Januar 1997 veröffentlicht wurde. Seit Anfang an gibt es auch z.B. GL_ONE welches für additives blending genutzt wird, bei dem kein Alpha-Wert berücksichtigt wird.

Viele Grüße,
Fancy
 
S

Spacerat

Gast
Ich bezog mich damit auf dem hier:...
Okay... nichts davon widerlegt meine Aussage.
Mesa 3D nutzt die OpenGL API.
Tja... Schnittstellen tun halt so... wäre ja Schlimm, wenn OpenGL-Schnittstellen die DirectX-API nutzen würden.
In OpenGL ist glBlendFunc ab Version 1.1 enthalten, welche im Januar 1997 veröffentlicht wurde. Seit Anfang an gibt es auch z.B. GL_ONE welches für additives blending genutzt wird, bei dem kein Alpha-Wert berücksichtigt wird.
Das wäre dann wohl die Erklärung dafür, warum Transparency-Maps anfangs nur Monochrome sein brauchten bzw. durften.[/QUOTE]
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
Streeber Problem mit Transparenz/TextDrawing in LWJGL/Slick2d (OpenGL) Spiele- und Multimedia-Programmierung 1
RalleYTN OpenGL Context im JFrame? Spiele- und Multimedia-Programmierung 0
L OpenGL TransformationMatrix eines Flugzeugs Spiele- und Multimedia-Programmierung 2
F OpenGL - Transparenz mit Depth Peeling Spiele- und Multimedia-Programmierung 0
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
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
BattleMaster246 OpenGL - Transparenz Spiele- und Multimedia-Programmierung 10
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
D *.blend Dateien in 3ds umwandeln? Spiele- und Multimedia-Programmierung 2
I .blend Importieren Spiele- und Multimedia-Programmierung 2
N Minecraft Frage für einen Minecraft Server Spiele- und Multimedia-Programmierung 2
G [Java/KryoNet/LibGDX] Mutliplayer Packet Frage Spiele- und Multimedia-Programmierung 2
G [Java Server] Allgemeine Frage zum Thema Networking in Videospielen Spiele- und Multimedia-Programmierung 15
J Frage zum Einlesen einer .wav in ein byte Array Spiele- und Multimedia-Programmierung 3
S ImageSlider frage Spiele- und Multimedia-Programmierung 3
Anfänger2011 Minimap: Theoretische Frage zur Umsetzung Spiele- und Multimedia-Programmierung 2
Androbin Kollisions-Frage Spiele- und Multimedia-Programmierung 8
windl Frage zu Airplay und zur Mitarbeit bei einer Mediaanlage Spiele- und Multimedia-Programmierung 0
S LWJGL Kamera Frage Spiele- und Multimedia-Programmierung 2
P Frage zu einem Projekt "Einarmiger Bandit" 3 Walzen / 9 Zeichnungen BLUEJ Spiele- und Multimedia-Programmierung 10
Guybrush Threepwood Ketzerische Frage: Opus-Codec für Java Spiele- und Multimedia-Programmierung 14
Kenan89 Theoretische Frage zu Tile Spielkarten Spiele- und Multimedia-Programmierung 9
R Tileloader Frage Spiele- und Multimedia-Programmierung 2
S Frage: NullPointer, aber warum? Spiele- und Multimedia-Programmierung 8
J Anfänger Frage wie adden? Spiele- und Multimedia-Programmierung 9
R Frage zur Kollision Spiele- und Multimedia-Programmierung 5
M.F.G. Spielvorstellung (plus KI frage): Connect Four – Extreme Spiele- und Multimedia-Programmierung 11
P Frage bzgl. TextAdventure Spiele- und Multimedia-Programmierung 11
K Frage zur 3D Entwicklung zwecks vorhandener Engines Spiele- und Multimedia-Programmierung 17
V Frage zu AffineTransforms Spiele- und Multimedia-Programmierung 2
N frage zu der mp3spi Spiele- und Multimedia-Programmierung 2
J Frage zu Threads Spiele- und Multimedia-Programmierung 5
C Frage zu Ray-Picking mit JOGL Spiele- und Multimedia-Programmierung 13
M VRML Loader(noob Frage) ^^ Spiele- und Multimedia-Programmierung 3
M Prinzipielle Frage: Kann Java Grafiken ausschneiden? Spiele- und Multimedia-Programmierung 3

Ähnliche Java Themen

Neue Themen


Oben