Graficos con C++

Iniciado por Desiresportal, 7 Octubre 2015, 16:50 PM

0 Miembros y 1 Visitante están viendo este tema.

Desiresportal

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.

ivancea96

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>.

Desiresportal

#2
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:

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.