elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Graficos con C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Graficos con C++  (Leído 2,280 veces)
Desiresportal

Desconectado Desconectado

Mensajes: 57


Ver Perfil
Graficos con C++
« en: 7 Octubre 2015, 16:50 pm »

Muy buenas. He estado buscando en internet y no encuentro nada util (o al menos actualizado) que solucione mi pequeño problema.

Actualmente utilizo la librería Glut para un proyecto que estoy desarrollando. Utilizo OpenGL para los graficos en tiempo real.

Hasta aqui todo bien.

Ahora empiezo a pensar que me gustaría hacer mi propia librería grafica. Pero tranquilidad, que solo para graficos 2D. Aunque tal vez en un futuro... Por ahora lo dejaré en graficos 2D.

El problema es que busco y busco como dibujar pixel por pixel pero no encuentro nada. Lo unico que encuentro son tutoriales que utilizan librerías como "graphics.h" o "dos.h" y su funcion "int86()". Personalmente prefiero la librería "dos.h", pero esperaba algo mas actualizado que este tutorial: http://www.miclase-online.com/tutoriales/computacion/programacion/proggraficac.pdf.

Lo que busco es mas bien algo como utilizar punteros y dibujar sobre la memoria grafica cambiando el valor almacenado. Por ejemplo: si el color negro fuese 0,0,0 y el blanco 255,255,255 para dibujar en rojo tendría que poner 255,0,0 en la posicion de memoria correcta. Al menos algo así tengo entendido con los buffers de memoria y los mapas de bits. Igual estoy completamente equivocado.

Por otra parte y ya que deseo eliminar la librería Glut de mi proyecto,.. ¿como obtengo el "elapsed time" sin usar Glut? ¿Se puede obtener utilizando la librería "time.h"? Si es así, ¿como? No me sirve eso de "se que el programa tarda 30 milisegundos entre frames y me dedico a hacer time+=30". No puedo saber el tiempo que tardará entre frames y necesito una precision de milisegundos.

El proyecto en el que estoy metido tiene dos partes y una de ellas no requiere utilizar graficos. Por eso me parece absurdo incluir Glut para obtener el "elapsed time".

Por ahora esas son mis dudas. Muchas gracias por adelantado.


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Graficos con C++
« Respuesta #1 en: 7 Octubre 2015, 16:58 pm »

Para obtener el iempo en milisegundos (microsegundos si no me equivoco en Unix), utiliza clock().

No utilices time.h en C++. En C++ utiliza <ctime>.


En línea

Desiresportal

Desconectado Desconectado

Mensajes: 57


Ver Perfil
Re: Graficos con C++
« Respuesta #2 en: 2 Noviembre 2015, 20:31 pm »

Gracias por la respuesta. He buscado informacion al respecto y me parece que ya he encontrado lo que necesitaba para medir el "elapsed_time" que tenía con GLUT.

Ahora con el tema de los graficos, he buscado y me he encontrado con la API de Widnows para los graficos 2D. Con la API de windows he conseguido dibujar pixel por pixel en pantalla sin necesidad de ninguna librería aparte. Por ahora la jugabilidad es nula y el renderizado es lento, pero de momento puedo empezar a hacer mis propias funciones de dibujado. No serán muy inovadoras, cometeré graves errores por el camino,... pero me lo pasaré bien aprendiendo las dificultades que conlleva.

Duda: He hecho las letras "A", "B" y "C" en una matriz multidimensional y las he volcado sobre un buffer (otra matriz multidimensional). Despues el buffer se muestra en pantalla. La representacion del buffer es totalmente correcta. Las letras de dibujan bien, pero cuando de dibujan del reves. Mi pregunta es: si la matriz de las letras se organiza de forma X, Y, ¿por que para dibujar sobre el buffer (X,Y) es necesario que se lea la letra de forma inversa (Y,X)?

Codigo de ejemplo:

Código:
bool defaultEngineFont[255][5][5]; // [Letra][Ancho][Alto] La fuente por defecto es de letras de 5*5.

