PDA

Ver la versión completa : Dudas sobre opengl



hopez
02/02/2010, 12:17
Buenas,

primero quiero dejar claro que soy un novato, ya no en opengl sino tambien en SDL...

A ver, estoy intentando portar un juegecillo de esos para la Wiz, he visto que es uno que usa opengl y es sencillito.

Comprendo las diferencias teóricas entre opengl y opengles lite, lo que creo que no acabo de entender son las prácticas:

El juego inicializa la pantalla con:


unsigned int flags = SDL_OPENGL | SDL_SWSURFACE;
if(!set.windowed) flags |= SDL_FULLSCREEN;
if(SDL_SetVideoMode(set.width,set.height,16,flags) ==NULL)
que casca con:


Could not set OpenGL Video Mode: OpenGL not available

Y vistos los ejemplos de pickle (nehe) usa cosas como:


window=SDL_CreateWindow("Nehe: SDL/OpenGL ES Tutorial, Lesson 02",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
WINDOW_WIDTH, WINDOW_HEIGHT,
SDL_WINDOW_RESIZABLE | SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_FULLSCREEN);

¿Se puede usar el opengles o nanogl o lo que sea con SDL_SetVideoMode?
¿Tengo que usar el createwindows de pickle?

A ver si alguien que sepa programar me echa una manita que voy perdido T_T

axlpxl
03/02/2010, 11:39
Afortunado! otros aun no hemos llegado a programar ni el hello world con SDL.
En mi caso utilizo otro lenguaje, pero esta limitado por licencia.

Si has conseguido mostrar algo por pantalla con SDL, te agradeceria que mostraras un ejemplo
Gracias!

hopez
03/02/2010, 12:09
El SDL te tendría que funcionar directamente, cualquier programa en SDL que esté preparado para una ventana de 320x240 y 16 bits (no se si teóricamente podría funcionar con 32 pero está comprobadísimo que si no es 16 peta).

Ejemplo:
hellosdl.c

#include "SDL.h"

#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 240
#define SCREEN_DEPTH 16

int main(int argc, char *argv[]) {
SDL_Surface *screen;
Uint8 *p;
int x = 10; //x coordinate of our pixel
int y = 20; //y coordinate of our pixel

/* Initialize SDL */
SDL_Init(SDL_INIT_VIDEO);

/* Initialize the screen / window */
screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_DEPTH, SDL_SWSURFACE);

/* Make p point to the place we want to draw the pixel */
p = (Uint8 *)screen->pixels + y * screen->pitch + x * screen->format->BytesPerPixel;

/* Draw the pixel! */
*p=0xff;

/* update the screen (aka double buffering) */
SDL_Flip(screen);
while(1);
}

Y un makefile sencillito para usar el toolchain de open2x:
Makefile

WIZSDK=/opt/openwiz/toolchain
WIZBIN=$(WIZSDK)/bin
SDL_CONFIG = $(WIZBIN)/sdl-config

CC = $(WIZBIN)/arm-openwiz-linux-gnu-gcc

CFLAGS = -g -I$(WIZSDK)/include $(shell $(SDL_CONFIG) --cflags)

LIBS += $(shell $(SDL_CONFIG) --libs)

TARGET = hellosdl.gpu
OBJS = hellosdl.o

all: $(TARGET)

$(TARGET): $(OBJS)
$(CC) -o $@ $^ $(LIBS)

clean:
$(RM) $(TARGET) $(OBJS)

El ejecutable que se genera solo muestra un pixel (y el puntero de la táctil).

Por el lado de mi pregunta estuve investigando un poco ayer...
Los ejemplos de pickle usan un pack que publicó con openglES y SDL13 parcheado para que las llamadas a SDL con OPENGL apunten hacia openglES...

Después de recompilar algunas de las librerías que publicó (me daban algun error con glOrtho) ya compilo correctamente, ahora solo tengo que migrar las llamadas de OPENGL a OPENGLES y ver que es lo que pasa :P

GameMaster
15/04/2010, 19:19
Reactivo el foro, la idea es averiguar ante todo si por Gp32Spain aparte de gente para los momentos de cachondeo tambien los hay para ocasiones más serias y más tecnicas como es el caso (y no vale visitar esta sección y no aportar algo útil :)).

Echas las presentaciones, al loro:

Estoy usando el SDK oficial, y utilizando las funciones de OpenGLES me deparo con algunas cosillas en falta, que seguramente o estan en otro lado o se hacen de otra forma.

Mi primera duda es la siguiente, quiero por ejemplo hacer esto a una imagen en OpenGL:



glBegin(GL_QUADS);
glTexCoord2f(0,0);glVertex3f(-4.0 * j, -1.10 * j, .05f);
glTexCoord2f(1,0);glVertex3f(4.0 * j, -1.10 * j, .05f);
glTexCoord2f(1,1);glVertex3f(4.0 * j, 0.30 * j, .05f);
glTexCoord2f(0,1);glVertex3f(-4.0 * j, 0.30 * j, .05f);
glEnd();


Pero parece que glBegin no existe!!! Alguien con capacidad para ayudar ?

Si alguien conoce un tutorial especificamente de OpenGLES, y que no este en Koreano :), se pide a gritos.
Grácias.

efegea
15/04/2010, 19:24
Una de las más importantes diferencias entre OpenGL y OpenGL ES, es que el modo inmediato no existe (esto es, glBegin/glEnd)

Tienes que usar los vertex arrays :)

GameMaster
15/04/2010, 19:45
Hoerrr, sabes de algun tutorial en pdf ?

Y sobre el GetObject() en la que pillas por ejemplo una BMP para manipularla, aqui tenemos un g_cRender.RenderImage(0, 0, 0), y yo queria algo así:

HBITMAP hBMP; // Handle Bitmap
BITMAP BMP;

// Esto es invencion mia, hehehh, lo que quiero es identificar la imagen
hBMP = g_cRender.RenderImage(0, 0, 0)

// Despues:
GetObject(hBMP,sizeof(BMP), &BMP);

hopez
15/04/2010, 20:31
http://maniacdev.com/2009/04/8-great-resources-for-learning-iphone-opengl-es/

http://wiki.forum.nokia.com/index.php/Introduction_to_OpenGL_ES

GameMaster
15/04/2010, 20:58
Grácias. Te pongo otra que parece muy buena:

http://www.zeuscmd.com/tutorials/opengles/index.php

< - >
Uppps, estaba tambien en tu lista :)

cantamanyanes
16/04/2010, 12:46
Recordatorio : También hay los documentos de la especificación opengles en la sección de descargas.


Una de las más importantes diferencias entre OpenGL y OpenGL ES, es que el modo inmediato no existe (esto es, glBegin/glEnd)
En la wikipedia se explican estas y otras diferencias :
es[punto]wikipedia.org[barra]wiki[barra]OpenGL_ES
También el sitio oficial:
www[punto]khronos[punto]org[barra]opengles

( sorry, no tengo suficientes posts para postear links )

Las pruebas con los ejemplos SDL usando el SDK oficial y codeblocks me han funcionado bien. Tengo intención de meterme en el OpenGL este finde. Ya informaré, preguntaré y etc etc ... que tengo unas ganas de que me salga algo interesante ... [wei5]

Gammenon
16/04/2010, 12:58
Prueba a quitar lo del full screen, en Wiz no hace falta. Yo arranque el openGL en la Wiz con las SDL (100% SDK oficial) aunque no fui mucho mas alla por el problema de memoria que comentaba el autor del Audiorace

GameMaster
16/04/2010, 14:46
Pues a mi en el log de salida me sale que esta en modo OpenGL. Esto sólo me da dolores de cabeza, aparte de que las png's no se visualizan en Host (sólo en la consola: target), y si estan en 8bpp tampoco se visualizan en el target...

Ahora me entero de que las Bmp's salen con color erroneo (tanto en host como target), y en target aparte de eso la imagen sale distorcida.....

Help, please.

Este foro seria ideal para que entre todos quitaramos estas dudas, queria hacer un juego en 3D, lo del concurso es lo de menos, mi mayor ilusion es poder usar el SDK oficial y el Open GL ES como es debido (que por lo que veo es la version 1.1, osea, ni tendremos las mejoras de la version 2.0).

juanvvc
16/04/2010, 15:48
las png's no se visualizan en Host (sólo en la consola: target), y si estan en 8bpp tampoco se visualizan en el target...

Ejemplo de código que no funciona, que si no difícilmente se te puede ayudar.

Ten en cuenta que para que los PNGs se carguen en host, tienes que tener y enlazar con la librería libpng en tu ordenador. Recuerda también que en Linux los nombres de archivo distinguen entre mayúsculas y minúsculas: si tu imagen se llama "NAVE.png" e intentas cargar "nave.png", no podrás. Además, si los PNGs están a 8bpp (por lo tanto, indexados) tendrás que convertir al modo de pantalla que estés usando, seguramente 16bpp. Lo mejor es que en un primer intento solo uses imágenes a 16bpp.

GameMaster
16/04/2010, 16:04
Eso de los nombres lo tengo presente, incluso es mania mia distinguir entre mayusculas y minusculas y llamar los archivos por su nombre exacto :)
Lo de la libpng puede que sea eso, pero no me ha dado errores de linker... ni ejecución (aunque en este caso me imagino que las ignore si no las encuentra).

De momento lo que mas me preocupa el el uso de las bmp's, que salen con mal color y distorcidas en target (son de 24bpp, la tengo seteada a 32bpp pero ya probe con todas y salen igual).

La carga la hago de igual forma o sea, con:


g_cSurface.LoadImageFromBinary(5, 0, "Images/Bmp/MiImagen.bmp");

Segata Sanshiro
16/04/2010, 16:09
¿La documentación de DGE está disponible en inglés o toca deducir lo que hace cada cosa a base de ver ejemplos?

GameMaster
16/04/2010, 16:18
Koreano :)

Por cierto, grácias juanvvc, ya me funcionan las png tambien en host, me faltaba junto al exe, libpng12.dll y zlib1.dll respectivamente :brindis:

Por ahora sólo tengo pendientes arreglar las bmp.

juanvvc
16/04/2010, 16:33
La carga la hago de igual forma o sea, con:

Si esa es la línea que da error, entonces es que la imagen o bien no se encuentra, o bien está en un formato no reconocido. Si esa no es la línea que da error, entonces no sé porqué nos haces perder el tiempo enseñándola :)

Vamos, que necesitamos ver un ejemplo con todas las líneas para poder ayudarte. Solo una línea y sin saber si es esa o no la que falla, como que no sirve :)


bmp's, que salen con mal color y distorcidas en target (son de 24bpp

Como puedes ver en el warning de la documentación de la función LoadImageFromBinary():

지원포멧은 32 / 24bit PNG와 16bit(RGBA4444) 포멧의 BMP, 16bit(RGB565)의 BMP등이다.

Es decir, que solo se soportan PNGs de 24 ó 32 bits y BMPs de 16bits en formato RGB565 ó RGBA4444.

GameMaster
16/04/2010, 17:12
Joer :) Ya dominas el Koreano hehehe.
Te puse esa linea porque es la unica que difiere de las démas, y te la puse porque igual pensabas que las cargaba con funciones SDL.

De todos modos las he convertido todas a png, ya que seguramente tampoco las iba a dejar em bmp, porque ocupan más y hay que ahorrar memória, porque se nos queda corta :)

Lo que he notado, es que las png renderizadas en la consola se nota algo menos de calidad, yo tengo una imagen con brillo, y en la consola se notan los degradados pero en el ordenador no, esto suele ocurrir cuando tienes menor profundidad de color o menos colores, pero en ambos es la misma!

jduranmaster
16/04/2010, 17:17
aun no he manejado imagenes con OpenGl, estoy todavía con el control de audio e imagenes con SDL y me parece muy prometedor. Se puede manejar JPEG con OpenGL???, y que tipos de formatos de imagen comunes se pueden manejar con OpenGL??

El hecho de usar OpenGL para el manejo de imagenes frente a usar SDL, es porque OpenGL ofrece mejor rendimiento??

GameMaster
16/04/2010, 17:34
Bueno, por lo que veo hay opcion de configuracion de video con SDL/OpenGL al principio, y despues la carga se hace de igual forma estes en el ambiente que estes.
Y esta soporta tambien imagenes JPG, en variedad de formatos esta surtido :)

Lo que es verdad es que sólo me entero que esta usando OpenGL por el log, ya que por lo poco que he puesto no te enterarias si usa uno u otro.

OpenGL utiliza el Hardware y por SDL es software (aunque si usas SDL OpenGL tambien seria por hardware).

Gammenon
16/04/2010, 17:45
El openGL ES siempre sera 1.1 por el hardware, ni de coña vais a ver el 2.0 en la Wiz porque la maquina no tiene el hardware necesario para mover los pixel shaders por ejemplo. Leyendo la documentacion casi parece que lo que acelera son los vertex shaders, aunque todavia nadie lo ha probado.

juanvvc
16/04/2010, 17:52
tampoco las iba a dejar em bmp porque ocupan más y hay que ahorrar memória, porque se nos queda corta


Se puede manejar JPEG con OpenGL???, y que tipos de formatos de imagen comunes se pueden manejar con OpenGL??

Misma respuesta para ambos: el tipo de imagen solo se tiene en cuenta a la hora de cargar. En cuanto se cargan en memoria las imágenes se convierten al formato que necesite el módulo de vídeo de la consola. Es decir, una vez esté en memoria da igual que la imagen sea BMP, PNG, JPEG o un formato que os hayáis inventado con vuestro propio cargador: todos se convertirán al formato interno de la consola y todas las imágenes ocuparán lo mismo.

La diferencia entre BMP, JPG y PNG es solo el tiempo que tarden en cargarse y cuánto ocupa el ZIP en el que distribuyes el programa, porque el programa en memoria ocupará exactamente lo mismo.

GameMaster
16/04/2010, 17:56
De momento estoy intentando manipular una imagen donde antes lo hacia con


glBegin (GL_QUADS);
glTexCoord2f (0,0);glVertex3f ( -4.0*j, -1.10*j, .05f);
glTexCoord2f (1,0);glVertex3f ( 4.0*j, -1.10*j, .05f);
glTexCoord2f (1,1);glVertex3f ( 4.0*j, 0.30*j, .05f);
glTexCoord2f (0,1);glVertex3f ( -4.0*j, 0.30*j, .05f);
glEnd ();

y tenia la variable j, que hacia el efecto, he estado probando con glVertexPointer, pero todavia tengo un lio en mi mente para hacer una cosa que sea equivalente en OpenGL ES sin tener que escribir una biblia de funciones....

efegea
16/04/2010, 18:04
Rellena un array de floats con lo mismo que estás haciendo ahí (-4.0*j, -1.10*j...etc) y luego pásale ese array a glVertexPointer :)

GameMaster
16/04/2010, 18:11
y para identificar la imagen ?

Antes lo hacia de esta forma:


HBITMAP hBMP; // Handle Bitmap
BITMAP BMP;
glGenTextures(1, &texture[420]);
hBMP = (HBITMAP)LoadImage(GetModuleHandle(NULL),MAKEINTRE SOURCE(IDB_GBLoading), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
GetObject(hBMP,sizeof(BMP), &BMP); // Obtiene el Objeto
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glBindTexture(GL_TEXTURE_2D, texture[420]);
glBindTexture(GL_TEXTURE_2D, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Filtro Linear
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Filtro Linear

// Genera la textura
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, BMP.bmWidth, BMP.bmHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, BMP.bmBits);
DeleteObject(hBMP);


y despues hacia la transformación anterior, pero casi todas estas funciones han desaparecido, y lo que necesito es pillar el id de una imagen cargada por ejemplo con 'g_cSurface.LoadImageFromBinary' y despues tratarla

Segata Sanshiro
16/04/2010, 19:06
Lo que he notado, es que las png renderizadas en la consola se nota algo menos de calidad, yo tengo una imagen con brillo, y en la consola se notan los degradados pero en el ordenador no, esto suele ocurrir cuando tienes menor profundidad de color o menos colores, pero en ambos es la misma!

Pero aunque cargue PNG de 32 bits, el modo de vídeo de la Wiz está a 16, ¿no? Al menos soporta bien el canal alpha, aunque a 16 bits de color cante un poco.

GameMaster
16/04/2010, 19:18
Bueno, me dais cada tacada :)
Por eso se notará la diferencia, ya decia yo que me daba la sensación de menor profundidad de color...
Tengo que leerme las especificaciones completas antes de ponerme a inventar cosas...

Gammenon
16/04/2010, 19:42
y para identificar la imagen ?

Antes lo hacia de esta forma:


y despues hacia la transformación anterior, pero casi todas estas funciones han desaparecido, y lo que necesito es pillar el id de una imagen cargada por ejemplo con 'g_cSurface.LoadImageFromBinary' y despues tratarla

Esto tiene pinta de codigo de windows, normal que no te compile en Wiz (tampoco te lo haria en un entorno que no fuese windows). Puedes buscar "how to load opengl texture with SDL" o algo asi, ahi te explican como puedes sacar provecho de las capacidades de leer diferentes formatos de SDL_image y cargarlas con openGL ;)

GameMaster
17/04/2010, 11:59
Pero que no quiero usar el OpenGL del SDL pero si el OpenGL ES, en la distro estan las 2, porque SDL tambien vienen con el, pero según los ejemplos, que tiene includes genericos, utilizan el de las cabeceras DGE, las cuales tiran del OpenGL ES.

De Windows sólo esta la funcion que carga la BMP que es mia, pero esa no me importa, lo que me importa es usar el metodo de carga que usa DGE y aplicar transformaciones a esa imagen a mi antojo como se hacia con OpenGl "normal"

< - >
Bueno chicos, ya he dado con el clavo, utilizar una imagen para tratarla con OpenGL ES, es tan sencillo como poner:

unsigned int textureID = g_cSurface.GetTextureUseOpenGLES(1);

el 1 es el id de la carga:

g_cSurface.LoadImageFromBinary(1, 0, "Images/Png/MiImagen.png");


Ahora tengo otra dudilla, OpenGL no me funciona en host (se sale de la aplicacion si uso algo de OpenGL), ya me imagino que me falta alguna dll de opengl, pero ni poniendo todas las dll's del SDK me funciona, ni poniendo opengl32.dll.

Logicamente me imagino que existirá alguna dll para windows especifica de opengles, que será la que me falta, estais al loro sobre esto ?
Thanks.