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
// main.cpp #include "Shader.h" // ... (Aqui habia codigo, pero si lo pongo la cosa se complica) // Aqui solo habia los punteros a las funciones de la libreria OpenGL bool Cerrar = false; float Triangulo[9]; UINT IDTriangulo; LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); void CrearEscena(); void RenderizarEscena(); bool ComprobarFunciones(); UINT ProgramID; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdshow) { PROGRAMA Programa = PROGRAMA(640, 480); SHADER Shader = SHADER(); MSG Msg; wchar_t TituloVentana[] = L"Título: OpenGL"; Programa.Inicializar(TituloVentana, WndProc, hInstance); ComprobarFunciones(); CrearEscena(); ProgramID = Shader.CargarShader("main.VS", "main.FS"); while(!Cerrar) { if(PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } else { RenderizarEscena(); SwapBuffers(Programa.ObtenerDC()); } } Programa.Destruir(); return Msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { // Lo único que hay aqui es el cerrado de ventana } void CrearEscena() { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); Triangulo[0] = -0.5f; Triangulo[1] = -0.5f; Triangulo[2] = 0.0f; Triangulo[3] = 0.5f; Triangulo[4] = -0.5f; Triangulo[5] = 0.0f; Triangulo[6] = 0.0f; Triangulo[7] = 0.5f; Triangulo[8] = 0.0f; glGenBuffers(1, &IDTriangulo); glBindBuffer(GL_ARRAY_BUFFER, IDTriangulo); glBufferData(GL_ARRAY_BUFFER, sizeof(Triangulo), Triangulo, GL_STATIC_DRAW); } void RenderizarEscena() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, IDTriangulo); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); glUseProgram(ProgramID); glDrawArrays(GL_TRIANGLES, 0, 3); } bool ComprobarFunciones() {...}
Código C++:
Ver original
// Shaders.cpp #include "Shader.h" SHADER::SHADER() { } UINT SHADER::CargarShader(const char VertexShader[], const char FragmentShader[]) { // PUNTERO A FUNCIONES DE LA LIBRERIA OPENGL ResultadoCompilacion = GL_FALSE; VertexShaderID = glCreateShader(GL_VERTEX_SHADER); FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); ArchivoVertexShader.open(VertexShader, std::ios::in); ArchivoFragmentShader.open(FragmentShader, std::ios::in); CodigoVertexShader = ""; CodigoFragmentShader = ""; if(ArchivoVertexShader.is_open() && ArchivoFragmentShader.is_open()) { while(std::getline(ArchivoVertexShader, LineaCodigo)) CodigoVertexShader += "\n" + LineaCodigo; ZeroMemory(&LineaCodigo, sizeof(LineaCodigo)); while(std::getline(ArchivoFragmentShader, LineaCodigo)) CodigoFragmentShader += "\n" + LineaCodigo; } else { return 0; } const char *CodigoVertexShaderCHAR = CodigoVertexShader.c_str(); const char *CodigoFragmentShaderCHAR = CodigoFragmentShader.c_str(); glShaderSource(VertexShaderID, 1, &CodigoVertexShaderCHAR, NULL); glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &ResultadoCompilacion); glCompileShader(VertexShaderID); glShaderSource(FragmentShaderID, 1, &CodigoFragmentShaderCHAR, NULL); glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &ResultadoCompilacion); glCompileShader(FragmentShaderID); ProgramID = glCreateProgram(); glAttachShader(ProgramID, VertexShaderID); glAttachShader(ProgramID, FragmentShaderID); glLinkProgram(ProgramID); glGetProgramiv(ProgramID, GL_LINK_STATUS, &ResultadoCompilacion); glDeleteShader(VertexShaderID); glDeleteShader(FragmentShaderID); return ProgramID; } //... Definicion de otras funciones sin revelancia
Código C++:
Ver original
// main.VS (VertexShader) #version 330 core layout(location = 0) in vec3 vertexPosition_modelspace; void main(){ gl_Position.xyz = vertexPosition_modelspace; gl_Position.w = 1.0; }
Código C++:
Ver original
// main.FS (FragmentShader) #version 330 core out vec3 color; void main(){ color = vec3(1,0,0); }
GRACIAS POR SU ATENCIÓN Y ESPERO QUE ME PUEDAN AYUDAR...