void loadDefaultFont() {
// Esta funcion inicializa la fuente por defecto.

// Los pixeles deberían dibujarse de izquierda a derecha y de arriba hacia abajo. Teniendo prioridad de izquierda a derecha. Es decir, primero los X y despues los Y.

// De momento solo 3 letras. Y partiendo de "A" (ASCII 97).

// A
defaultEngineFont[0][0][1] = true;
defaultEngineFont[0][1][0] = true;
defaultEngineFont[0][1][2] = true;
defaultEngineFont[0][2][0] = true;
defaultEngineFont[0][2][2] = true;
defaultEngineFont[0][3][0] = true;
defaultEngineFont[0][3][1] = true;
defaultEngineFont[0][3][2] = true;
defaultEngineFont[0][4][0] = true;
defaultEngineFont[0][4][2] = true;
// B
defaultEngineFont[1][0][0] = true;
defaultEngineFont[1][0][1] = true;
defaultEngineFont[1][0][2] = true;
defaultEngineFont[1][1][0] = true;
defaultEngineFont[1][1][3] = true;
defaultEngineFont[1][2][0] = true;
defaultEngineFont[1][2][1] = true;
defaultEngineFont[1][2][2] = true;
defaultEngineFont[1][3][0] = true;
defaultEngineFont[1][3][3] = true;
defaultEngineFont[1][4][0] = true;
defaultEngineFont[1][4][1] = true;
defaultEngineFont[1][4][2] = true;
// C
defaultEngineFont[2][0][1] = true;
defaultEngineFont[2][0][2] = true;
defaultEngineFont[2][1][0] = true;
defaultEngineFont[2][1][3] = true;
defaultEngineFont[2][2][0] = true;
defaultEngineFont[2][3][0] = true;
defaultEngineFont[2][3][3] = true;
defaultEngineFont[2][4][1] = true;
defaultEngineFont[2][4][2] = true;
}

void drawText(string tempString = "", int x = 0, int y = 0, int r = 0, int g = 0, int b = 0, int tempBuffer[WINDOW_WIDTH][WINDOW_HEGHT][WINDOW_COMP] = engineScreenBuffer) {
if (tempString.size() > 0) {
if (WINDOW_COMP >= 3) {
for (int i=tempString.size() - 1; i >= 0; i--) {
cout << tempString[i] << " = " << int(tempString[i]) << endl;
// Sé que las letras son de 5*5. Gracias a eso sé los limites de cada letra y el limite de los "for".
for (int fory=4;0 <= fory;fory--) {
for (int forx=4; 0 <= forx; forx--) {
//cout << "forX: " << forx << endl;
if (defaultEngineFont[tempString[i] - 97][fory][forx]) {
// Añado un if para evitar el "overflow".
if (x + forx + (i*5) <= WINDOW_WIDTH && x + forx + (i*5) >= 0 && y+fory <= WINDOW_HEGHT && y+fory >= 0) {
tempBuffer[x + forx + (i*5)][y+fory][0] = r;
tempBuffer[x + forx + (i*5)][y+fory][1] = g;
tempBuffer[x + forx + (i*5)][y+fory][2] = b;
}
}
}
}
}
}
else {
cout << "De momento la funcion \"drawText()\" solo funciona con 3 componentes o mas." << endl;
}
}
}

Mi preocupacion es la linea "if (defaultEngineFont[tempString - 97][fory][forx]) {". Ese "forx" cuando debería ser el "fory" y viceversa... no me gusta.

Como ya he comentado, el buffer se muestra correctamente en pantalla. Si en el buffer X es 10, en la pantalla es el pixel 11 (Las matrices empiezan por 0 y los pixeles los contamos a partir del 1). Con el Y del buffer igual de bien.

A ver, que ahora dibuja bien. Yo solo quiero entender por que se produce algo tan raro. Para no tirarme de los pelos la proxima vez.

Muchas gracias de antemano. Y sigo esperando respuesta para dibujar directamente sobre la memoria grafica. Hasta otra.


PD: Olvidalo, olvidalo, olvidalo,... Ya he encontrado el problema. Yo. Me he confundido al poner en "true" los puntos de la matriz de las letras. Me he equivocado en las coordenadas. Cuando lo he escrito he pensado "linea 1 bloque 3 eso significa que X=0, Y=2". Tenia que ser al reves. X=2, Y=0. Fallo mio. Menos mal. Casi que me alegro de saberlo. Hasta otra.
« Última modificación: 2 Noviembre 2015, 21:00 pm por Desiresportal » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Graficos
Programación Visual Basic
zerofive 9 3,234 Último mensaje 15 Septiembre 2006, 22:56 pm
por NYlOn
Graficos en 3d
Diseño Gráfico
valdragas 0 3,173 Último mensaje 29 Abril 2008, 14:08 pm
por valdragas
Quitarle Memoria de Graficos a los graficos de core i5
Hardware
Churrin515 7 7,455 Último mensaje 15 Septiembre 2010, 15:20 pm
por APOKLIPTICO
Gráficos
Dudas Generales
key_xiiLa 2 2,502 Último mensaje 12 Octubre 2010, 19:00 pm
por key_xiiLa
Graficos en Microsoft c++ 5.02
Programación C/C++
AXA 3 2,887 Último mensaje 12 Enero 2022, 23:30 pm
por .xAk.
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines