Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Dibujar un triángulo con OpenGL

Estas en el tema de Dibujar un triángulo con OpenGL en el foro de C/C++ en Foros del Web. Hola, muy buenas a tod@s! Les cuento: Estoy aprendiendo a como usar OpenGL (Por ahora, en la versión 3.3) y tengo un problema que no ...
  #1 (permalink)  
Antiguo 23/12/2014, 13:46
 
Fecha de Ingreso: octubre-2014
Mensajes: 15
Antigüedad: 10 años, 1 mes
Puntos: 0
Pregunta Dibujar un triángulo con OpenGL

Hola, muy buenas a tod@s! Les cuento:

Estoy aprendiendo a como usar OpenGL (Por ahora, en la versión 3.3) y tengo un problema que no puedo resolver. El caso es que cuando abro el programa, la ventana se pone en negro (eso significa que el OpenGL ha sido inicializado), pero no me dibuja el triangulo que yo he programado... Estoy usando Shaders, aquí les dejo el código:

Código C++:
Ver original
  1. // main.cpp
  2. #include "Shader.h"
  3.  
  4. // ... (Aqui habia codigo, pero si lo pongo la cosa se complica)
  5. // Aqui solo habia los punteros a las funciones de la libreria OpenGL
  6.  
  7. bool Cerrar = false;
  8. float Triangulo[9];
  9. UINT IDTriangulo;
  10.  
  11. LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  12. void CrearEscena();
  13. void RenderizarEscena();
  14. bool ComprobarFunciones();
  15. UINT ProgramID;
  16.  
  17. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdshow) {
  18.     PROGRAMA Programa = PROGRAMA(640, 480);
  19.     SHADER Shader = SHADER();
  20.     MSG Msg;
  21.     wchar_t TituloVentana[] = L"Título: OpenGL";
  22.  
  23.     Programa.Inicializar(TituloVentana, WndProc, hInstance);
  24.     ComprobarFunciones();
  25.  
  26.     CrearEscena();
  27.  
  28.     ProgramID = Shader.CargarShader("main.VS", "main.FS");
  29.  
  30.     while(!Cerrar) {
  31.         if(PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) {
  32.             TranslateMessage(&Msg);
  33.             DispatchMessage(&Msg);
  34.         } else {
  35.             RenderizarEscena();
  36.  
  37.             SwapBuffers(Programa.ObtenerDC());
  38.         }
  39.     }
  40.  
  41.     Programa.Destruir();
  42.     return Msg.wParam;
  43. }
  44.  
  45. LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  46.     // Lo único que hay aqui es el cerrado de ventana
  47. }
  48.  
  49. void CrearEscena() {
  50.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  51.  
  52.     Triangulo[0] = -0.5f; Triangulo[1] = -0.5f; Triangulo[2] = 0.0f;
  53.     Triangulo[3] =  0.5f; Triangulo[4] = -0.5f; Triangulo[5] = 0.0f;
  54.     Triangulo[6] =  0.0f; Triangulo[7] =  0.5f; Triangulo[8] = 0.0f;
  55.  
  56.     glGenBuffers(1, &IDTriangulo);
  57.     glBindBuffer(GL_ARRAY_BUFFER, IDTriangulo);
  58.     glBufferData(GL_ARRAY_BUFFER, sizeof(Triangulo), Triangulo, GL_STATIC_DRAW);
  59. }
  60.  
  61. void RenderizarEscena() {
  62.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  63.  
  64.     glEnableVertexAttribArray(0);
  65.     glBindBuffer(GL_ARRAY_BUFFER, IDTriangulo);
  66.     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
  67.     glUseProgram(ProgramID);
  68.     glDrawArrays(GL_TRIANGLES, 0, 3);
  69. }
  70.  
  71. bool ComprobarFunciones() {...}



Código C++:
Ver original
  1. // Shaders.cpp
  2. #include "Shader.h"
  3.  
  4. SHADER::SHADER() { }
  5.  
  6. UINT SHADER::CargarShader(const char VertexShader[], const char FragmentShader[]) {
  7.     // PUNTERO A FUNCIONES DE LA LIBRERIA OPENGL
  8.  
  9.     ResultadoCompilacion = GL_FALSE;
  10.  
  11.     VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
  12.     FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
  13.  
  14.     ArchivoVertexShader.open(VertexShader, std::ios::in);
  15.     ArchivoFragmentShader.open(FragmentShader, std::ios::in);
  16.  
  17.     CodigoVertexShader = "";
  18.     CodigoFragmentShader = "";
  19.  
  20.     if(ArchivoVertexShader.is_open() && ArchivoFragmentShader.is_open()) {
  21.         while(std::getline(ArchivoVertexShader, LineaCodigo))
  22.             CodigoVertexShader += "\n" + LineaCodigo;
  23.  
  24.         ZeroMemory(&LineaCodigo, sizeof(LineaCodigo));
  25.  
  26.         while(std::getline(ArchivoFragmentShader, LineaCodigo))
  27.             CodigoFragmentShader += "\n" + LineaCodigo;
  28.     } else { return 0; }
  29.  
  30.     const char *CodigoVertexShaderCHAR = CodigoVertexShader.c_str();
  31.     const char *CodigoFragmentShaderCHAR = CodigoFragmentShader.c_str();
  32.  
  33.     glShaderSource(VertexShaderID, 1, &CodigoVertexShaderCHAR, NULL);
  34.     glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &ResultadoCompilacion);
  35.    
  36.     glCompileShader(VertexShaderID);
  37.  
  38.     glShaderSource(FragmentShaderID, 1, &CodigoFragmentShaderCHAR, NULL);
  39.     glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &ResultadoCompilacion);
  40.    
  41.     glCompileShader(FragmentShaderID);
  42.  
  43.     ProgramID = glCreateProgram();
  44.     glAttachShader(ProgramID, VertexShaderID);
  45.     glAttachShader(ProgramID, FragmentShaderID);
  46.     glLinkProgram(ProgramID);
  47.  
  48.     glGetProgramiv(ProgramID, GL_LINK_STATUS, &ResultadoCompilacion);
  49.  
  50.     glDeleteShader(VertexShaderID);
  51.     glDeleteShader(FragmentShaderID);
  52.  
  53.     return ProgramID;
  54. }
  55.  
  56. //... Definicion de otras funciones sin revelancia


Código C++:
Ver original
  1. // main.VS (VertexShader)
  2. #version 330 core
  3.  
  4. layout(location = 0) in vec3 vertexPosition_modelspace;
  5.  
  6. void main(){
  7. gl_Position.xyz = vertexPosition_modelspace;
  8. gl_Position.w = 1.0;
  9. }

Código C++:
Ver original
  1. // main.FS (FragmentShader)
  2. #version 330 core
  3. out vec3 color;
  4.  
  5. void main(){
  6. color = vec3(1,0,0);
  7. }


GRACIAS POR SU ATENCIÓN Y ESPERO QUE ME PUEDAN AYUDAR...

Última edición por Seyro97; 23/12/2014 a las 13:50 Razón: Faltaba cierta información

Etiquetas: contexto, opengl
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:12.