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

 

 


Tema destacado:


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

Desconectado Desconectado

Mensajes: 206



Ver Perfil WWW
glTest2: Formato RGBA para manejar colores
« en: 19 Marzo 2013, 05:49 am »

En base a un código fuente de ejemplo de un programa simple que usa Opengl32, decidí hacer unas pruebas sobre tal código. Unas pruebas con referencia al manejamiento de los colores para Opengl32.
Lo primero que hice fue mirar un manual, y luego revisar el código fuente de OGC que incluye un plugin para administrar los colores.
Si les interesa algo de esto pueden leer este pequeño manual:
http://www.mediafire.com/view/?n4n9zyzo0uda7ci

El programa es el mismo que el de mi anterior tema sobre Opengl32:
http://foro.elhacker.net/programacion_cc/gltest_1_interceptar_opengl32_con_gpa-t384878.0.html

Pero lo modifiqué porque mi intención era manejar los colores y mostrarlos por pantalla a modo de líneas de colores y color de fondo. No me importaba dibujar nada en la pantalla (aparte que tengo la mínima idea de Opengl32 XD). Pero de nuevo, lo que me interesaba era como se manejaban los colores.

Lo que es importante destacar, es que un color se representa con 32 bits, de los cuales 24 bits son para rojo, verde y azul, y los 8 restantes son para
la transparencia. Lean el manual cualquier koza.

Ahora voy a poner el código fuente de lo que hice, se compone de dos partes. La primera sería el programa Opengl32 modificado por mi para que muestre 15 colores de fondo de ventana y unas líneas, el tema es que se pueden cambiar los colores con el teclado (Flecha arriba y abajo).
La segunda parte viene a ser un plugin que hice en base al plugin existente en OGC llamado 'Color manager'. Se trata de 4 funciones específicas que manejan la conversión del formato RGBA. Hablando de esto, veamos algo..

Por ejemplo, el color blanco en formato entero (32 bits) es:
Código:
255, 255, 255, 255

los primeros 8 son rojo, luego verde, luego azul y luego transparencia (alpha).

en modo de punto flotante, lo mismo
Código:
255.0, 255.0, 255.0, 255.0

lo que pasa que las funciones de Opengl32 reciben los parámetros como de punto flotante, por la precisión del color. Sin mencionar que se toma como que un color va de 0.0 a 1.0.

no conozco todas las funciones Opengl32, sólo estuve usando algunas.

La otra forma de representar el RGBA es en hexadecimal, para el blanco
viene a ser:

Código:
0xFFFFFFFF

es lo mismo que decir 255,255,255,255 pero todo junto en una variable.
por ejemplo:

Código:
DWORD colorBlanco = 0xFFFFFFFF;

En cambio en modo entero se usa para poder manejar los colores desde una panel por ejemplo, o agregarlos desde un archivo de configuración.

Bueno, el tema es que las funciones que hice hacen todo este intercambio de los formatos.

Aunque la función 4 no pasa de formato a formato sino que establece un valor para la transparencia.

En lo que respecta al código, en mis 4 funciones fuí muy explícito con las variables locales, ya que en cada una fuí específico de dejar en claro cuando se trata del color rojo, cuando del verde y cuando del azul, y lo mismo para la transparencia. Es para que quede claro y no se pase por alto.

main.cpp
Código
  1.  
  2. //
  3. // By 85
  4. // Credits: OGC, opengl.org
  5. // boyscout_etk@hotmail.com
  6. // etalking.com.ar
  7. // 2013
  8. //
  9.  
  10. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  11.  
  12. #pragma comment (lib, "opengl32.lib")
  13. #pragma comment (lib, "GLUT32/glut32.lib")
  14. #include<windows.h>
  15. #include<stdio.h>
  16.  
  17. #include "GLUT32/glut.h"
  18. #include <gl\gl.h>
  19. #include <gl\glu.h>
  20.  
  21. #include "rgba_funcs.h"
  22.  
  23. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  24.  
  25. static float scale = 1.4;
  26. static float transx, transy, rotx, roty;
  27.  
  28. int CURCOLOR =0;//Color actual (Se cambia con el teclado)
  29. int TablaRGBA[15][4] = {//Tabla con 15 colores diferentes en RGBA
  30.  
  31. {80,150, 30, 110},
  32. {255, 40, 40,200},
  33. {40, 80,255,200},
  34. {250,250, 22, 254},
  35. {0,  0,  0, 128},
  36. {80,150, 30, 110},
  37. {255,255,255,255},
  38. {15, 50,255, 50},//Consola del Hurricane XD
  39. {220,220,220,200},
  40. {0,128,0,200},
  41. {255,255,255,255},
  42. {220,220,220,200},
  43. {100,255,160,200},
  44. {100,255,160,200},
  45. {51,51,204,180},//Menu del Hurricane XD
  46. };
  47.  
  48. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  49.  
  50. void bfunc(void)
  51. {
  52. static int state;
  53. if(state ^= 1)
  54. {
  55. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  56. glEnable(GL_BLEND);
  57. }
  58. else
  59. {
  60. glDisable(GL_BLEND);
  61. }
  62. }
  63.  
  64. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  65.  
  66. void init(char* filename)
  67. {
  68. }
  69.  
  70. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  71.  
  72. void TestPluginRGBAfuncs(){// Probando el plugin
  73.  
  74. int v1[4] = {51,51,204,180};
  75. float v2[4] = {0,0,0,0};
  76. rgbaInt_a_rgbaFloat(v1,v2);
  77. printf("%f %f %f %f\n", v2[0], v2[1], v2[2], v2[3]);
  78. system("pause");
  79.  
  80. //=================================
  81.  
  82. int vec1[4] = {51,51,204,180};
  83. DWORD color1 = 0xFFFFFFFF;
  84. color1=rgbaInt_a_rgbaHex(vec1);
  85. printf("0x%X\n", color1);
  86. system("pause");
  87.  
  88. //=================================
  89.  
  90. int vecca[4] = {51,51,204,180};
  91. int* vec2 = (int*)&vecca[0];
  92. DWORD color2 = 0x336699FF;
  93. vec2 = rgbaHex_a_rgbaInt(color2);
  94. printf("%d %d %d %d\n", vec2[0], vec2[1], vec2[2], vec2[3]);
  95. system("pause");
  96.  
  97. //=================================
  98.  
  99. DWORD color3 = 0xFFFFFF33;
  100. color3 = ComplementoAlpha(color3,85);
  101. printf("0x%X\n", color3);
  102. system("pause");
  103. }
  104.  
  105. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  106.  
  107. void display(void)
  108. {
  109. glClear(GL_COLOR_BUFFER_BIT);
  110. glTranslatef(transx, transy, 0.f);
  111. glRotatef(rotx, 0., 1., 0.);
  112. glRotatef(roty, 1., 0., 0.);
  113. glScalef(scale, scale, 0.);
  114. glLineWidth(5.5);
  115. ////////////////////////////////////////////////////
  116. ////////////////////////////////////////////////////
  117. float r = float(TablaRGBA[CURCOLOR][0])/255.0;
  118. float g = float(TablaRGBA[CURCOLOR][1])/255.0;
  119. float b = float(TablaRGBA[CURCOLOR][2])/255.0;
  120. float a = float(TablaRGBA[CURCOLOR][3])/255.0;
  121. glClearColor(r,g,b,a);
  122. glColor3f(TablaRGBA[CURCOLOR][0],TablaRGBA[CURCOLOR][1],TablaRGBA[CURCOLOR][2]);
  123. glBegin(GL_LINES);
  124. glVertex3f(0.0, 0.0, 0.0);
  125. glVertex3f(15, 0, 0);
  126. glEnd();
  127. glutSwapBuffers();
  128. //glFlush();
  129. }
  130.  
  131. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  132.  
  133. void reshape(int w, int h)
  134. {
  135. glViewport(-50, -50, w+120, h+120);
  136. }
  137.  
  138. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  139.  
  140. void key(unsigned char key, int x, int y)
  141. {
  142. if (key=='\033') exit(0);
  143.  
  144. bfunc();
  145. glutPostRedisplay();
  146. }
  147.  
  148. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  149.  
  150. void special(int key, int x, int y)
  151. {
  152.  switch (key) {
  153.  case GLUT_KEY_UP:
  154.  {
  155. if(CURCOLOR==14) CURCOLOR=0;
  156. else CURCOLOR++;
  157.  }
  158.    break;
  159.  case GLUT_KEY_DOWN:
  160.  {
  161. if(CURCOLOR==0) CURCOLOR=14;
  162. else CURCOLOR--;
  163.  }
  164.    break;
  165.  default:
  166.    return;
  167.  }
  168.  glutPostRedisplay();
  169. }
  170.  
  171. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  172.  
  173. void tick(void)
  174. {
  175. glutPostRedisplay();
  176. }
  177.  
  178. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  179.  
  180. int main(int argc, char** argv){
  181.  
  182. SetConsoleTitle("glTest2");
  183. TestPluginRGBAfuncs();
  184.  
  185. ////////////////////////////////////////////
  186.  
  187. glutInit(&argc, argv);
  188. glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
  189. glutInitWindowSize(450, 450);
  190. glutCreateWindow("SHOW COLORES");
  191. // glutFullScreen();
  192. init(argv[1]);
  193. glutDisplayFunc(display);
  194. glutKeyboardFunc(key);
  195. glutSpecialFunc(special);
  196. glutReshapeFunc(reshape);
  197. glutIdleFunc(tick);
  198. // SetActiveWindow(FindWindow(0,"SHOW COLORES"));
  199. SetForegroundWindow(FindWindow(0,"SHOW COLORES"));//Para que quede en primer plano ;D
  200. glutMainLoop();
  201. system("pause");
  202. return 0;
  203. }
  204.  
  205. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  206.  
  207.  


