Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Checkpoint 12. 04. 2014, 00:56:51
-
Zdravím,
potřeboval bych pomoci se školním projektem. Jedná se o semestrální práci z oblasti OpenGL, konkrétně úlohy nad 2D obrazem, má být psaný v Javě. Potřeboval bych tedy pomoci vůbec se začátkem - představoval jsem si to tak, že do JOGLu dostanu vedle sebe dvakrát ten stejný obrázek, na jeden potom aplikuji kompresi a budu sledovat změny a tak... Začínám ale zjišťovat, že mi pořádně ani nejde nahrát obrázek do JOGLU, vždycky to dopadne tak nějak... podivně. Je tu tedy prosím někdo, kdo by mi dokázal říct, jak do toho JOGLU aspoň dostat validně ten obrázek, aby se s ním pak dalo dál pracovat - tedy aplikovat nějakou tu kompresi? Nebo jestli myslíte, že pro to JOGL není absolutně vhodný a mám to psát v něčem jiném? Předem díky za každou radu, moc si toho cením.
-
Co tohle? http://www.java-gaming.org/index.php?topic=20449.0 (http://www.java-gaming.org/index.php?topic=20449.0)
Napiš co to dělá divného.
-
Díky za odpověď, to vypadá slibně. Jenom, jak tak na to koukám, co přesně se dosadí místo imgID, v té druhé části kódu?
-
Díky za odpověď, to vypadá slibně. Jenom, jak tak na to koukám, co přesně se dosadí místo imgID, v té druhé části kódu?
Ej, to je ID obrázku se kterým pracuješ. Je to vlastně pozice v těchto polích:
public static ByteBuffer _32BITImages[] = new ByteBuffer[32];
public static int _Width[]= new int[32];
public static int _Height[]= new int[32];
ID obrázků se určuje v téhle funkci:
Load32BitImg(String name,int id,java.awt.GraphicsDevice GD,boolean trans)
Btw, ty tři pole by bylo elegantnější nahradit jednou třídou a tu pak cpát do nějakého kontejneru, když už to děláš v té javě, tak to po tabě asi stějně budou chtít. Pak by jsi mohl nahradit i tu proměnnou ID static int, která by se při nahrání každého nového obrázku inkrementovala, tak bude míň prostoru pro chybu. Taky se jim asi nebude líbit použití statické třídy, zkus použít singleton.
Jinak nechci tě strašit, jestli to ale s javou, a programováním vůbec, myslíš vážně, tak to ID je věc, na kterou by jsi měl přinít sám ;)
-
Vím že mi java moc nejde, ten předmět ale udělat musím :/ Vím že na to moc nemám hlavu, ale jak přesně tedy zjistím to ID? Tu hodnotu těch polí co bych tam měl dosadit? Ta metoda nic nevrací a pouze na nějaké ID nastaví ty hodnoty, přijde mi ale, že nikde není definované, na jaké ID. Asi Ti teď připadám vcelku jako tupec, ale vážně mi z celé javy jde hlava kolem :)
-
Vím že mi java moc nejde, ten předmět ale udělat musím :/ Vím že na to moc nemám hlavu, ale jak přesně tedy zjistím to ID? Tu hodnotu těch polí co bych tam měl dosadit? Ta metoda nic nevrací a pouze na nějaké ID nastaví ty hodnoty, přijde mi ale, že nikde není definované, na jaké ID. Asi Ti teď připadám vcelku jako tupec, ale vážně mi z celé javy jde hlava kolem :)
No dobře, v tom jejich programu si to ID zvolíš sám jako argument té funkce load32bitImg, bude to číslo od nuly do jednatřiceti, dvaatřicet je velikost těch polí. Nemá to nic společného s tím, že to pracuje s 32bit obrázkama. Ten obrázek je z pixelů, kde každý pixel je ze čtyř osmibitových barev, red, green, blue a alpha, alpha je průsvitnost. A 8*4=32.
Kdyby jsi třeba potřeboval pracovat s více obrázkama, než je těch třicet dva, tak můžeš vytvořit třeba i větší pole, například public static int pole[]=new int[123];
ID by jsi si pak vybíral z intervalu 0-122.
Jak už jsem ale psal, tohle řešení s polema mi připadá trochu divné. Vyrobil bych si v projektu další třídu, třeba s názvem Img32 která by šířku a výšku měla jako atributy:
class Img32
{
private int sirka,vyska;
private ByteBuffer data_b;
public Img32(int sirka,int vyska,ByteBuffer data_b)
{
this.sirka=sirka;
this.vyska=vyska;
this.data_b=data_b;
}
public void clear()
{
data_b.clear();
}
public int getW(){return sirka;}
public int getH(){return vyska;}
public ByteBuffer getData{return data_b;}
}
Upravil bych tu loadovací funkci :
public static Img32 Load32BitImg(String name,java.awt.GraphicsDevice GD,boolean trans){
Img32 obrazek=null;
try{
Image imgTemp;
imgTemp = (Image)ImageIO.read(new File(name));
ByteBuffer buf;
//System.out.println("Found File");
BufferedImage Bimg = GD.getDefaultConfiguration().createCompatibleImage(imgTemp.getWidth(null),imgTemp.getHeight(null),Color.BITMASK);
Bimg.getGraphics().drawImage(imgTemp,0,0,null);
if (trans)
setBTrans(Bimg,Bimg.getRGB(0,Bimg.getHeight()-1));
buf = ByteBuffer.allocateDirect((Bimg.getWidth()*Bimg.getHeight())*4);
for (int y = 0; y< Bimg.getHeight();y++){
for (int x = 0; x< Bimg.getWidth();x++)
buf.putInt(fixRGB(Bimg.getRGB(x, Bimg.getHeight()-y-1)));
}//END FOR LOOP
//System.out.println("BUFFER MADE");
obrazek=new Img32(Bimg.getWidth(),Bimg.getHeight(),buf);
}catch(IOException ie){
System.out.println("Error Reading Image");
}//END TRY AND CATCH STATEMENT
return obrazek;
}//END METHOD
}//END CLASS
s obrázkem, co ti ta funkce vyplivne, by se pak pracovalo takhle:
tempGL.glEnable(GL.GL_BLEND);
obrazek.clear();
tempGL.glRasterPos2i(X Position,Y Position);
tempGL.glDrawPixels(obrazek.getW(),
obrazek.getH(),
GL.GL_RGBA,
GL.GL_UNSIGNED_INT_8_8_8_8_REV,
obrazek.getData());
tempGL.glDisable(GL.GL_BLEND);
Snad se už chytáš. Dneska je snad mezinárodní den trpělivosti, nebo co ;D
Je mi teda záhdou, jak jsi se dostal až k openGL bez znalosti programování. Naučit se programovat není zase tak těžký, jak se možná na první, zděšený, pohled může zdát, člověk na to nemusí být zrovna Ajnštajn, je to jenom o tom že do toho investuješ čas a hlavně se to musíš učit od jednoduššího po složitější, začínat rovnou s openGL není zrovna moc šťastný nápad. Zkus se třeba kouknout na pár tutoriálů od tohodletoho chlapa: http://www.youtube.com/watch?v=Hl-zzrqQoSE&list=PLFE2CE09D83EE3E28 (http://www.youtube.com/watch?v=Hl-zzrqQoSE&list=PLFE2CE09D83EE3E28)
-
Vau, děkuju za tvou trpělivost, vážně! Chápu tedy dobře, že tu poslední část kódu můžu zavolat z OGLRendereru v display metodě?
-
Vau, děkuju za tvou trpělivost, vážně! Chápu tedy dobře, že tu poslední část kódu můžu zavolat z OGLRendereru v display metodě?
Nevím jak to tam máš ve svém projektu pojmenované, tady jsem ale našel jeden základní tutoriál na kreslení trojúhelníku, https://sites.google.com/site/justinscsstuff/jogl-tutorial-3 (https://sites.google.com/site/justinscsstuff/jogl-tutorial-3), jejich zdrojový kód je tady: package windows;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.opengl.*;
import javax.media.opengl.awt.GLCanvas;
import com.jogamp.opengl.util.*;
public class SimpleScene implements GLEventListener {
private double theta = 0;
private double s = 0;
private double c = 0;
public static void main(String[] args) {
GLProfile glp = GLProfile.getDefault();
GLCapabilities caps = new GLCapabilities(glp);
GLCanvas canvas = new GLCanvas(caps);
Frame frame = new Frame("AWT Window Test");
frame.setSize(300, 300);
frame.add(canvas);
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
canvas.addGLEventListener(new SimpleScene());
Animator animator = new FPSAnimator(canvas, 60);
animator.add(canvas);
animator.start();
}
@Override
public void display(GLAutoDrawable drawable) {
update();
render(drawable);
}
@Override
public void dispose(GLAutoDrawable drawable) {
}
@Override
public void init(GLAutoDrawable drawable) {
}
@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
}
private void update() {
theta += 0.01;
s = Math.sin(theta);
c = Math.cos(theta);
}
private void render(GLAutoDrawable drawable) {
GL2 gl = drawable.getGL().getGL2();
gl.glClear(GL.GL_COLOR_BUFFER_BIT);
// draw a triangle filling the window
gl.glBegin(GL.GL_TRIANGLES);
gl.glColor3f(1, 0, 0);
gl.glVertex2d(-c, -c);
gl.glColor3f(0, 1, 0);
gl.glVertex2d(0, c);
gl.glColor3f(0, 0, 1);
gl.glVertex2d(s, -s);
gl.glEnd();
}
}
Tady jsem to přepsal, aby to pracovalo s těma našema obrázkama:
import java.awt.Frame;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.opengl.*;
import javax.media.opengl.awt.GLCanvas;
import com.jogamp.opengl.util.*;
public class SimpleScene implements GLEventListener {
private Img32 obrazekNalevo,obrazekNapravo;
private Img32Loader loader;
private FPSAnimator animator;
public static void main(String[] args) {
GLProfile glp = GLProfile.getDefault();
GLCapabilities caps = new GLCapabilities(glp);
GLCanvas canvas = new GLCanvas(caps);
SimpleScene scena=new SimpleScene();
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd=ge.getDefaultScreenDevice();
scena.loader=new Img32Loader();
scena.obrazekNalevo=scena.loader.Load32BitImg("obr1.jpg", gd, false);
scena.obrazekNapravo=scena.loader.Load32BitImg("obr2.jpg", gd, false);
Frame frame = new Frame("AWT Window Test");
frame.setSize(scena.obrazekNalevo.getW()*2,scena.obrazekNalevo.getH());
frame.add(canvas);
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
scena.animator = new FPSAnimator(canvas, 60);
scena.animator.add(canvas);
scena.animator.start();
canvas.addGLEventListener(scena);
}
@Override
public void display(GLAutoDrawable drawable) {
update();
render(drawable);
}
@Override
public void dispose(GLAutoDrawable drawable) {
animator.stop();
}
@Override
public void init(GLAutoDrawable drawable) {
}
@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
}
private void update() {
}
private void render(GLAutoDrawable drawable) {
GL2 gl = drawable.getGL().getGL2();
gl.glClear(GL.GL_COLOR_BUFFER_BIT);
gl.glEnable(GL.GL_BLEND);
obrazekNalevo.clear();
obrazekNapravo.clear();
gl.glRasterPos2d(-1.0,-1.0);
gl.glDrawPixels(obrazekNalevo.getW(),
obrazekNalevo.getH(),
GL2.GL_RGBA,
GL2.GL_UNSIGNED_INT_8_8_8_8_REV,
obrazekNalevo.getData());
gl.glRasterPos2d(0.0,-1.0);
gl.glDrawPixels(obrazekNapravo.getW(),
obrazekNapravo.getH(),
GL2.GL_RGBA,
GL2.GL_UNSIGNED_INT_8_8_8_8_REV,
obrazekNapravo.getData());
gl.glDisable(GL.GL_BLEND);
}
}
Testoval jsem to a v pohodě to frčí. Když už to pišu za tebe, tak si alespoň najdi čas ten zdroják prozkoumat ;D
-
Funguje to neuvěřitelně skvěle, moc ti děkuji za vše! Slibuju že si ho celý prostuduju, okomentuju atp. :D A v javě se zlepším, značně -_-
-
Funguje to neuvěřitelně skvěle, moc ti děkuji za vše! Slibuju že si ho celý prostuduju, okomentuju atp. :D A v javě se zlepším, značně -_-
To jsem rád. Zlom vaz!
-
Ahoj, tvůj kód mi také hodně pomohl, ale nemůžu přijít na to, jak mám implementovat třídu Img32Loader. Možná jsem to tu někde přehlédl, ale nemůžu to najít.
Importovat mi ta třída nejde, takže z toho usuzuji, že si ji nejspíš musel sám vytvořit. Nejspíš v ní budou asi uloženy metody Load32Img atd. nebo se pletu? Mohl by ses o ní podělit?
-
Ahoj, tvůj kód mi také hodně pomohl, ale nemůžu přijít na to, jak mám implementovat třídu Img32Loader. Možná jsem to tu někde přehlédl, ale nemůžu to najít.
Importovat mi ta třída nejde, takže z toho usuzuji, že si ji nejspíš musel sám vytvořit. Nejspíš v ní budou asi uloženy metody Load32Img atd. nebo se pletu? Mohl by ses o ní podělit?
Jo, promiň. To je třída do které jsem dal metody ze třídy StaticImages v původním tutoriálu.
Tady je zdroják:
import java.awt.Color;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import javax.imageio.ImageIO;
public class Img32Loader {
public void setBTrans(BufferedImage name,int temp){
for (int _yi = 0; _yi<name.getHeight();_yi++){
for (int _xi = 0; _xi<name.getWidth();_xi++){
if (name.getRGB(_xi,_yi)==temp)
name.setRGB(_xi,_yi,0);
}//END X FOR STATEMENT
}//END Y FOR STATEMENT
}//END METHOD
private int fixRGB(int num){
int Alpha = 0xFF000000;
int Red = 0x00FF0000;
int Green = 0x0000FF00;
int Blue = 0x000000FF;
int finalR = 0;
Red = num & Red;
Red = Red << 8;
Green = num & Green;
Green = Green << 8;
Blue = num & Blue;
Blue = Blue << 8;
Alpha = num & Alpha;
Alpha = Alpha >>> 24;
finalR = Red | Green | Blue | Alpha;
return finalR;
}//END METHOD
public Img32 Load32BitImg(String name,java.awt.GraphicsDevice GD,boolean trans){
Img32 obrazek=null;
try{
Image imgTemp;
imgTemp = (Image)ImageIO.read(new File(name));
ByteBuffer buf;
//System.out.println("Found File");
BufferedImage Bimg = GD.getDefaultConfiguration().createCompatibleImage(imgTemp.getWidth(null),imgTemp.getHeight(null),Color.BITMASK);
Bimg.getGraphics().drawImage(imgTemp,0,0,null);
if (trans)
setBTrans(Bimg,Bimg.getRGB(0,Bimg.getHeight()-1));
buf = ByteBuffer.allocateDirect((Bimg.getWidth()*Bimg.getHeight())*4);
for (int y = 0; y< Bimg.getHeight();y++){
for (int x = 0; x< Bimg.getWidth();x++)
buf.putInt(fixRGB(Bimg.getRGB(x, Bimg.getHeight()-y-1)));
}//END FOR LOOP
//System.out.println("BUFFER MADE");
obrazek=new Img32(Bimg.getWidth(),Bimg.getHeight(),buf);
}catch(IOException ie){
System.out.println("Error Reading Image");
}//END TRY AND CATCH STATEMENT
return obrazek;
}//END METHOD
}//END CLASS
Všechny tři třídy jsem sem taky pro jistotu nahrál v zipu:
-
Dík moc, myslel jsem si to tak, jak si to měl ty.