rgba_funcs.cpp
Código
  1.  
  2. //
  3. // By 85
  4. // Credits: OGC, opengl.org
  5. // boyscout_etk@hotmail.com
  6. // etalking.com.ar
  7. // 2013
  8. //
  9.  
  10. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  11.  
  12. #pragma warning(disable: 4244)
  13. typedef unsigned long DWORD;
  14. int idef[4]={255,255,255,255};
  15. float fdef[4]={255.0,255.0,255.0,255.0};
  16.  
  17. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  18.  
  19. //Para Opengl32 (Valores de 0.0 a 1.0)
  20. void rgbaInt_a_rgbaFloat(int iVecRGBA[4]=reinterpret_cast<int*>(idef),
  21. float fVecRGBA[4]=reinterpret_cast<float*>(fdef)){
  22.  
  23. float red = float(iVecRGBA[0])/255.0;
  24. float green = float(iVecRGBA[1])/255.0;
  25. float blue = float(iVecRGBA[2])/255.0;
  26. float alpha = float(iVecRGBA[3])/255.0;
  27. fVecRGBA[0]=red;
  28. fVecRGBA[1]=green;
  29. fVecRGBA[2]=blue;
  30. fVecRGBA[3]=alpha;
  31. }
  32.  
  33. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  34.  
  35. DWORD rgbaInt_a_rgbaHex(int vecRGBA[4]=reinterpret_cast<int*>(idef)){
  36.  
  37. int red=vecRGBA[0];
  38. int green=vecRGBA[1];
  39. int blue=vecRGBA[2];
  40. int alpha=vecRGBA[3];
  41. return ((red<<24) + (green<<16) + (blue<<8) + alpha);
  42. }
  43.  
  44. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  45.  
  46. int* rgbaHex_a_rgbaInt(DWORD color= 0xFFFFFFFF){
  47.  
  48. int red   = (color>>24);
  49. int green = (color>>16)&0xFF;
  50. int blue  = (color>>8)&0xFF;
  51. int alpha = (color)&0xFF;
  52. static int vecRGBA[4];
  53. vecRGBA[0]=red;
  54. vecRGBA[1]=green;
  55. vecRGBA[2]=blue;
  56. vecRGBA[3]=alpha;
  57. return vecRGBA;
  58. }
  59.  
  60. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  61.  
  62. DWORD ComplementoAlpha(DWORD color= 0xFFFFFFFF, int alpha=255){
  63.  
  64. color &= 0xFFFFFF00;//Quita
  65. color += alpha;//Pone
  66. return color;
  67. }
  68.  
  69. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  70.  
  71.  

Cuando abren el programa aparecen dos ventanas, la de la consola
va a mostrar el resultado de las pruebas de conversión.
La otra es la ventana de la aplicación Opengl32, muestra un color
de fondo que se puede cambiar con las flechas arriba abajo


Proyecto en MSVCPP6
http://www.mediafire.com/?49xkm41pswptcby

8ye8ye


« Última modificación: 19 Marzo 2013, 05:55 am por 85 » En línea

Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/
macross255

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: glTest2: Formato RGBA para manejar colores
« Respuesta #1 en: 23 Octubre 2013, 15:54 pm »

gracias cs_85 me viene de 10 el manual y la demo, estoy aprendiendo del tema así q se valoran estos aportes  ;-)


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Programa para quemar peliculas bajadas en formato divx y avi, a formato dvd
Multimedia
xoux 3 5,393 Último mensaje 28 Abril 2008, 08:37 am
por Aberroncho
¿que es mejor para manejar mysql?
Bases de Datos
morenochico 8 10,089 Último mensaje 11 Marzo 2011, 07:54 am
por morenochico
Ayuda para manejar el mouse
Programación Visual Basic
pedraosone 3 2,389 Último mensaje 1 Marzo 2011, 03:30 am
por pedraosone
¿Manual para manejar procesos en C?
Programación C/C++
Dark Invader 6 7,910 Último mensaje 14 Julio 2011, 22:46 pm
por El_Java
[C] Funciones para manejar procesos
Programación C/C++
.::DoX::. 3 2,730 Último mensaje 7 Octubre 2011, 17:57 pm
por Queta
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines